一个上传docx文件形成存储型XSS漏洞的实例!
优采云 发布时间: 2021-07-04 21:24
一个上传docx文件形成存储型XSS漏洞的实例!
在渗透测试中,每当看到目标测试网站的上传功能时,总会引起我的好奇心。运气好的话,如果目标网站服务器是PHP或ASP架构,且上传功能没有后缀,会导致直接上传反弹脚本来控制。如果这个技巧不起作用,我将尝试上传一个 HTML 页面来触发我自己设置的客户端 javascript 脚本以形成 XSS 攻击。在本文中,我将分享一个通过上传 docx 文件创建的存储型 XSS 漏洞示例。
测试上传功能
在某网站测试工作中,我发现在目标网站上传功能中,未经授权的用户可以上传自己的文件。此上传功能允许用户上传 .docx 文件:
这种.docx文件上传后,还是可以下载的。通过对比发现,成功上传的文件uploaded.docx与服务器上对应的可下载文件downloaded.docx存在一定的差异。也就是说,文件上传成功后,服务器会先上传文件再下载。执行一些处理操作,然后提供下载。
用于上传的文件必须是有效的 .docx 文件。根据浏览器的分析和显示,它可以将其转换为html格式进行显示。我可以更改其后缀吗? 所以我先试着把POST请求中的.docx后缀改成.html看看:
上传这个 .html 文件后,从服务器请求这个文件后,服务器会将其 Content-Type 标头默认为 text/html。在这种情况下,浏览器会将此文件解析为 HTML 执行:
插入 XSS 有效载荷
这样一来,我就想到了把XSS Payload打包成如下图这样的.docx压缩文件。由于这是一个压缩文件包的示例,其中.docx的后缀直接更改为.zip,因此我需要确定某些在上传或网页解析过程中不会转储和更改的区域。最后发现这种docx zip压缩格式包中的一些文件路径会保持不变,如下图,我在Settings.xml文件名后面加了一长串字母来区分。
之后,将zip格式后缀恢复为docx格式,使用UItraEdit查看hex代码,然后覆盖同一区域的一些字节,插入我自己设置的JavaScript XSS代码:
上传时,服务器可以正常接收构建的.docx文件。在 HTTP POST 过程中,我将其后缀更改为 .html 以进行最终上传:
当从服务器请求这个文件时,它可以被服务器解析成一个HTML文件,其中收录之前插入的完整XSS Payload代码:
当然,浏览器解析后,也可以成功执行插入其中的XSS Payload:
为了隐藏这种XSS攻击,攻击者可以添加一个收录URI统一资源标识符的隐藏iframe框架,可以迷惑受害者,如下图:
保护措施
开发者应通过以下措施限制此类影响。
上传文件前,请在服务器端验证上传文件的格式是否为有效的.doc或.docx格式;
严格限制Content-Type头,上传的文件改变了Content-Type头或特定的后缀格式,必须保持与上传文件相同的Content-Type头信息;
为了控制文件下载过程中的其他操作,添加响应头:“Content-Disposition:attachment”,防止嵌入的文件在浏览器中显示;
过滤掉所有收录 HTML 标签的上传,因为 docx 可以压缩和篡改其中收录的 HTML 文件。
*参考来源:coalfire,FreeBuf编辑云编译,转载请注明来自FreeBuf.COM