1、简单的字符过滤,可以通过双写绕过,但是稍微改写一下preg_replace()里的参数,就可以轻松让双写绕过变得不可能;
2、以下为实际场景实验,打开靶机页面:
3、我们看一下过滤代码,这里使用了更严格的规则——通过正则表达式,过滤了script标签:
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
4、在What's your name? 输入框内输入:
5、提交后,浏览器没有弹出我们预期的弹窗,显示alert内容,相反直接把清洗后的内容“'>>”作为name显示了出来,说明简单的双写绕过手段此时已经无效:
6、下面试一下标签事件绕过方法,在What's your name? 输入框内输入:
(哪有什么地址叫hahaha,onError铁定被触发)
7、提交后,浏览器弹出我们预期的弹窗,显示alert内容:“img标签事件绕过”:
8、在What's your name? 输入框内输入
9、提交后,浏览器没有弹出我们预期的弹窗,有没有搞错,:(;
10、点一下屏幕试试,:)(说好不超过10步,就到这里)。