受影响浏览器版本为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’];
?>
可以看到无法解析了。