文档上传引发的XXE漏洞(下图来自于 getshell1993)
具体原理
原文:浅谈一种特殊格式的xxe
作者:你回来吗
原文地址:https://xz.aliyun.com/t/11203
前两天在realworld挖到一个docx的xxe漏洞,昨天朋友和我说国外某CTF也出现其中考点了,所以我把docx格式的xxe来简单总结下
首先是关于docx这种格式 在微软2007之后 在传统的文件名都添加了x 比如pptx xlsx,还有我们本文提到的docx 他的优点是占用空间会比doc文件占有的少,并且他的本质其实是个xml文件
当你拿到一个docx文件时 使用本机自带的unzip命令进行解压
会得到如下的xml文件 因为docx文件的主要内容是保存为xml的 他是保存在一个压缩包 然后
内容大致如下
我们发现在word输入的内容在
<w:t>&xxe;</w:t>
这个标签内 解析xml实体的位置也是如此
第一个
我们只需要做的是在xml声明处添加如下第一行代码 在第二行标签进行修改
<!DOCTYPE test [<!ENTITY test SYSTEM 'file:///etc/passwd'>]>
<w:t>&test;</w:t>
然后将文件重新压缩 修改为.docx 然后找到
但做好的即使用微软官方的word并不能打开 发现只有用Libreoffice时候能解析
当然这个在ctf题中也有案例 感兴趣的师傅可以翻阅HackPack 2021 Indead v2 用一模一样的方法就可以
第一种方法被广
我注意到在线浏览或者转换pdf的地方还有一个
经过简单翻找可以看到
在docProps/app.xml标签里面
在pages这里面加入xxe语句即可
然后就是出自前几天比赛学习的一种新手法 这种手法只适用于Libreoffice 并且在实战场景是有利用空间的 很多在线网站word转pdf用的都是libreoffice
这道题的设计背景就是 试了xxe发现不行 然后就各种搜索资料 发现word文档是可以以文件的方式嵌入和链接OLE对象 OLE就是一种面向对象技术 利用这种方式就可以把文件 声音 图像表格 应用程序组合在一起
选择插入 OLE Object
然后在这里选择Link to file
可以看到这里面可以成功读取
然后我们保存 这里面要注意一个
这时候以zip格式打开就可以看到
格式大概是这样 我们打开content.xml
可以看到 在xlink: href 这里面连接到/etc/passwd 那你也能想到我们可以把他修改/flag上传
这时候我们发现是可行的 但是这种方法读取的行数是有限的 读不到完整flag
解决方法也很简单 我们自己写个文本框来解析 代码如下
<text:section text:name="string"><text:section-source xlink:href="../../../../../../flag" xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/></text:section>
可以看到能过成功解析 读取flag
回过头来我们想当他本质是个压缩包的话 php有丰富的伪协议 zip 如果我们在php网站有这种上传docx的地方 也可以考虑 把php一句话写入 然后用zip://把它解压出来
后来发现早有师傅想到这个点了
http://www.securityidiots.com/Web-Pentest/XXE/XXE-Cheat-Sheet-by-SecurityIdiots.htm
lhttps://doddsecurity.com/312/xml-external-entity-injection-xxe-in-opencats-applicant-tracking-system/
侵权请私聊公众号删文
热文推荐
欢迎关注LemonSec
觉得不错点个“赞”、“在看”