关注这个靶场的其他相关笔记:XSS - LABS —— 靶场笔记合集
0x01:过关流程
进入靶场,有一个搜索框,老样子,随便输入点东西,查看页面的回显点:
继承 Level 2 的思路,右击页面查看源码,然后 ctrl + f
,搜索 123(就是我们刚刚提交的数据):
可以看到,有两处回显点,我们选择针对下面那处配置 Payload,我们尝试闭合掉 input
标签:
'><script>alert(1)</script>
可以看到,想法有点天真,input
标签也被过滤了,不过也有收获,它并没有过滤'
,导致后面的内容其实逃逸出来了,我们改变思路,能不能给input
标签添加一些属性,来触发 XSS 漏洞。
那么我这里的想法是,给 input
标签增加一个监听事件,当用户鼠标划过该标签时触发 XSS,对应 Payload 如下,可以看到,成功过关:
' onmousemove='alert(1)
我们看一下,经过我们 XSS 攻击后页面实际的源码:
本关的不足之处就是还需要用户的协助触发,作者在这里也是想弄一个 0 点击就能触发的事件的,不过菜菜的,没有找到相应的属性(onload
属性在这里无效),对于这些属性的学习,这里提供两个网站 W3Cschool 和 文心一言(其他 AI 也行),下面是他们在本关中为我提供的支持:
0x02:源码分析
下面是 XSS LABS Level 3 的后端源码,以及笔者做的一些笔记:
<!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 = "level4.php?keyword=try harder!";
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和" . htmlspecialchars($str) . "相关的结果.</h2>" . "<center>
<form action=level3.php method=GET>
<input name=keyword value='" . htmlspecialchars($str) . "'>
<input type=submit name=submit value=搜索 />
</form>
</center>"; // 相较于 Level 2,它两处都做了过滤,但是, htmlspecialchars 并不会把 ' 也过滤掉,导致出现了 XSS 漏洞
?>
<center><img src=level3.png></center>
<?php
echo "<h3 align=center>payload的长度:" . strlen($str) . "</h3>";
?>
</body>
</html>
可以看到,目标主要还是用的 htmlspecialchars()
来对回显内容进行过滤,这里笔者偶然间发现了一个问题,此次过关流程是建立在 PHP 5.3.29 版本之上的,切换高版本后,'
号也会被过滤:
也就是说,如果你的靶场运行在 PHP 8.2.10 版本中,上面的攻击方法是无效的。
后面笔者又搜索了 htmlspecialchars()
的简介,发现其可以设置一个标志位来指定过滤的方法:
所以如果将 level 3 中的 htmlspecialchars($str)
替换为,htmlspecialchars($str, ENT_QUOTES)
,上面的攻击参数就无效了: