xxe漏洞漏洞详解

XXE漏洞概念 XXE(XML External Entity Injection) XML外部实体注入。 重点: XML 外部实体 注入 这三部分搞清楚 XML是一种类似于HTML(超文本标记语言)的可扩展标记语言,是用于标记电子文件使其具有结构性 的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语 言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language)。 XML 是一种很像HTML的标记语言。 XML 的设计宗旨是传输数据,而不是显示数据。 XML 标签没有被预定义。您需要自行定义标签。 XML 被设计为具有自我描述性。 XML 是 W3C 的推荐标准。

XML的作用 主要就是存储数据 传输数据。

基础语法

<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

文档结构图:

语法规则: XML 文档必须有根元素 XML 声明(可选) 所有的 XML 元素都必须有一个关闭标签 XML 标签对大小写敏感 XML 必须正确嵌套 XML 属性值必须加引号 实体(字符实体)引用(同html) XML 中的注释(同html) 在 XML 中,空格会被保留。

XML 命名规则: XML 元素必须遵循以下命名规则: 名称可以包含字母、数字以及其他的字符 名称不能以数字或者标点符号开始 名称不能以字母 xml(或者 XML、Xml 等等)开始 名称不能包含空格。

XML的合法性 拥有正确语法的 XML 被称为"形式良好"的 XML。 通过 DTD 验证的XML是"合法"的 XML。 接下来掌握DTD(Document Type Definition)相关知识,有利于我们掌握XXE。 DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。 DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

内部DTD 假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE root-element [element-declarations]>

比如:

<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>张飞</to>
<from>马超</from>
<heading>通知</heading>
<body>挑灯大战三百回合!</body>
</note>

以上 DTD 解释如下: !DOCTYPE note (第二行)定义此文档是 note 类型的文档。 !ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body" !ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型 !ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型 !ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型 !ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型。

这里解释一下PCDATA和CDATA PCDATA:是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。 CDATA:是不会被解析器解析的文本。

外部DTD 假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE root-element SYSTEM "filename">

先声明一个note.dtd:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

再写xml:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>周瑜</to>
<from>黄盖</from>
<heading>提示</heading>
<body>周瑜打黄盖</body>
</note>

DTD实体 实体是用于定义引用普通文本或特殊字符的快捷方式的变量。 实体引用是对实体的引用。 实体可在内部或外部进行声明。

内部实体 语法:

<!ENTITY entity-name "entity-value">

示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE stu [
<!ELEMENT stu (name, age, address)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ENTITY name "亚瑟">
<!ENTITY age "18">
<!ENTITY address "对抗路">
]>
<stu>
<name>&name;</name>
<age>&age;</age>
<address>&address;</address>
</stu>

注意: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

浏览器效果:

简单一点的案例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE stu [<!ENTITY name "亚瑟">]>
<name>&name;</name>

浏览器效果:

外部实体 和内部实体一致,只是DTD声明在外部。

语法:

<!ENTITY entity-name SYSTEM "URI/URL">

xml中引用外部dtd实体:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root[
<!ENTITY name SYSTEM "file:///D:/www/xxe/data.txt">]>
<root>
<username>&name;</username>
</root>

注意:这个地方直接浏览器访问拿不到数据,需要程序读取。 data.txt中随意什么内容都可以。 核心在于SYSTEM关键字。 SYSTEM这个地方常用的协议:

file:///path/to/file.ext

http://url/file.ext

php://filter/read=convert.base64-encode/resource=conf.php

支持的协议:

其余的参考:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///c://test/1.txt" >]>
<value>&xxe;</value>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "http://xxx.com/xxxx.php" >]>
<value>&xxe;</value>

参数实体 语法:

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

注意: % 和 实体名字之间有一个空格 示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [ ]>

注意:参数实体只能在 DTD文件中被引用,其他实体在XML文档内引用。 参数实体 在DOCTYPE内 ,其他实体在外。

PHP解析XML 直接上代码: 解析字符串

