脆弱性の概要
2020 年 1 月 10 日、ThinkPHP チームは、安全でない SessionId によって引き起こされる任意のファイル操作の脆弱性を修正するパッチ更新をリリースしました。この脆弱性により、ターゲット環境でセッションが有効になっている場合、攻撃者は任意のファイルを作成および削除することができ、特定の状況下ではシェルを取得することもできます。
影響を受ける具体的なバージョンは ThinkPHP6.0.0 ~ 6.0.1 です。
脆弱性の再現
ローカル環境では再現に ThinkPHP 6.0.1 PHP7.1.20 Apache を使用します。特定の状況下でテスト検証プログラムを実行するには、以下に示すように Web シェルを作成できます。
脆弱性分析
公式 github commit によると:
https://github.com/topthink/framework/commit/1bbe75019ce6c8e0101a6ef73706217e406439f2
したがって、セッション保存時にファイル書き込みが発生しているのではないかと推測されます。次に、vendor/topthink/framework/src/think/session/Store.php:254
をトレースします。
書き込み関数がここで呼び出されます。vendor/topthink/framework/src/think/session/driver/File.php:210 をフォローアップします。
writeFile 関数を呼び出して次のようにします。
これは実際にファイルを書き込む操作です。
引き続き逆のプロセスを実行して、ファイル名が制御可能かどうかを確認します。ファイル名は、最初の getId() によって取得された $sessionId の値から取得されます。 getId があるので、setId も存在します。関数の内容を見てください:
受信パラメータ $id が 32 ビットの長さに一致すると、値が設定されます$this->id に。 setId が呼び出される場所 (vendor/topthink/framework/src/think/middleware/SessionInit.php:46) を見てください。
ここでの $cookieName の値は PHPSESSID です。
$sessionId は Cookie 内の PHPSESSID という名前の値であるため、攻撃者によって制御可能となり、その結果、書き込まれたファイル名が制御可能になります。
書き込みファイル名は制御可能ですが、書き込み内容は制御可能ですか?分析の結果、書き込まれた内容はセッションの作成に使用された内容であることが判明しました。ただし、セッションの作成は実際のバックエンド ビジネス ロジックによって決定され、デフォルト環境ではセッションは作成されません。そのため、デフォルト環境では任意のファイルの書き込みはできません。
この脆弱性を詳細に分析したところ、この脆弱性によって任意のファイルが削除される可能性があり、ファイルの削除はバックエンドのビジネス ロジックへの依存度が低いことがわかりました。
まだvendor/topthink/framework/src/think/session/Store.php:254:
分析と検証を通じて、脆弱性が見つかりました(上記のように) 任意のファイルが削除される可能性もあります。
概要
ターゲット環境が Windows でセッションが有効な場合、任意のファイル削除攻撃に対して脆弱になります。
セッションがターゲット環境で開かれ、書き込まれたセッションが制御可能な場合、任意のファイル書き込み攻撃に対して脆弱になります。
関連するユーザーは、攻撃を避けるために、時間内に ThinkPHP6.0.2 バージョンにアップグレードすることをお勧めします。
php 中国語 Web サイト、多数の無料の thinkphp 入門チュートリアル 、オンライン学習へようこそ!
以上がThinkPHP6 の任意ファイル操作の脆弱性分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。