从黑产的角度看文件上传安全之svg文件

in 一些研究 with 0 comment

简介

过去很多现象表明,某些黑客会通过任意html文件上传,插入例如葡京365,澳门xxx等的大字报式广告和跳转页面,从而污染搜索引擎,这使得一些站长的站无辜变为黑产的广告工具。因此在过往的安全服务中,也经常以“可构造储存型XSS,篡改页面”来定义任意html文件上传的问题。
但其实并非只有html文件上传可以造成这个现象。其实,在上传文件黑名单中额外添加“htm,html,shtml,xhtml,mhtml”等家族文件,往往是不够的。
此文讲述构造svg文件上传,造成同html一样的效果。

svg文件执行js测试

首先在svg中执行js非常简单,只需要利用foreignObject标签导入script标签即可,示例:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
    <circle cx="100" cy="50" r="40" fill="red"/>
<foreignObject>
    <script>
        alert(document.domain);
    </script>
</foreignObject>
</svg>

执行alert
此时,就可以通过ajax,将同域的cookie偷出去,造成储存型XSS

svg上传广告页面

在了解了一些广告页面的常见手段后,发现一般的黑产会利用:

document.open('text/html','')

来替换当前的页面,从而插入一个广告的document,我们来试试这个方法:
console报错
很明显,svg由于其文件特殊性,无法使用HTML document的一些方法,同样的 document.write 也会爆出相同的错误:

Uncaught DOMException: Failed to execute 'write' on 'Document': Only HTML documents support write().
    at <anonymous>:1:10

难道没有办法使svg页面也挂上广告了吗?在这个问题上我想首先需要替换document的类型。
查询了一波google并无解,后来想到一个小tricks,强制替换document类型:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
    <circle cx="100" cy="50" r="40" fill="red"/>
<foreignObject>
    <script>
location.href="javascript:'%3cscript%3edocument.write(1)%3c\/script%3e'"
    </script>
</foreignObject>
</svg>

通过javascript:''的方式,执行并强制转换了文档的类型,从而可以执行document.write,document.open等操作了
执行document.write

总结

其实在文件上传方面,如果仅仅是使用黑名单,过滤html文件家族,或许还不够,只要能解析,上传svg,甚至是上传xml,都能造成XSS或页面替换,都可以造成危害,或许大家重视程度还不够,安全服务经验之谈,还是用白名单吧,一劳永逸..

Responses

captcha |