<?php
header("Content-type:text/html;charset=utf-8");
$xml = <<<eof
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root[
<!ENTITY name SYSTEM "file:///D:/www/xxe/data.txt">]>
<root>
<username>&name;</username>
</root>
eof;
$obj = simplexml_load_string($xml,"SimpleXMLElement", LIBXML_NOENT |
LIBXML_DTDLOAD );
echo $obj->username;
解析请求:
<?php
header("Content-type:text/html;charset=utf-8");
$data = file_get_contents("php://input");
$xml = simplexml_load_string($data, "SimpleXMLElement", LIBXML_NOENT |
LIBXML_DTDLOAD);
echo $xml->username;

一定要注意: PHP中解析xml有多种方式。

一定要注意: PHP中解析xml有多种方式。

通观察页面变化,发现有数据回显:

怎么去判断是否有xxe漏洞呢? 现在不能白盒, 只能黑盒 =》 抓包=》 分析请求的参数, 如果参数是xml, 极其有可能存在xxe, 就可以 去尝试注入xml实体, 读取一些铭感数据。

防包

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

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

相关文章

C语言中 #include<>与 include ““的区别

一. C语言中 #include<> 与 include "" 的区别 1. 头文件 C语言中头文件以 .h为后缀 的文件&#xff0c;头文件中包含了函数的声明和宏定义&#xff0c;头文件可以被多个源文件引用。 在C语言中有两种类型的头文件&#xff0c;一种是编译器自带的头文件&a…

Github 2024-05-10 Java开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10C++项目2JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache License 2.0Star数量:140773 个…

一栈走天下:使用HBuilderX高效搭建Uni-App微信小程序开发环境

一栈走天下&#xff1a;使用HBuilderX高效搭建Uni-App微信小程序开发环境 Uni-App与HBuilderX简介Uni-App基础HBuilderX介绍 环境搭建步骤步骤1&#xff1a;安装HBuilderX步骤2&#xff1a;创建Uni-App项目步骤3&#xff1a;配置微信小程序平台步骤4&#xff1a;预览与发布 代码…

Nvidia docker 验证HSOpticalFlow

前情提要&#xff1a; docker是dotCloud 公司为了数据库研发的&#xff0c;所以仅支持CPU和数据交换的部分&#xff0c;nvidia公司觉得这是个好东西&#xff0c;自己派人研发了GPU相关的部分&#xff0c;取名为NVIDIA Container Toolkit&#xff0c;我们可以理解为dockerGPU插…

队列和二叉树

本文主要探讨队列和二叉树的相关知识。 队列 队列结构:队头指针指向队头元素,队尾指针指向队尾元素(链表形式或数组形式) 队列特特点:先进先出,对头插入&#xff0c;队尾出队 双端队列:对头队尾都可插入和出队 二叉树 二叉树:包含根节点和子节点,一个三角组内…

设计模式——解释器模式(Interpreter)

解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子。这种模式主要用来描述如何使用面向对象语言构成一…

VRRP(Virtual Router Redundancy Protocol)虚拟路由器冗余协议

VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;即虚拟路由器冗余协议&#xff0c;是一种网络容错协议。VRRP通过在多个路由器间建立虚拟的路由身份&#xff0c;提供了一种简单高效的机制来保障网络出口点的高可用性&#xff0c;从而防止因单一设备故障导致的…

CSS基础(CSS导入方式、选择器、属性)

层叠样式表&#xff08;Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;是一种样式表语言&#xff0c;用来描述 HTML 或 XML&#xff08;包括如 SVG、MathML 或 XHTML 之类的 XML 分支语言&#xff09;文档的呈现方式。CSS 描述了在屏幕、纸质、音频等其他媒体上的元…

《Decoupled Optimisation for Long-Tailed Visual Recognition》阅读笔记

论文标题 《Decoupled Optimisation for Long-Tailed Visual Recognition》 长尾视觉识别的解耦优化 作者 Cong Cong、Shiyu Xuan、Sidong Liu、Shiliang Zhang、Maurice Pagnucco 和 Yang Song、 来自新南威尔士大学计算机科学与工程学院、北京大学计算机学院多媒体信息处…

jenkins+gitlab+sonar自由风格项目配置

