序文
質問してから数日間、コードを監査していませんでしたが、今日、PEクラスを利用して、ThinkPHP5.1.xのコード実行の脆弱性を確認しました。
最初は大きな要約を作りたかったのですが、インターネットで記事を読んだ後、要約はとても良かったので、レンガは動かしません。
この記事は、演習用です。ThinkPHP5.1.xでも、バージョンが異なるため、デバッグが有効になっているかどうかにかかわらず、ペイロードが異なります。そして、RCEは基本的に存在しないので、アイデアを探してください。。
0x01
ここに簡単な概要を書いてください。
最初に、rceの2つのメジャーバージョンの違いを明らかにしましょう
ThinkPHP 5.0-5.0.24
ThinkPHP 5.1.0-5.1.30
は、ペイロードに従って引き続き細分化されています。
1つはRequestクラスのメソッドと__constructメソッドが原因で発生し、もう1つは互換モードでRequestクラスによって取得されたコントローラーが正式に検証されていない
ためです。
1:Thinkphp5メソッドの任意の呼び出しメソッドはrce
の最後の記事であり、これの分析です:
$ this->メソッドを制御して__contruct()を呼び出し、Requestクラスのフィルターフィールドをオーバーライドしてから、App :: run()が判断デバッグを実行して決定します$ request-> param()を実行するかどうか、および$ dispatch ['type']がコントローラーまたはメソッドと等しい場合、$ request-> param()も実行され、$ request-> param()が入力()に入りますメソッド。このメソッドでは、フィルターコールバックcall_user_func()が上書きされ、rceが発生します。
2:メソッド__contructが原因のrce
アイデアは基本的に同じですが、詳細は異なります。さらに、1と2はRCEのデバッグを有効にする必要があります。キャプチャルーティングがある場合、debug = trueは不要です。
3:強制ルーティングによりRceが有効になっていません
バージョンとDEBUGオプションの関係場合によっては、バージョン
でさえRCEではないことがあります。
バージョン5.0.13以降では、デバッグをrce に有効にする必要があります。
ただし、
thinkphp5フルバージョンでは、公式Webサイトが確認コードのルート
に組み込まれています。前の記事でこのルートを介してrceをトリガーできます。また、確認されています。
詳細なペイロードの概要:https :
//y4er.com/post/thinkphp5-rce/
0x02
今日分析するトピックは、必須ルーティングを有効にできないために発生したrce
環境です。
"require": {
"php": ">=5.6.0",
"topthink/framework": "5.1.29"
},
脆弱性の原因:
thinkphpはデフォルトで必須ルーティングを有効にせず
、ルーティング互換モードでsパラメーターを使用できることを示し、フレームワークはコントローラー名に対して十分な検出を実行せず、実行するコントローラーおよびメソッドを呼び出すことが可能であることを示します。
例: http:// site /? s =モジュール/コントローラ/メソッド
アクセス:
ペイロードの分析を見てください。
最初に、
すべてのユーザーパラメーターが、filterValueメソッドを呼び出すRequestクラスのインプットメソッドによって処理され、filterValueメソッドでcall_user_funcが使用されていることを知っている必要があります。これは、以前の記事の分析でも言及されました。
リクエストメソッドを見つける
thinkphp /ライブラリ/ think / App.phpのフォローアップ:402
フォローアップ
routeCheck()
はこのページにあります。このメソッドは最終的
に$ dispatchを返します
ブレークポイントを介して
このメソッドが/に置き換わっていることがわかります|
init()を引き続き確認
Url.phpを入力します
parseUrlを入力してください
入る
parseUrlPath()を入力してください
ここでは、URLから
[module / controller / operation] を取得したため、parseUrl()によって返されたルートが
index think \ Request inputになりました。
なぜですか?parseUrl()に戻ってルートを見つけます
結果として、thinkphp / library / think / App.phpの$ディスパッチが発生します:406 as
input()関数を直接呼び出し、Appクラスのrunメソッドを実行します。
こちらもご覧ください
そして、runメソッドのディスパッチクラス呼び出す
幹部thinkphp /ライブラリ/考える/ルートキー番号を呼び出す / /派遣Module.php:84、 その後、反射クラスを呼び出す
我々はフォローアップ
exec関数では、プログラムはリフレクションメカニズムを使用してクラスのメソッドを呼び出します。クラス、メソッド、パラメータはすべて私たちの管理下にあります。そしてプロセス全体は、リモートコード実行の脆弱性の直接の原因でもあるコントローラ名の合法性を検出するプログラムを見ていませんでした
すべてのパラメータは制御可能です。入力メソッドを呼び出します
入力方法は何度も言われてきました
input()を入力した後、$ this-> filterValue()を入力し続けます
rceを実装する
バグ修正
公式の修復方法は次のとおりです。コントローラ名の正当性を確認するために、正規表現[1](\ w)* $を追加し ます。
// 获取控制器名
$controller = strip_tags($result[1] ?: $config['default_controller']);
if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
}
最後に、マスター7月火の写真を使用
A-For- z↩︎