第一关:没有使用过滤器
从代码中可以看出,它是将用户以GET的方式提交的参数直接输出,所以用任何方法都可以通过
方法:<a href="javascript:alert(1)">aaaaaa</a>
第二关:闭合标签
从代码中可以看出,它将我们输入的值给了value,然后它再传给了一个htmlspecialchars函数,这个函数是把预定义的字符转换为 HTML 实体,说明把<script>标签吃掉了,可以通过闭合标签,使得<input name=keyword value="'.$str.'">这一句就闭合掉
方法:1" onclick="alert(1)
第三关:单引号闭合
看了看源码,发现这里不但对"号做了限制,而这在value这里也加了htmlspecialchars函数,虽然对了双引号做了限制,但是单引号还是可行的,这种情况我们可以通过事件标签触发表单执行。
方法:aaaa' onclick='alert(1)
第四关:双引号闭合
直接可以看出,它是把<>过滤掉了,所以很简单,不用<>就行了
方法:a "onclick="alert(1)
它对<script和on的都做了过滤,而且还使用strtolower函数对所有字符串变成小写,单引号也不可用了,但我们还是可以闭合语句,通过双引号加>闭合,但是闭合也不完全行,我们这时候可以使用javascript伪协议以及标签进行注入。
方法:a"><a href="javascript:alert(1)">aaaa</a>
可以看出它对<script on src data href 进行过滤,但是没对大写字母过滤
方法:aa" onclick="alert(1)
这里可以看出它把特殊语义的字符串修改成了空字符串,所以我们可以用重写的方法
方法:aa" oonnclick="alert(1)
难度一次一次升级,我们这里直接把字符编码转换为HTML的实体编码
方法:javascript:alert(1)
这里多了一个strpos函数,这个函数是用来查找指定文本在字符串中第一次出现的位置,这时候我们就不得不在代码里加入http://,但是并没有过滤HTML实体编码,所以我们还是使用编码绕过
方法:javascript:alert(1)//http://www.baidu.com
这里由于没有文本框,需要在浏览器后台的<input name="t_sort" value="'.$str33.'" type="hidden">这行的type值改成text
然后这里只是过滤掉了<>,可以使用触发事件标签
方法:t_sort="type="text" onm ouseover="alert(1)