Karp 的技术博客

运气真不错 牛市来了 服务就让人盯上了 教训很深刻 50w 的学费.

服务代买使用 php CI框架 写的. 最近线上服务器出现错误

[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP Fatal error: DISEVAL - Use of eval is forbidden in /data/release/project/system/View/Parser.php(526) : eval()'d code on line 1
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP Stack trace:
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP 1. {main}() /data/release/project/public/index.php:0
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP 2. CodeIgniter\CodeIgniter->run() /data/release/project/public/index.php:46
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP 3. CodeIgniter\CodeIgniter->handleRequest() /data/release/project/system/CodeIgniter.php:203
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP 4. CodeIgniter\CodeIgniter->runController() /data/release/project/system/CodeIgniter.php:248
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP 5. App\Controllers\Member->emailActivate() /data/release/project/system/CodeIgniter.php:713

运维同学通过 nginx 日志及logtail 最后定位到 一个对外的api接口. 该接口uri中参数通过 base64 加密并通过 serialize 函数序列化.
服务端接收参数后 解base64 然后在使用 unserialize 反序列化.
正常来看实际没什么问题. 但 由于反序列化的特性 unserialize — 从已存储的表示中创建 PHP 的值 这个php值 可以杀死对象.

经过测试 反序列化可以在已知条件下调用所有项目中存在的所有方法.

黑客 发现漏洞后 通过大量测试 , 得知当前框架, 直接就可以开始行动了

经过观察 近一周的试探及数据收集 在凌晨黑客开始对服务器进程数据篡改.

问题查找比较费劲 主要问题在于 反序列化的数据解出来可能是 php对象 真实厉害呀 会触发析构及其他魔术方法.

举个栗子 :

   // 序列化对象 Ci 默认数据库配置
    public function se()
    {
        $class = new Config/Database();
        $classStr = serialize($class);
        echo base64_encode($classStr);
    }

    // 解包
    public function uns()
    {
        $a = $_POST['a'];
        try {
            $ser =$a;

        $class = unserialize( base64_decode($ser));
        }catch (\Exception $e){
            var_dump($e->getMessage());
        }

        var_dump($class);
    }

总结下:
线上禁用 unserialize 方法, 防止反序列化注入, 形成webshell
通过反序列化 调用 Ci 生成模板缓存的方法, 实现消息回包. 实际上代码以上可以全部获取 接收回包的方式

php

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2019年05月17日 01:12
6

目录

来自 《PHP 反序列化注入踩坑》