关注这个靶场的其他相关笔记:XSS - LABS —— 靶场笔记合集
0x01:过关流程
0x0101:过关流程 01
进入关卡,鼠标右击页面,查看网页源码,搜索关键词 find a way out!
(页面的默认传参),寻找回显点:
继续使用上一关的 Payload 进行尝试,看看能不能直接过关:
" onmouseover="alert(1)
分析回显点,发现目标会将 on
替换为 o_n
,导致无法注入属性。
有拦截,不要怕,分析一下目标后端的过滤机制,经过笔者的测试,分析出其过滤机制如下:
Test Payload | Return Result | Analysis Result |
---|---|---|
on |
o_n |
过滤 on
|
On |
o_n |
无视大小写 |
<ScRIPT |
<scr_ipt |
过滤 <script
|
script |
script |
不过滤单独的 script
|
目标后端过滤了 on
和<script
,问题不大,我们还可以利用下面的图片,结合a
标签做个点击触发的 XSS。
我们在浏览器中经常会遇到可以点击跳转的图片,其 HTML 源码基本如下:
<a href="跳转的链接">
<img src="图片的来源链接">
</a>
靶场当前页面下就有一个图片,我们不妨,利用它,也整个点击的 XSS 攻击。经过测试 script
是未被过滤的,所以我们可以编写 XSS Payload 如下(javascript:
这种写法其实就是告诉浏览器,紧跟其后的内容应该被当作javascript
代码来执行):
"><a href="javascript:alert(1)
查看一下攻击成功后的页面源码,分为两个视图,一个是页面源码,一个是开发者工具中的视图:
0x0102:过关流程 02(不符合规则)
首先得申明一下,这个过关思路并不能过关,但是确实能触发 XSS 漏洞,所以写在这里。
这个是我在卡关时,到处搜索 XSS 绕过时发现的一个技巧,其 Payload 如下,我给他加工了一下,使其不那么明显:
"><iframe src=javascript:alert(1); width="0px" height="0px"></iframe><input hidden style="text
该攻击方法,是利用 iframe 框架,它会引用其他站点的内容到本站点(自动执行),我们将引用数据改成触发 XSS 攻击的内容即可,后面的修改 width 和 height,以及拼接 input 啥的,都是我为了让其不那么显眼而做的加工而已。(由上图可知,出发了弹窗,但是没有进入下一关)
这里我修改后端 PHP 代码,让后端为每个访问该页面的人添加一个 Cookie,修改 Level 5 的内容如下:
访问 Level 5 关卡,打开开发者工具,在控制台中看能否取出 cookie 内容:
可以看到,我们添加的 Cookie,能成功回显。这个时候把我们下面的 Payload 传递过去,看看能不能获取当前页面的 Cookie 值:
"><iframe src=javascript:alert(document.cookie); width="0px" height="0px"></iframe><input hidden style="text
如上,可以看到,成功完成了 XSS 攻击,还不需要用户参与。我个人是觉得更符合规则的,但是,其无法进入到下一关,所以是不符合关卡创作者的意图的。当个扩展吧。
0x02:源码分析
下面是 XSS Level 5 的后端代码,以及我对其的部分笔记(跟我们上面分析出来的是完全吻合的,俺也是第一次硬做的,并没有开上帝视角):
<!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 = "level6.php?keyword=break it out!";
}
</script>
<title>欢迎来到level5</title>
</head>
<body>
<h1 align=center>欢迎来到level5</h1>
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]); // 将 keyword 传递过来的值,全部变成小写,杜绝了你大小写绕过的可能
$str2 = str_replace("<script", "<scr_ipt", $str); // 将 <script 替换为 <scr_ipt
$str3 = str_replace("on", "o_n", $str2); // 将 on 替换为 o_n,防止 XSS 为元素添加属性的可能
echo "<h2 align=center>没有找到和" . htmlspecialchars($str) . "相关的结果.</h2>" . '<center>
<form action=level5.php method=GET>
<input name=keyword value="' . $str3 . '">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<center><img src=level5.png></center>
<?php
echo "<h3 align=center>payload的长度:" . strlen($str3) . "</h3>";
?>
</body>
</html>