ThinkPHP5.2.x反序列化利用链
字数 1215 2025-08-26 22:11:15

ThinkPHP5.2.x反序列化利用链深入分析

环境搭建

  1. 使用Composer创建项目:
composer create-project topthink/think=5.2.x-dev tp52x
cd tp52x
./think run
  1. 修改控制器代码(application/index/controller/Index.php):
<?php
namespace app\controller;

class Index
{
    public function index()
    {
        $u = unserialize($_GET['c']);
        return 'ThinkPHP V5.2';
    }
}

利用条件

  • 必要条件:

    • 存在完全可控的反序列化点(如unserialize(可控变量)
  • 可选条件(满足任意一个):

    • 存在文件上传功能且文件名完全可控
    • 使用了文件操作函数(如file_exists('phar://恶意文件')

POP链1分析

攻击链流程

  1. 起点think\process\pipes\Windows类的__destruct方法

    • 包含文件删除功能
    • $filename变量可控
    • file_exists($filename)时,如果$filename是对象,会触发其__toString方法
  2. 触发toStringthink\model\concern\Conversion__toString方法

    • 原5.1.x中的$relation->visible($name)被移到appendAttrToArray方法
    • 关注getAttr方法,$key来自可控的$data
  3. 关键调用getAttr方法

    • 通过getData获取$value(可控)
    • 调用getValue方法,参数可控
  4. 动态调用getValue方法

    • 使用动态调用:$closure($value, $this->data)
    • $closure='system'$value='命令'时,可执行系统命令
  5. 利用类Pivot

    • 使用了AttributeConversion这两个trait
    • 可作为构造EXP的载体

EXP构造示例

// 示例:执行curl 127.0.0.1:8888
// 注意:实际EXP代码已省略,请勿用于非法用途

POP链2分析

攻击链流程

  1. 前半部分:与ThinkPHP5.1.x的POP链相同

    • 但在执行到关键调用时,5.2.x移除了Request类的__call方法
  2. 替代方案:使用Db类的__call方法

    • 可以实例化任意类
    • 结合Url类的__construct方法进行文件包含
  3. 利用条件

    • 需要能上传route.php文件
    • 需要知道文件存储路径

EXP构造示例

// 示例:包含/tmp/route.php文件
// 注意:实际EXP代码已省略,请勿用于非法用途

防御建议

  1. 避免使用不可信的反序列化数据
  2. 严格过滤用户输入
  3. 限制文件上传功能
  4. 及时更新框架版本
  5. 使用安全的反序列化方法(如JSON)

参考资源

  1. N1CTF2019 sql_manage出题笔记
  2. thinkphp v5.2.x 反序列化利用链挖掘
  3. ThinkPHP5.1.x反序列化POP链分析

总结

ThinkPHP5.2.x的反序列化漏洞主要通过两条利用链实现攻击:

  1. 通过文件操作触发__toString进而执行任意命令
  2. 通过文件包含实现远程代码执行

理解这些利用链有助于开发者更好地防御此类漏洞,同时也为安全研究人员提供了分析思路。

ThinkPHP5.2.x反序列化利用链深入分析 环境搭建 使用Composer创建项目: 修改控制器代码(application/index/controller/Index.php): 利用条件 必要条件: 存在完全可控的反序列化点(如 unserialize(可控变量) ) 可选条件(满足任意一个): 存在文件上传功能且文件名完全可控 使用了文件操作函数(如 file_exists('phar://恶意文件') ) POP链1分析 攻击链流程 起点 : think\process\pipes\Windows 类的 __destruct 方法 包含文件删除功能 $filename 变量可控 当 file_exists($filename) 时,如果 $filename 是对象,会触发其 __toString 方法 触发toString : think\model\concern\Conversion 的 __toString 方法 原5.1.x中的 $relation->visible($name) 被移到 appendAttrToArray 方法 关注 getAttr 方法, $key 来自可控的 $data 关键调用 : getAttr 方法 通过 getData 获取 $value (可控) 调用 getValue 方法,参数可控 动态调用 : getValue 方法 使用动态调用: $closure($value, $this->data) 当 $closure='system' 且 $value='命令' 时,可执行系统命令 利用类 : Pivot 类 使用了 Attribute 和 Conversion 这两个trait 可作为构造EXP的载体 EXP构造示例 POP链2分析 攻击链流程 前半部分 :与ThinkPHP5.1.x的POP链相同 但在执行到关键调用时,5.2.x移除了 Request 类的 __call 方法 替代方案 :使用 Db 类的 __call 方法 可以实例化任意类 结合 Url 类的 __construct 方法进行文件包含 利用条件 : 需要能上传 route.php 文件 需要知道文件存储路径 EXP构造示例 防御建议 避免使用不可信的反序列化数据 严格过滤用户输入 限制文件上传功能 及时更新框架版本 使用安全的反序列化方法(如JSON) 参考资源 N1CTF2019 sql_ manage出题笔记 thinkphp v5.2.x 反序列化利用链挖掘 ThinkPHP5.1.x反序列化POP链分析 总结 ThinkPHP5.2.x的反序列化漏洞主要通过两条利用链实现攻击: 通过文件操作触发 __toString 进而执行任意命令 通过文件包含实现远程代码执行 理解这些利用链有助于开发者更好地防御此类漏洞,同时也为安全研究人员提供了分析思路。