DVWA XSS (Reflected) 反射型跨站脚本 – 作者:wakemeup

DVWA XSS (Reflected) 反射型跨站脚本

XSS 漏洞:

全称Cross Site Scripting,跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

xss分类:

反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

存储型XSS:<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。

DOM型XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。

low:

查看源码:

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?>

源码分析:
对name 的 传 参 没 有 做 任 何 的 过 滤 , 只 是 检 测 了 name的传参没有做任何的过滤,只是检测了name的传参没有做任何的过滤,只是检测了name存在且不为空就直接输出在网页中

image.png

Medium:

查看源码:

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

?>

源码分析:
过滤了script标签,使用str_replace函数将输入中的script替换为空。可以使用事件类型标签绕过

大小写绕过:
双写方式绕过str_replace()函数:
<scr
使用非script标签的xss payload:
img标签:
<img src=1 onerror=alert(‘xss’)>
image.png

High:

查看源码:

?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

?> 

源码分析:
preg_replace() 函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效,但依旧可以使用事件类型标签

<img src=1 onerror=alert(‘xss’)>
image.png

Impossible:

查看源码:

<?php

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $name = htmlspecialchars( $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

源码分析:
PHP htmlspecialchars()函数
把预定义的字符转换为HTML实体:
& (和号)成为 &
” (双引号)成为 “
‘ (单引号)成为 ‘//生效需要加ENT_QUOTES参数
< (小于)成为 <

(大于)成为 >
可以看到,Impossible Security Level的代码使用htmlspecialchars函数把预定义的字符:& ” ‘ < >转换为HTML实体,防止浏览器将其作为HTML元素。

防护总结:

转义字符输出

白名单验证

HTML实体化

来源:freebuf.com 2021-06-28 14:17:19 by: wakemeup

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论