utf7 XSS攻击

作者:ManfredHu
链接:http://www.manfredhu.com/2018/12/30/41-utf7-xss/index.html
声明:版权所有,转载请保留本段信息,谢谢大家

我们知道XSS攻击,但是不知道大家知道utf7攻击不?

这个漏洞的是这样的。

ie的UTF-7 XSS漏洞原理演示

IE浏览器在解析网页时,会首先检查头几个字节是fffe还是+/v*。

  • 如果是fffe,编码转换为unicode
  • 如果是+/v*,编码转化为UTF-7

因此若网页文件的头几个字节为+/v(为 ’8’, ’9’, ’/’, ’+’等特殊字符),IE会将之后的内容按UTF-7编码来解析。若后面的内容为恶意js代码并采用UTF7格式编码,则可以绕过相关CGI的安全检测,导致执行JS代码。

测试代码

1
+/v8 +ADw-script+AD4-alert('iron man')+ADsAPA-/script+AD4-

大家可以复制到一个html文件,然后应该会看到下图这样的。
utf7 xss IE截图

payload

XSS攻击的攻击源,就是恶意代码部分我们称为payload。上面的是浏览器的解析原理部分。
但是一般我们的XSS攻击防范方法就是在传到后台的时候对一些字符进行过滤,如<script>之类的标签,但是如果用户输入的不是<script>。而是+ADw-script+AD4- alert()+ADw-/script+AD4-这么一串东西,普通XSS过滤是无效的。

那么就会被存入数据库,如果这个串被传输给用户或者其他用户。页面加载来自用户的输入的+ADw-script+AD4- alert()+ADw-/script+AD4-时,它将把它解释为<script>alert()</script>,因为有的浏览器使用UTF-7编码。

可喜的是很多现代不支持utf-7了。2011年开始,Firefox从5版开始就不支持UTF-7。Chrome在2009年停止支持它(如果你忽视了一个错误 - 否则就是2013年)。有趣的是,只有一个现代浏览器支持UTF-7 - Internet Explorer 11

防范措施(node接入层)

对请求强制进行utf8编码声明。应该达成一个共识,前端通用编码方式都是utf8,不管是后台回传node的数据还是node到前端页面的数据,统一强制都用utf8编码。

1
2
request.setHeader('Content-Type', 'text/html; charset=utf-8');
response.setHeader('Content-Type', 'text/html; charset=utf-8');

Copyright © 2015 - 2019 ManfredHu胡文峰的个人博客

All rights reserved. Designed and powered by ManfredHu.

粤ICP备18133029号