关注这个靶场的其他相关笔记:XSS - LABS —— 靶场笔记合集-CSDN博客
0x01:过关流程
进入关卡,右击页面查看网页源码,搜索关键字well done!
,查看页面回显点:
可以发现,页面有隐藏的元素,我们想办法让其在页面显示。
回归靶场页面,右击,检查,打开开发者工具,定位到隐藏的标签位置,将 hidden
去掉即可:
删除后,页面会多三个框框,但是无法提交数据,简单,我们自己写一个提交按钮就可以了:
编辑完成后点击一下其他部分的代码,就可以退出了:
可以看到,下面就是修改后的页面,多了三个框框,和一个提交按钮:
这里不浪费时间了,直接点击提交按钮,查看发送出去的请求:
可以发现,点击提交后,我们给后端传递了三个参数,这三个参数的 key,正好对应隐藏字段的 name 值,所以,如果懂前端发送请求流程的化,上面修改代码让按钮显现啥的都不要做,直接在 URL 中拼接参数请求即可(我们每次请求都会刷新页面,而我们在当前页面编辑的 HTML 是不长久的,每次重新请求后就会覆盖我们修改的内容,所以上面的修改方法,只是为了来发现,后端以怎样的格式来接收前端的请求)。
我们给三个参数分别传值,看看哪个会回显回页面:
?t_link="NO1"&t_history="NO2"&t_sort="NO3"
既然 t_sort
的值会返回,那么其他参数就无用了,直接删除。而针对返回位置,我们尝试闭合 input
标签,并注入 XSS 代码:
?t_sort="><script>alert(1)</script>
可以发现页面有一些简单的过滤,下面整理一下页面的过滤规则:
Payload | Echo Print |
---|---|
< | 空 |
> | 空 |
" | " |
双引号没有被过滤,那就利用双引号逃逸出 value
值,然后因为标签是 hidden
的,这样会导致我们无法触发标签的事件监听,所以我们还需要覆盖掉标签的 hidden 属性,所以 Payload 如下:
?t_sort=" onmousemove="alert(1)" type="
0x02:源码分析
下面是 XSS LABS Level 10 的后端源码,以及我对其的部分笔记:
<!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 = "level11.php?keyword=good job!";
}
</script>
<title>欢迎来到level10</title>
</head>
<body>
<h1 align=center>欢迎来到level10</h1>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"]; // 接收以 GET 方式传递过来的 keyword 的内容
$str11 = $_GET["t_sort"]; // 接收以 GET 方式传递过来的 t_sort 的内容
$str22 = str_replace(">", "", $str11);
$str33 = str_replace("<", "", $str22);
echo "<h2 align=center>没有找到和" . htmlspecialchars($str) . "相关的结果.</h2>" . '<center>
<form id=search>
<input name="t_link" value="' . '" type="hidden">
<input name="t_history" value="' . '" type="hidden">
<input name="t_sort" value="' . $str33 . '" type="hidden">
</form>
</center>'; // 将 t_sort 传入的内容,过滤掉 <> 后,回显,导致了 XSS 漏洞(" 号未被过滤)
?>
<center><img src=level10.png></center>
<?php
echo "<h3 align=center>payload的长度:" . strlen($str) . "</h3>";
?>
</body>
</html>