- 每日一句:仅做脚本小子是不行的,必须具有一定的代码能力(能看懂代码就行)
- 本篇内容:什么是XXE
XML结构
XXE原理
实战注意
一、什么是XXE
1.本质
简单的说,就是XML外部实体注入攻击
分解一下
注入:将用户输入的内容当作代码执行
sql注入:将用户输入的内容当作sql代码执行
XML:
一种类似HTML的语言
主要是存储传输数据的
没有预定义标签
实体:简单的理解为变量,可以存储一些东西
定义:XXE,就是XML引用的数据当作代码被执行,即XML外部实体注入攻击
二、XML结构
1.结构:
第一部分是声明,主要定义XML使用版本和使用编码
第二部分是DTD部分,主要是约束作用,简单的说,给内容部分定规矩
DTD约束的三种形式即:
内部DTD:<!DOCTYPE 根节点 [DTD的代码]>
外部DTD:<!DOCTYPE 根节点 "DTD的地址">
网络DTD:<!DOCTYPE 根节点 PUBLIC "DTD的名称" "DTD的地址">
第三部分是内容
2.举例:
//外部DTD:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>葵花宝典</书名>
<作者>东方不败</作者>
<售价>88.00元</售价>
</书>
</书架>
//内部DTD:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
<书>
<书名>葵花宝典</书名>
<作者>东方不败</作者>
<售价>88.00元</售价>
</书>
。。。
</书架>
三、XXE原理
1.工作过程原理
DTD部分去读取敏感的信息
将读取到的信息赋值到实体当中 //实体名字随便起
XML部分使用的过程中,将实体内容输出
2.如何检测xxe
可以在http头的content-type中查看,也可以根据url一些常见的关键字进行判断测试,例如wsdl(web服务描述语言).或者一些常见的采用xml的java服务配置文件(spring,struts2).不过现实中存在的大多数xxe漏洞都是blind,即不可见的,必须采用带外通道进行返回信息的记录,这里简单来说就是攻击者必须具有一台具有公网ip的主机。
3.补充
XML本身没有危害,他就是一个存储数据的;但是在一些动态语言脚本里边,
例如:php中,它可以利用simplexml_load_string函数,将XML转化为对象
注意:Java中什么是类?什么是对象?
~类就是具备某些共同特征的实体的集合
~对象就是一个真实世界中的物体
举例:
“人”就是一个类,他有吃饭、睡觉的属性,
而张三这个人,就是“人”这个类的对象
4.不足及解决
很多时候后端语言解析了XML后其实并不会给你输出,
难道这样子我们就不能进行XXE了?
办法:
我们可以使用一个类型接收平台一样的接收器。
XML读取数据然后发送到接受的平台,然后接受平台存储,
我们再去接受平台查看就可以了。
很类似反弹注入
步骤:
公网上建一个web环境 [1.xml 2.php 3.txt]
1.xml 负责 读取我们想要的内容
2.php 负责收集1.xml的传参,并将参数内容保存到3.txt中
3.txt 保存传参数据,方便我们查看
四、实战注意
1.
黑盒比较难挖掘
白盒审计较容易
平时挖掘src时,比较少
但是,扫描器漏扫一些网站较为容易扫出
2.危害
~读取任意文件
~执行系统命令
~探测内网端口
~攻击内网网站
~导致DDOS攻击
3.防御
~使用开发语言提供的禁用外部实体的方法
如:PHP:
libxml_disable_loader(ture);
其他语言:
https://owasp.org/www-project-cheat- sheets/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html
~过滤用户提交的XML数据
关键词:SYSTEM和PUBLIC
五、总结
- 明白XXE原理和防御方法
- 多多实战