以前一个机缘巧合,写过《利用data:进行XSS测试》,当时发现可以利用"data:"来xss许多把"javascript:"关键字进行了过滤的页面。

今晚又一个机缘巧合,重新接触到了data uri scheme,做了一些测试。这些测试都是基于Chrome和FireFox进行的。IE对data uri scheme

有严格的限制,没啥搞头的。

HTML中支持标签属性内嵌入data uri scheme的有:object   iframe   anchor  img 等。(欢迎大家补充)但是img的src属性赋值为data:形式是不允许执行js的,但可载入远程图片,如wikipedia中举例:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABG

dBTUEAALGPC/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IAAAA

ddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1JREFUGNO9zL0NglAAxPEfdLT

s4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jqch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6M

Jpcq2MLaI97CER3N0vr4MkhoXe0rZigAAAABJRU5ErkJggg==" alt="Red dot"/>

而object的data属性及iframe的src属性均可用于执行js:

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></iframe>

 

XSS with Data URI Scheme

其实这些都是跟javascript类似的,不赘述。在这个基础上考虑利用的话,可以利用data来bypass一些过滤了javascript的网站。

重点来了,在渲染data:的时候,chrome和firefox采用了不同的处理方式

chrome认为data:是属于空白域的,而firefox认为data:是属于来源域的。

<a href="data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+">test<a>

XSS with Data URI Scheme

XSS with Data URI Scheme

这就带来一个很有意思的问题了:也就是说,ff让data:所在域继承了他的来源域,导致了xss的隐患,给xss提供了机会。

考古发现,早在2004年就有人给firefox上报过这个问题,并在以后的许多年有许多人report过这个问题,但是firefox始终未进行修补。

百度空间发表文章处,对超链接<a>标签的href属性过滤了javascript关键字,但是并没有考虑到data uri scheme,利用这个特性,我们就可

以搞出一个click xss来了。

d4rkwind说,他之前就是测试data uri scheme的时候副产出了mhtml的跨域问题来的。哈,有意思。

如何更深层次地在利用data:及如何把data uri scheme放到css中去xss,欢迎大家讨论

update: 通过虚虚的留言,发现“跨域”这个描述确实不对。我想Y了,已更改。灰常感谢kxlzx指正!