关注这个靶场的其他相关笔记:XSS - LABS —— 靶场笔记合集-CSDN博客
0x01:过关流程
进入靶场,右击页面,查看网页源码,搜索关键词 test
查看页面回显点:
页面只有一个回显点,跟前面关卡不同,回显点没有以属性的形式出现在标签内部,而是出现在了标签外部,像这种位置,想要触发 XSS 攻击,似乎只能依靠构造新的标签来触发了(最好的情况就是 <script>
标签未被过滤)。
不清楚目标后端是否做了过滤,就整个 Payload 大杂烩,看看目标后端都过滤了哪些内容:
<sCrIpt>alert(1)</sCrIpt><a hRef="javaScript:alert(1)" onmouseover="alert(2)" onOnmouseover="alert(3)">test</a>
下面梳理一下目标后端的过滤规则:
Payload | Echo Print |
---|---|
< | < |
> | > |
script | ,且忽略大小写 |
空格 | |
" | " |
看来目标主要就是把标签之间的空格替换为了
,并没有拦着我们构造标签,说到底,就是要绕过空格。首先传入一个基础的 Payload 看看效果:
<input type="text" onmouseover="alert(1)">
那么我们下面就是去找,什么符号能够替代空格,来让标签依旧生效。而这个符号嘞,不一定是可见的。
测试方法也很简单,但是需要用到 BurpSuite(这款工具,在安全圈里非常出名,可以说是人手一个,教程我后续也会出哦,这里直接讲用法)。
首先,打开 BurpSuite,并打开 BurpSuite 中自带的浏览器:
使用 BurpSuite 自带的浏览器访问 XSS LABS Level 16 靶场,找到请求包,并发送到请求包模块:
http://127.0.0.1/xss-labs/level16.php?keyword=%3Cinput+type=%22text%22+onmouseover=%22alert(1)%22%3E
下面定位到 Intruder 模块,并且修改请求包的内容,我们要把 +
号变成 %xx
的形式:
然后进入 Payload 中,按照如下格式进行配置,并开始攻击:
这个时候 BurpSuite 会弹出一个框框,告诉你攻击的结果,我们可以查看每个攻击返回的内容,找到能成功显示 input
标签的即可,如下图:
这种能替换空格的标签还不少,作者这里根据本次攻击结果列举一下(有心者可以做成字典哦):
能成功显示的:%0a、%0c、%0d
不太稳定的:%3e
那么本关的过关 Payload 如下:
<input%0atype="text"%0aonmouseover="alert(1)">
0x02:源码分析
下面是 XSS LABS Level 16 的后端源码,以及我对其的部分笔记:
<!DOCTYPE html><!--STATUS OK-->
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
// 修改 alert 默认行为,进入下一关
window.alert = function() {
confirm("完成的不错!");
window.location.href = "level17.php?arg01=a&arg02=b";
}
</script>
<title>欢迎来到level16</title>
</head>
<body>
<h1 align=center>欢迎来到level16</h1>
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]); // 接收通过 GET 方式传入的 keyword
$str2 = str_replace("script", " ", $str); // 将 script 替换为
// 下面都是一些常见的过滤形式,没啥。
$str3 = str_replace(" ", " ", $str2);
$str4 = str_replace("/", " ", $str3);
$str5 = str_replace(" ", " ", $str4);
echo "<center>" . $str5 . "</center>"; // 忽略了,有一些不可显示的字符也可以用作空格,进行绕过
?>
<center><img src=level16.png></center>
<?php
echo "<h3 align=center>payload的长度:" . strlen($str5) . "</h3>";
?>
</body>
</html>