新建项目&基本配置 gitlab侧配置 sonar.projectKeytest_sonar sonar.projectNametest_sonar sonar.projectVersion1.0 sonar.sources. sonar.exclusionssrc/layout/** sonar.sourceEncodingUTF-8 sonar.nodejs.executable/app/nodejs/node-v16.20.2-linux-x64/bin/node配置…

如何在Flask中优雅的使用装饰器刷新令牌

随着现代应用对安全性和用户体验的不断追求&#xff0c;令牌验证和刷新机制已成为每个开发者必须掌握的技能。在这篇引人入胜的技术文章中&#xff0c;我们将深入探讨如何使用Python装饰器优雅地处理访问令牌的刷新&#xff0c;让您的代码不仅高效而且易于维护。 一、引言 在…

pgsql查看指定模式的存储过程

pgsql查看指定模式的存储过程 在 PostgreSQL 中&#xff0c;如果你想要查看指定模式的存储过程&#xff08;也称为函数&#xff09;&#xff0c;你可以使用 \df 或 \df 命令在 psql 命令行工具中&#xff0c;或者使用 SQL 查询来从 pg_catalog 系统模式中查询。 \df命令行查询…

Linux 中 POSIX 互斥信号量(互斥锁)的使用

目录 一、互斥锁的介绍二、使用方法三、测试代码 一、互斥锁的介绍 在Linux系统中&#xff0c;特别是在ARM架构的嵌入式系统中&#xff0c;互斥量&#xff08;Mutex&#xff09;用于保护共享资源不被多个线程或任务同时访问&#xff0c;从而防止数据竞争和不一致性。 POSIX 互斥…

学习java第六十五天

Spring中Bean的生命周期可以细分为以下几个阶段&#xff0c;并在每个阶段提供了相应的扩展点&#xff1a; 实例化&#xff08;Instantiation&#xff09;: Spring IoC容器根据BeanDefinition创建Bean实例。 扩展点&#xff1a;在实际实例化之前&#xff0c;可以通过实现org.spr…

旅游组团奖励标准,申报条件!利川市旅游组团奖励办法

利川市旅游组团奖励有哪些&#xff1f;关于利川市旅游组团奖励标准&#xff0c;申报条件整理如下&#xff1a; 第一条根据《湖北省人民政府办公厅印发关于更好服务市场主体推动经济稳健发展若干政策措施的通知》&#xff08;鄂政办发〔2022〕54号&#xff09;、《恩施州人民政府…

一个完整性能测试流程(非常详细)零基础入门到精通,收藏这一篇就够了

一、性能测试流程规范化的意义 规范化的性能测试流程能帮助测试发现潜在的性能问题和瓶颈&#xff0c;也能确保性能测试的可重复性和可比性。 同时可以帮助确定系统的容量&#xff0c;降低风险及维护成本&#xff0c;提高用户体验和满意度。 二、性能测试流程 一&#xff09…

linux高性能服务器--Ngix内存池简单实现

文章目录 内存模型&#xff1a;流程图内存对齐code 内存模型&#xff1a; 流程图 内存对齐 对齐计算 要分配一个以指定大小对齐的内存&#xff0c;可以使用如下公式&#xff1a; 假设要分配大小为n&#xff0c;对齐方式为x&#xff0c;那么 size(n(x-1)) & (~(x-1))。 举个…

快速了解Vuex

Vuex Vuex使用Vuex Vuex &#x1f4cc;vuex 是一个专为 Vue.js 应用程序开发的状态管理库 &#x1f4cc;vuex 可以在多个组件之间共享数据&#xff0c;并且共享的数据是响应式的&#xff0c;即数据的变更能及时渲染到模板 &#x1f4cc;vuex 采用集中式存储管理所有组件的状态…

C++ 70. 爬楼梯

文章目录 一、题目描述二、参考代码 一、题目描述 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示例 2&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;3 解释&#xff1a;有三种方法可以爬到…

发表博客之:gemm/threadblock/threadblock_swizzle.h 文件夹讲解,cutlass深入讲解

文章目录 [发表博客之&#xff1a;gemm/threadblock/threadblock_swizzle.h 文件夹讲解&#xff0c;cutlass深入讲解](https://cyj666.blog.csdn.net/article/details/138514145)先来看一下最简单的struct GemmIdentityThreadblockSwizzle结构体 发表博客之&#xff1a;gemm/th…