1.LEVEL 1
审计源码:
注意这几行:
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
GET方式传送一个参数name ,然后直接拼接echo
所以给name直接传个最简单的xss弹窗即可:
2.LEVEL2 :搜索框bypass
看url猜想一下应该和上面一题类似,不过:
审计源码:
发现与level1相比,多了一个函数htmlspecialchars()。
查手册:
也就是<,>,双引号等这些都用不了,会被echo直接当实体输出。不能再用echo构造弹框了。
继续看源码:
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
可以看到,input标签里的value没过滤:
<input name=keyword value="'.$str.'">
类似闭合sql语句,直接给value传:"><scirpt>alert(1)</scirpt>
这样前面的“>闭合掉了input,且value为空。
即:<input name=keyword value=""><scirpt>alert(1)</scirpt>">
*:注意双引号是英文双引号。
**:其实也可以echo一些不用标签的xss语句。例如js的事件onclick()等。
3.LEVEL3
测试一下:
审计源码:
这回没空子钻了,input里面也被过滤了。老老实实过这个函数把。
上面提到了,js事件:
看一下代码:
<input name=keyword value='".htmlspecialchars($str)."'>
思路类似:先单引号闭合value,然后我们用个js事件来构造xss,这里以鼠标点击事件onclick()为例子:
payload: ' οnclick='alert(1)
注意οnclick=后面的单引号,这样构造的html语句才完整
<input name=keyword value='' οnclick='alert(1)'>
传参后,点击一下搜索框,通过:
4.LEVEL 4
审计源码: