ホームページ バックエンド開発 PHPチュートリアル ThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエスト

ThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエスト

Mar 21, 2019 pm 03:34 PM
thinkphp5 脆弱性分析

ThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエスト

1. 脆弱性の紹介

2019 年 1 月 11 日、ThinkPHP チームは A を修正するパッチ更新をリリースしました。安全でない動的関数呼び出しによって引き起こされるリモートコード実行の脆弱性が発見されました。この脆弱性は非常に有害であり、デフォルトでリモート コードが実行される可能性があります。 Venus ADLab のセキュリティ研究者は、ThinkPHP の複数のバージョンでソース コードの分析と検証を行った結果、特に影響を受けるバージョンが ThinkPHP 5.0 ~ 5.0.23 のフル バージョンであることを確認しました。

2. 脆弱性の再現

ローカル環境では、ThinkPHP 5.0.22 および PHP5.5.38 Apache のフルバージョンを使用して再現します。環境をインストールした後、図に示すように POC を実行してシステム コマンドを実行します:

ThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエスト

3. 脆弱性分析

公式 Web サイトに基づく ダウンロードした 5.0.22 のフル バージョンを分析した後、最初に脆弱性のキー ポイントを特定しました。

thinkphp/library/think/Request.php:518
ログイン後にコピー

メソッド関数の 2 番目の if 分岐では、外部から制御可能なデータ$_POST[Config::get が導入されました ['var_method']。 var_method の値は _method です。

ThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエスト

Request クラスの __construct 関数は次のとおりです。

$options パラメーターは制御可能であるため、攻撃者はフィルター属性、メソッド属性を上書きできます。そしてクラスの属性の値を取得します。 Request クラスの param 関数内:

$this->mergeParam が空の場合、ここで $this->get(false) が呼び出されます。 $this->get 関数を追跡します。

$this->input 関数が関数の最後で呼び出され、$this->get が渡され、$this- の値が渡されます。 >getは制御可能な攻撃です。 $this->input 関数を追跡します。

この関数は、$this->getFileter を呼び出してフィルターを取得します。関数本体は次のとおりです:

#$this->フィルターの値はオーバーライドされ、コンストラクターを呼び出すことで攻撃者によって制御されます。値を返した後、入力関数に入ります:

filterValue 関数を次のように表示します。

call_user_func 関数の呼び出しでは、$filter と $value が制御可能です。したがって、コードが実行される可能性があります。

脆弱性トリガー プロセス:

ThinkPHP5 のエントリ ポイントから分析を開始します:

thinkphp/library/think/App.php:77
ログイン後にコピー
run 関数の最初の行は、Request クラスをインスタンス化します。 . そして $request に割り当てられます。次に、routeCheck($request,$config):

ここで、ルート検出のために Route::check を呼び出します。機能は次のとおりです。

赤い文字の部分に注目してください。冒頭の最初のステップに相当します。これは、変数カバレッジのためのメソッド関数を呼び出すことです。ここでオーバーライドする必要があるプロパティは、$this->filter、$this->method、$this->get です。 $request->method() の戻り値は $this->method であるため、この値も制御する必要があります。ここでの戻り値を$methodに代入し、さらにself::$rules[$method]の値を取り出して$rulesに渡します。ここで注意してください: THINKPHP5 には自動クラス ロード メカニズムがあり、ベンダー ディレクトリ内のいくつかのファイルが自動的にロードされます。ただし、フルバージョンとコアバージョンのベンダーディレクトリ構造は異なります。

完全バージョンのディレクトリ構造は次のとおりです:

ThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエスト

コア バージョンのディレクトリ構造は次のとおりです:

ThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエスト #完全バージョンには、コア バージョンよりもいくつかのフォルダーが多いことがわかります。特に注意が必要なのは、think-captcha/src フォルダーに helper.php ファイルがあることです。

ThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエスト\think\Route::get 関数はここで呼び出されます。ルートを登録し、操作します。このステップの影響は、上記の self::$rules の値を変更することです。このルートでのみ RCE を実行できます。それ以外の場合は成功しません。これが、コア バージョンではなくフル バージョンにのみ影響する理由です。このとき、self::$rules の値は

ThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエスト# となります。すると、攻撃者が get に返される $method の値を制御すると、$ の値が取得されます。 rules はこのルーティング ルールです。次に、上記に戻って $rules を取得し、受信 URL に従って $item の値を取得します。これにより、$rules[$item] の値がキャプチャ ルーティング配列になり、さらに self:: を呼び出すことができます。 parseRule関数。関数本体は少し長くなります。重要な点は次のとおりです。

この時点で渡される $route の値は、\think\captcha\CaptchaController@index です。したがって、赤でマークされた if 分岐に入ります。このブランチでは、$result の「type」キーに対応する値は「method」です。次に、$result がレイヤーごとに run 関数に返され、$dispatch に割り当てられます。

次に $dispatch を self::exec 関数に組み込みます:

赤でマークされたブランチに入り、Request クラスの param メソッドを呼び出します。したがって、エクスプロイト チェーンの 3 番目のステップが満たされ、コマンドが実行されます。

Venstar ADLab のセキュリティ研究者は、ThinkPHP5.0-5.0.23 の各バージョンを分析し、ThinkPHP5.0.2-5.0.23 は同じ POC を使用できるが、ThinkPHP5.0-5.0.1 は変更する必要があることを発見しました。 POC を見てみますと、その理由は Route.php のルール関数の実装の小さな違いにあります。

ThinkPHP5.0-5.0.1 バージョン thinkphp/library/think/Route.php:235、$type を大文字に変換します:

ThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエスト

ThinkPHP5 では。 0.2-5.0.23 バージョンでは、ルール関数内で $type が小文字に変換されます。

ThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエスト

# 4. パッチ分析

In ThinkPHP5.0.24では、$this->methodの判定が追加され、クラス関数の自由呼び出しができなくなりました。

ThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエスト

5. 結論

回避策として、ThinkPHP5.0.24 バージョンにアップグレードし、デバッグ モードを有効にしないことを強くお勧めします。攻撃されている。

関連する推奨事項: 「PHP チュートリアル

以上がThinkPHP5 コアクラス リモートコードの脆弱性分析をリクエストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Pagoda に thinkphp5 をデプロイするときにエラーが発生した場合はどうすればよいですか? Pagoda に thinkphp5 をデプロイするときにエラーが発生した場合はどうすればよいですか? Dec 19, 2022 am 11:04 AM

Pagoda に thinkphp5 をデプロイするときに報告されたエラーの解決策: 1. Pagoda サーバーを開き、php pathinfo 拡張機能をインストールして有効にします; 2. 「.access」ファイルをコンテンツ「RewriteRule ^(.*)$index.php」で構成します。 ?s=/$1 [QSA ,PT,L]”; 3. Web サイト管理で、thinkphp の疑似静的機能を有効にするだけです。

thinkphp5 の URL 書き換えが失敗した場合はどうすればよいですか? thinkphp5 の URL 書き換えが失敗した場合はどうすればよいですか? Dec 12, 2022 am 09:31 AM

thinkphp5 の URL 書き換えが機能しない場合の解決策: 1. mod_rewrite.so モジュールが httpd.conf 設定ファイルにロードされているかどうかを確認します; 2.AllowOverride None の None を All に変更します; 3. Apache 設定ファイル .htaccess を「RewriteRule ^」に変更します(.*)$index.php [L,E=PATH_INFO:$1]」を選択して保存します。

thinkphp5でリクエストされたURLを取得する方法 thinkphp5でリクエストされたURLを取得する方法 Dec 20, 2022 am 09:48 AM

thinkphp5 が要求された URL を取得するためのメソッド: 1. "\think\Request" クラスの "$request = Request::instance();" メソッドを使用して、現在の URL 情報を取得します。 2. 組み込みヘルパーを使用します。関数「$request-> url()」を使用して、ドメイン名を含む完全な URL アドレスを取得します。

thinkphp5 post が値を取得できない場合はどうすればよいですか? thinkphp5 post が値を取得できない場合はどうすればよいですか? Dec 06, 2022 am 09:29 AM

TP5 が strpos 関数を使用してヘッダーの content-type 値で app/json 文字列を検索するため、thinkphp5 post は値を取得できません。解決策は、ヘッダーの content-type 値を app/json に設定することです。

thinkphp5のタイトルバーアイコンを削除する方法 thinkphp5のタイトルバーアイコンを削除する方法 Dec 20, 2022 am 09:24 AM

thinkphp5 タイトル バー アイコンを削除する方法: 1. thinkphp5 フレームワーク public で favicon.ico ファイルを見つけます; 2. ファイルを削除するか、別の画像を選択して名前を favicon.ico に変更し、元の favicon.ico ファイルを置き換えます。

thinkphp5 がコントローラーが存在しないというメッセージを表示した場合はどうすればよいですか? thinkphp5 がコントローラーが存在しないというメッセージを表示した場合はどうすればよいですか? Dec 06, 2022 am 10:43 AM

thinkphp5 でコントローラーが存在しないというプロンプトが表示される場合の解決策: 1. 対応するコントローラーの名前空間が正しく記述されているかどうかを確認し、正しい名前空間に変更します; 2. 対応する tp ファイルを開いてクラス名を変更します。

ThinkPHP5 で昨日のデータをクエリする方法 ThinkPHP5 で昨日のデータをクエリする方法 Dec 05, 2022 am 09:20 AM

ThinkPHP5 で昨日のデータをクエリする方法: 1. ThinkPHP5 関連ファイルを開きます; 2. 式「db('table')->whereTime('c_time', 'yesterday')->select();」を使用して昨日のデータをクエリします。 。

thinkphp5 でエラー プロンプトを設定する方法 thinkphp5 でエラー プロンプトを設定する方法 Dec 07, 2022 am 10:31 AM

thinkphp5 でエラー プロンプトを設定する方法: 1. プロジェクト ルート ディレクトリのパブリック フォルダーに入り、index.php エントリ ファイルを開きます; 2. デバッグ モード スイッチに関するコメントを表示します; 3. 「APP_DEBUG」定数の値を調整しますtrue に設定すると、エラー メッセージ プロンプトが表示されます。

See all articles