XML 基础知识 && XXE 漏洞原理解析及实验(基础篇)
字数 1345 2025-08-11 21:26:06

XML基础知识与XXE漏洞原理解析

XML基础概念

XML定义与作用

  • XML(可扩展标记语言)全称:eXtensible Markup Language
  • 主要用途:传输和存储数据,焦点在于数据内容
  • 与HTML的关系:
    • HTML用于显示数据,关注数据外观
    • XML用于存储和传输数据,关注数据内容
    • 两者配合:HTML提供模板,XML动态改变模板中的数据

XML优势

  1. 数据与显示分离:修改数据无需编辑HTML结构
  2. 通用数据格式标准:支持XML的应用可相互交换数据
  3. 自定义标签:没有预定义标签,可自由定义

XML DTD(文档类型定义)

DTD作用

  • 约束XML文档格式
  • 优势:
    • 规范XML结构
    • 确保通信双方使用相同格式交换数据
    • 验证接收或自身的数据

DTD声明方式

内部DOCTYPE声明

<!DOCTYPE root-element [element-declarations]>

示例:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to (#PCDATA)>
  <!ELEMENT from (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body (#PCDATA)>
]>
<note>
  <to>XXE</to>
  <from>LEARING</from>
  <heading>hello</heading>
  <body>My_friend</body>
</note>

外部文档声明(XXE关键)

<!DOCTYPE root-element SYSTEM "filename">

示例:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
  <to>XXE</to>
  <from>LEARING</from>
  <heading>hello</heading>
  <body>My_friend</body>
</note>

XML实体

实体定义

  • 用于定义XML文档中特殊字符的快捷方式(类似变量或宏)
  • 格式:&entity-name;

实体类型

内部实体

<!ENTITY entity-name "entity-value">

示例:

<!DOCTYPE note [
  <!ELEMENT note (#PCDATA)>
  <!ENTITY to "XXE">
  <!ENTITY from "LEARING">
  <!ENTITY heading "hello">
  <!ENTITY body "my_friend">
]>
<note>
  &to; &from; &heading; &body;
</note>

外部实体(XXE关键)

<!ENTITY name SYSTEM "URI/URL">

示例:

<!ENTITY writer SYSTEM "http://www.example.com/note.dtd">

XXE漏洞(XML外部实体注入)

XXE漏洞原理

  • 利用XML解析器处理外部实体的功能
  • 通过构造恶意XML文档,读取服务器敏感文件或发起SSRF攻击

XXE攻击条件

  1. 存在使用XML传输数据的情况,且数据可控
  2. 服务器未禁用外部实体解析
  3. 攻击结果可回显或通过其他方式验证

XXE攻击类型

有回显的XXE

攻击流程:

  1. 识别XML数据交互点
  2. 构造恶意XML,包含外部实体声明
  3. 在可回显位置引用外部实体

示例:

<!DOCTYPE foo [
  <!ENTITY deu SYSTEM 'file:////etc/passwd'>
]>
<email>&deu;</email>

无回显的XXE

验证方法:

  1. 使用DNSlog技术
  2. 构造恶意XML使服务器发起DNS或HTTP请求

示例(使用Burp Collaborator):

<!DOCTYPE foo [
  <!ENTITY % xxe SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN">
  %xxe;
]>

XXE执行SSRF攻击

示例:

<!DOCTYPE foo [
  <!ENTITY deu SYSTEM "http://169.254.169.254">
]>
<storeID>&deu;</storeID>

XXE与XSS对比

特性 XXE XSS
攻击目标 服务器端 浏览器端
触发方式 通过XML解析 通过浏览器渲染
数据流向 读取服务器资源 窃取客户端数据

XXE漏洞挖掘

  1. 寻找XML数据交互点(如API接口、表单提交等)
  2. 测试XML解析是否允许外部实体
  3. 尝试读取敏感文件或发起外部请求

XXE防御措施

  1. 禁用外部实体(推荐)

    • PHP示例:libxml_disable_entity_loader(true);
  2. 使用安全配置

    • 禁用DTD处理
    • 限制实体解析
  3. 输入过滤

    • 过滤<!DOCTYPE<!ENTITY等关键字
    • 注意:黑名单方式不完全可靠
  4. 使用JSON替代XML

    • 在不需要XML的场景下使用更安全的数据格式

实验与靶场

推荐练习靶场:

  1. PortSwigger XXE Labs

  2. Vulnhub靶机

    • 寻找包含XML交互功能的靶机进行实战练习

总结

XXE漏洞利用XML解析器对外部实体的支持,通过构造恶意XML文档实现敏感信息读取或SSRF攻击。防御关键在于禁用不必要的外部实体解析功能,并对输入进行严格过滤。理解XML基础结构和DTD机制是掌握XXE漏洞的前提。

XML基础知识与XXE漏洞原理解析 XML基础概念 XML定义与作用 XML(可扩展标记语言)全称:eXtensible Markup Language 主要用途:传输和存储数据,焦点在于数据内容 与HTML的关系: HTML用于显示数据,关注数据外观 XML用于存储和传输数据,关注数据内容 两者配合:HTML提供模板,XML动态改变模板中的数据 XML优势 数据与显示分离:修改数据无需编辑HTML结构 通用数据格式标准:支持XML的应用可相互交换数据 自定义标签:没有预定义标签,可自由定义 XML DTD(文档类型定义) DTD作用 约束XML文档格式 优势: 规范XML结构 确保通信双方使用相同格式交换数据 验证接收或自身的数据 DTD声明方式 内部DOCTYPE声明 示例: 外部文档声明(XXE关键) 示例: XML实体 实体定义 用于定义XML文档中特殊字符的快捷方式(类似变量或宏) 格式: &entity-name; 实体类型 内部实体 示例: 外部实体(XXE关键) 示例: XXE漏洞(XML外部实体注入) XXE漏洞原理 利用XML解析器处理外部实体的功能 通过构造恶意XML文档,读取服务器敏感文件或发起SSRF攻击 XXE攻击条件 存在使用XML传输数据的情况,且数据可控 服务器未禁用外部实体解析 攻击结果可回显或通过其他方式验证 XXE攻击类型 有回显的XXE 攻击流程: 识别XML数据交互点 构造恶意XML,包含外部实体声明 在可回显位置引用外部实体 示例: 无回显的XXE 验证方法: 使用DNSlog技术 构造恶意XML使服务器发起DNS或HTTP请求 示例(使用Burp Collaborator): XXE执行SSRF攻击 示例: XXE与XSS对比 | 特性 | XXE | XSS | |------|-----|-----| | 攻击目标 | 服务器端 | 浏览器端 | | 触发方式 | 通过XML解析 | 通过浏览器渲染 | | 数据流向 | 读取服务器资源 | 窃取客户端数据 | XXE漏洞挖掘 寻找XML数据交互点(如API接口、表单提交等) 测试XML解析是否允许外部实体 尝试读取敏感文件或发起外部请求 XXE防御措施 禁用外部实体 (推荐) PHP示例: libxml_disable_entity_loader(true); 使用安全配置 禁用DTD处理 限制实体解析 输入过滤 过滤 <!DOCTYPE 和 <!ENTITY 等关键字 注意:黑名单方式不完全可靠 使用JSON替代XML 在不需要XML的场景下使用更安全的数据格式 实验与靶场 推荐练习靶场: PortSwigger XXE Labs Exploiting XXE to retrieve files Exploiting XXE to perform SSRF Vulnhub靶机 寻找包含XML交互功能的靶机进行实战练习 总结 XXE漏洞利用XML解析器对外部实体的支持,通过构造恶意XML文档实现敏感信息读取或SSRF攻击。防御关键在于禁用不必要的外部实体解析功能,并对输入进行严格过滤。理解XML基础结构和DTD机制是掌握XXE漏洞的前提。