阅读本文大概需要 2.4 分钟
XSS,即跨站脚本攻击漏洞。
Web 安全中,攻击者常利用此漏洞,在网页中注入 JS 攻击代码。
一旦受害者访问该网页,则 JS 代码执行,攻击者则能以此进行一系列攻击操作。
比如窃取用户 Cookie 信息,甚至可能取得受害者机器的完整控制权。
今天谈一下 3 种 XSS 类型。
以 DVWA 为例。首先将 DVWA 难度设置为 Low。
0x01 DOM 型 XSS
DOM 型 XSS 是由于浏览器 DOM 解析的漏洞所导致的。
值得一提的是,对于 DOM XSS,在网页源代码中是看不到 XSS Payload 的。只有在网页动态运行过程中,才会注入,通过 F 12 才可以看到。
打开 DVWA 中的 XSS (DOM)。
点击 Select,可以看到所选的内容出现在了地址栏。
打开 HackerBar,Load URL,将地址上的 English 替换为如下 Payload。
<script>alert(1)</script>
成功触发 XSS,且查看源代码,看不到这段 XSS Payload。因为这段代码是在网页动态运行过程中插入进去的。
其实就是源代码里的这一段代码干的。
<script>
if (document.location.href.indexOf("default=") >= 0) {
var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
document.write("<option value='' disabled='disabled'>----</option>");
}
document.write("<option value='English'>English</option>");
document.write("<option value='French'>French</option>");
document.write("<option value='Spanish'>Spanish</option>");
document.write("<option value='German'>German</option>");
</script>
直接将地址栏参数插入到了 DOM 中,从而造成了 XSS。
0x02 反射型 XSS
和 DOM 型 XSS 有些类似,不同的是,可以直接在网页源代码中看到 XSS Payload。
打开 DVWA 中的 XSS (Reflected)。
在输入框输入刚刚使用的 Payload,一样触发 XSS。
并且查看源代码,可以在源代码中看到 Payload。
服务端代码如下。
<?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>';
}
?>
可以看出是由于服务端直接将客户端提交的内容回显,导致的 XSS。
0x03 存储型 XSS
存储型 XSS 是 XSS 中危害最大的。因为它的 XSS Payload 将会存储在服务端,导致每个访问网页的用户都将被攻击。
打开 XSS (Stored)。
在 Name 和 Message,输入 Payload,没错还是刚刚那个。
出现一点小问题,Name 限制了长度。直接 F 12 修改 maxlength 即可。
提交,成功触发 XSS。查看源代码,可以看到刚刚提交的 Payload。
并且每次刷新页面或者重新进入,都会触发。
因为 Payload 被存储在了服务端。
每次访问,服务端又会将其查询出来,返回给客户端。
由此可见存储型 XSS 的危害性,每个用户每次访问,都将受到攻击。
0x04 总结
上面只是一些最简单的 XSS 例子,实际渗透过程中,往往会有各种过滤,各种防火墙,导致 XSS 攻击失败。
这个时候就需要知道各种绕过姿势,这需要我们不断地去深入学习。
加油!