什么是XXE?

XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

什么是XML?

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

XML有什么特点

  • XML仅仅是纯文本,他不会做任何事情。
  • XML可以自己发明标签(允许定义自己的标签和文档结构)
  • XML 无所不在。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。

既然XML是纯文本为什么还会产生注入呢

原本xml本身是没有任何作用,但是在PHP里有一个函数叫做simplexml_load_string,他的作用是把xml转化为对象。

PHP 中的simplexml_load_file()函数 ,用于加载 XML 文件并返回一个 SimpleXMLElement 对象,这样你就可以轻松地操作 XML 数据了。

XML与HTML的区别

  • XML被设计用来传输和存储数据。
  • HTML被设计用来显示数据。

为什么使用 DTD?

  • 通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。

  • 通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。

  • 而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。

  • 您还可以使用 DTD 来验证您自身的数据。

DTD实体

  1. 内部实体声明:<!ENTITY 实体名称 "实体的值"> ex:<!ENTITY eviltest "eviltest">
  2. 外部实体声明:<!ENTITY 实体名称 SYSTEM "UR">

怎么构造外部实体注入?

  1. 直接通过DTD外部实体声明

  2. 通过DTD文档引入外部DTD文档,再引入外部实体声明

  3. 通过DTD外部实体声明引入外部实体声明

XML外部实体攻击又是什么

XML 外部实体注入简称XXE,有了XML实体,关键字SYSTEM会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。 简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)。

XXE支持那些协议呢

  • file:可用 file://文件地址,来读取文件
  • http:可以访问 HTTP(S) 网址
  • FTP:访问 FTP
  • PHP:访问各个 输入/输出 流
  • zlib:压缩流
  • data:数据
  • glob:查找匹配的文件格式路径
  • expect:处理交互式的流,可用来执行命令,但需要先安装相应插件

为什么要进行base64编码

为了防止一些特殊字符对我们产生影响

靶场

全剧搜simplexml_load_string

image-20240306221940058

$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];接收HTTP中原始的POST数据,并将其存入$postArr变量中

然后,使用simplexml_load_string函数将$postArr中的数据转换为SimpleXMLElement对象,并将其存储在$postObj变量中。

image-20240306222321057

修改源文件,看看能否访问到这个页面

image-20240306222422239

靶场中

使用bp抓包,将构造的xml语句上传,同时将传参方式改为post
同时,根据/api/notify.php得到conn/conn.php的相对路径
使用靶场给的xml文件

image-20240306225358152

image-20240306225407753

1
2
3
4
5
6
7
8
<?php
error_reporting(E_ALL ^ E_NOTICE);
header("content-type:text/html;charset=utf-8");
session_start();
$conn = mysqli_connect("192.168.0.10","xxe", "teiwo!8#7ERe1DPC", "scms");
mysqli_query($conn,'set names utf8');
date_default_timezone_set("PRC");

登录数据库

image-20240306225542538

image-20240306225842038

admin密码由md5加密

image-20240306230332775

image-20240306230313542