另類SRC文件上傳漏洞挖掘思路
文檔上傳引發的XXE漏洞(下圖來自于 getshell1993)

0x00 背景
前兩天在realworld挖到一個docx的xxe漏洞,昨天朋友和我說國外某CTF也出現其中考點了,所以我把docx格式的xxe來簡單總結下
0x01前置知識
首先是關于docx這種格式 在微軟2007之后 在傳統的文件名都添加了x 比如pptx xlsx,還有我們本文提到的docx 他的優點是占用空間會比doc文件占有的少,并且他的本質其實是個xml文件
當你拿到一個docx文件時 使用本機自帶的unzip命令進行解壓

會得到如下的xml文件 因為docx文件的主要內容是保存為xml的 他是保存在一個壓縮包 然后取擴展名為zip 這里面主要存儲信息的地方在于word文件夾下的document.xml
內容大致如下

我們發現在word輸入的內容在
&xxe;
這個標簽內 解析xml實體的位置也是如此
0x02 lets xxe 1
第一個位點就是我們剛才提到的地方
我們只需要做的是在xml聲明處添加如下第一行代碼 在第二行標簽進行修改
]> &test;
然后將文件重新壓縮 修改為.docx 然后找到上傳點上傳就可以

但做好的即使用微軟官方的word并不能打開 發現只有用Libreoffice時候能解析
當然這個在ctf題中也有案例 感興趣的師傅可以翻閱HackPack 2021 Indead v2 用一模一樣的方法就可以
0x02 xxe 2
第一種方法被廣流傳之后 很多都進行了相對的修改 當然最暴力的方法就是直接禁止實體解析,當然也有做的相對柔和一點就是在document.xml里面檢測了關鍵字 很顯然這種方法并不全面 那我們需要探索的就是是否有別的位點
我注意到在線瀏覽或者轉換pdf的地方還有一個回顯點 就是頁碼

經過簡單翻找可以看到

在docProps/app.xml標簽里面
在pages這里面加入xxe語句即可
0x03 ole to readfile
然后就是出自前幾天比賽學習的一種新手法 這種手法只適用于Libreoffice 并且在實戰場景是有利用空間的 很多在線網站word轉pdf用的都是libreoffice

這道題的設計背景就是 試了xxe發現不行 然后就各種搜索資料 發現word文檔是可以以文件的方式嵌入和鏈接OLE對象 OLE就是一種面向對象技術 利用這種方式就可以把文件 聲音 圖像表格 應用程序組合在一起
選擇插入 OLE Object

然后在這里選擇Link to file

可以看到這里面可以成功讀取

然后我們保存 這里面要注意一個坑不能直接保存為docx格式 要先保存為odt格式 我們再手動修改擴展名
這時候以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
0x04 docx壓縮包的其他考點
回過頭來我們想當他本質是個壓縮包的話 php有豐富的偽協議 zip 如果我們在php網站有這種上傳docx的地方 也可以考慮 把php一句話寫入 然后用zip://把它解壓出來

后來發現早有師傅想到這個點了
0x05 拓展閱讀
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/