Vulnhub XXE靶機復現

文章源自【位元組脈搏社區】-位元組脈搏實驗室

作者-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 等