利用字符编码:
百度曾经出过一个XSS漏洞,在一个<script>标签中输出一个变量,其中转义了双引号:
var redirectUrl="\";alert(/XSS/);";
一般来说这里是没有XSS漏洞的,因为变量位于双引号内,系统转义了双引号。但是百度的返回页面是GBK/GB2312编码的,因此"%c1\"这两个字符被组合在一起会成为一个Unicode字符,在Firefox下会认为这是一个字符,所以构造:
%c1";alert(/XSS/);//
" %c1 "把转义字符" \ "吃掉了,从而绕过检查实施XSS攻击。
绕过长度限制:
最好的办法是把XSS Payload写到别处,再通过简短的代码加载这段XSS Payload。
最常用的一个藏代码的地方,就是”location.hash“。根据HTTP协议,location.hash的内容不会在HTTP包中发送,所以服务器端的Web日志不会记录下location.hash里的内容,从而更好地隐藏攻击者意图。
可通过注释符绕过长度限制,把两个文本框之间的代码注释掉,打通两个<input>标签。
使用<base>标签:
<base>标签将指定其后的默认标签从"http://www.google.com"取URL:
<body>
<base href="http://www.google.com" />
<img src="/intl/en_All/images/srpr/logolw.png" />
</body>
需要注意的是,<base>可以出现在页面任何地方,并作用于该标签之后的所有标签。如果攻击者在页面中插入了<base>标签,就可以通过在远程服务器上伪造图片,链接或脚本,劫持当前页面中所有使用”相对路径“的标签。
所以在设计XSS安全方案时,一定要过滤掉这个非常危险的标签。