Vulnhub XXE靶機復現
- 2020 年 3 月 8 日
- 筆記
文章源自【位元組脈搏社區】-位元組脈搏實驗室
作者-purplet
靶機下載鏈接:https://download.vulnhub.com/xxe/XXE.zip

1.檢查網路模式配置是否正確
我們這裡的VMnet8 是NAT模式啊(打開虛擬網路編輯器:虛擬機的左上角 編輯 –->網路虛擬編輯器)接下來切換到kali linux即可開啟愉快的練習了。

2.資訊收集
首先掃描C段存活主機,找到目標機器,使用命令nmap 192.168.194.0/24


紅框區域即為目標主機IP,同時發現只開放了80埠,接著使用nmap -A 192.168.194.188探查詳細資訊


再使用dirb http://192.168.194.188對目錄進行爆破,或者使用dirsearch等其他目錄掃描工具,結果如下圖所示。


綜上:我們得知該網站存在80埠,robots.txt和xxe目錄。

3.滲透測試:
(1)訪問http://192.168.194.188/robots.txt


(2)訪問http://192.168.194.188/xxe,是一個登陸頁面


(3)輸入內容抓包測試,可以看到用戶名和密碼是通過xml傳遞給後端的。


(4)嘗試測試是否存在xxe漏洞

payload:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY admin SYSTEM "file:///etc/passwd"> ]> <root><name>&admin;</name><password>1</password></root>
得到內容回顯,再次嘗試使用php://filter/read=convert.base64-encode/resource=admin.php讀取/xxe/目錄下的admin.php的源碼

payload:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY admin SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php"> ]> <root><name>&admin;</name><password>admin</password></root>

將得到的base64編碼的admin.php的源碼進行解密


可以得到登錄的帳號和密碼,將密碼的md5指拿去在線網站進行解密得到:admin@123
訪問:http://192.168.194.188/xxe/admin.php,輸入得到的帳號密碼


點擊Flag,跳轉到http://192.168.194.188/xxe/flagmeout.php,查看源程式碼得到一串base32字母,解密後再進行一次base64解密,得到


這裡注意在源碼中給出了輸入正確用戶名和密碼的跳轉鏈接,同時完全可以在不輸入正確的用戶名和密碼的情況下直接訪問。這種情況在實際滲透測試的過程中要注意,說不定會有驚喜,可以省不少麻煩。
接下來回到剛剛存在xxe漏洞的頁面,繼續抓包讀取/etc/.flag.php文件


解碼後得到一串疑似php的程式碼,但是變數名做了大幅度修改


最後將該程式碼拿到php程式碼美化網站進行格式化,如:http://www.jsons.cn/phpformat/,再放到phpstudy上保存為flag.php。訪問從報錯資訊中得到flag。


防禦措施:
xxe漏洞存在是因為XML解析器解析了用戶發送的不可信數據。然而,要去校驗DTD(document type definition)中SYSTEM標識符定義的數據,並不容易,也不大可能。大部分的XML解析器默認對於XXE攻擊是脆弱的。因此,最好的解決辦法就是配置XML處理器去使用本地靜態的DTD,不允許XML中含有任何自己聲明的DTD。通過設置相應的屬性值為false,XML外部實體攻擊就能夠被阻止。因此,可將外部實體、參數實體和內聯DTD 都設置為false,從而避免基於XXE漏洞的攻擊。

1.禁用xml外部實體
PHP: libxml_disable_entity_loader(true); JAVA: DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false); Python: from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
2.過濾xml外部實體的關鍵字:
過濾<!DOCTYPE>, <!ENTITY>, SYSTEM 等
