【简介】跨站脚本(Cross-site scripting,简称:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。从而使目标计算机收到危害。
存储型XSS
存储型XSS攻击是指注入的脚本永久存储在目标服务器上的攻击,例如在数据库、消息论坛、访问者日志、注释字段等中。受害者在请求存储时从服务器检索恶意脚本、信息。存储型XSS有时也称为持久性或Ⅰ型 XSS。
安全等级 - Low
将DVWA的安全等级切换到Low。
① 选择【XSS (Stored)】,在Name和Message输入内容,点击【Sign Buestbook】,下面会显示刚才输入的内容。点击【View Source】,查看数据库源代码。
② 分析源码,可以看到有使用三个函数: trim() 函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括\0、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符;stripslashes() 函数删除字符串中的反斜杠;mysql_real_escape_string() 函数会对字符串中的特殊符号(\x00,\n,\r,\,',",\x1a)进行转义。
可以看到,对输入并没有做XSS方面的过滤与检查,且存储在数据库中,因此这里存在明显的存储型XSS漏洞。
③ Name字段输入Test,Message字段输入 <script>alert(123456)</script> ,点击【Sign Guestbook】。
④ 可以看到有弹出视窗,显示指定的内容。
安全等级 - Medium
将安全等级升级为中级。
① 分析源码,可以看到有使用 strip_tags() 函数剥去字符串中的HTML、XML以及PHP的标签,但允许使用<b>标签; addslashes() 函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。
可以看到,由于对 message 参数使用了 htmlspecialchars() 函数进行编码,因此无法再通过 message 参数注入XSS代码,但是对于name参数,只是简单过滤了<script>字符串,仍然存在存储型的XSS。
② Name字段的输入长度限制为最多十个字符。
③ Burpsuite抓包,改为 <script>alert(123456)</script>,点击【Forward】。
④ 一样会显示弹出框。
还可以修改为
双写绕过: <sc<script>ript>alert(123456)</script>
大小写混淆绕过 <ScRipt>alert(123456);</ScRipt>
使用非 script 标签:<img src=1 οnerrοr=alert(123456)>
以上抓包修改数据Forward后,均能成功弹窗。
通常有一些方式可以测试网站是否有正确处理特殊字符:
><script>alert(document.cookie)</script>
='><script>alert(document.cookie)</script>
"><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert (vulnerable)</script>
%3Cscript%3Ealert('XSS')%3C/script%3E
<script>alert('XSS')</script>
<img src="javascript:alert('XSS')">
<img src="http://xxx.com/yyy.png" οnerrοr="alert('XSS')">
安全等级 - High
将安全等级升级为高级。
① 分析源码,可以看到这里使用正则表达式过滤了<script>标签,但是却忽略了img、iframe等其它危险的标签,因此name参数依旧存在存储型XSS。
② Burpsuite抓包,改为 <img src=1 οnerrοr=alert(12456)>,点击【Forward】。
③ 依然会显示弹出框。
安全等级 - Impossible
将安全等级升级为不可能。
① 分析源码,可以看到,由于对 message 和 name 参数都使用了 htmlspecialchars() 函数进行编码,因此无法再通过 message 和 name 参数注入XSS代码。
FortiWeb 防护
FortiWeb可以阻止这一类的攻击。
① 这次我们访问192.168.1.128,也就是经过FortiWeb保护的DVWA,安全选择Low,输入一段注入代码,看看会发生什么。
② 访问被FortiWeb成功的阻止了。
③ 登录FortiWeb,选择菜单【日志和报表】-【攻击】,点击【添加过滤器】。
④ 选择【消息ID】。
⑤ 选择阻止页面上显示的消息ID。
⑥ 显示XSS攻击被FortiWeb阻止了。如果有了FortiWeb,这样大部分因为代码产生的漏洞安全问题,就可以有效的解决了。