【XSS】UTF-7 XSS

受影响浏览器版本为IE6,影响范围较小。

如果在Content-Type中没有设置charset,如下:

Content-Type:text/html

在meta标签中也没有设置字符集

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

就可以通过字符集抢占的方式使浏览器以UTF-7解析。

<script>alert(1)</script>UTF-7编码为+ADw-script+AD4-alert(1)+ADw-/script+AD4-

但是还需要注意的是BOM头

utf-7 bom 目前知道的有4个,如下:

+/v8 | +/v9 | +/v+ | +/v/

可以通过设置BOM头修改编码,并且BOM头的优先级是最高的,只要能控制目标网页的开头是UTF-7 BOM头,即便你已经配置了

Content-Type:text/html; charset=utf-8

后续的内容仍可以以UTF-7方式编码。

从实际场景出发能控制网页开头就是Json callback。

修复建议:

1)配置默认编码,例如httpd.conf中

AddDefaultCharset UTF-8

2)针对Bom头,可以在返回网页内容最前面添加一个空格。针对Jsonp的话可以直接将Content-Type设置为application/json

测试代码:

<?php

echo $_GET[‘code’];

?>

IE6访问:http://192.168.192.120/utf7.php?code=%2B%2Fv9+%2BADw-script%2BAD4-alert%281%29%2BADw-%2Fscript%2BAD4-

修改代码添加一个空格:

<?php

echo ” “.$_GET[‘code’];

?>

可以看到无法解析了。