简介
过去很多现象表明,某些黑客会通过任意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>
此时,就可以通过ajax,将同域的cookie偷出去,造成储存型XSS
svg上传广告页面
在了解了一些广告页面的常见手段后,发现一般的黑产会利用:
document.open('text/html','')
来替换当前的页面,从而插入一个广告的document,我们来试试这个方法:
很明显,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等操作了
总结
其实在文件上传方面,如果仅仅是使用黑名单,过滤html文件家族,或许还不够,只要能解析,上传svg,甚至是上传xml,都能造成XSS或页面替换,都可以造成危害,或许大家重视程度还不够,安全服务经验之谈,还是用白名单吧,一劳永逸..
本文由 owner 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Oct 14, 2019 at 07:03 pm