PHP - Deserialization + Autoload Classes
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
まず、オートロードクラスが何であるかを確認する必要があります。
私たちは、phpggc
内にガジェットに脆弱なライブラリがないウェブアプリでPHPデシリアライズを見つけた状況にいます。しかし、同じコンテナ内には脆弱なライブラリを持つ別のComposerウェブアプリがありました。したがって、目標は他のウェブアプリのComposerローダーをロードし、それを悪用してデシリアライズに脆弱なウェブアプリのライブラリを攻撃するガジェットをロードすることでした。
手順:
デシリアライズを見つけ、現在のアプリコードにはガジェットがない
次のような**spl_autoload_register
関数を悪用して、.php
拡張子のローカルファイルをロードする**
そのために、クラス名が**$name
内に入るデシリアライズを使用します。シリアライズされたオブジェクトのクラス名には"/"や"."を使用できませんが、コードはアンダースコア**("_")をスラッシュ("/")に置き換えています。したがって、tmp_passwd
のようなクラス名は/tmp/passwd.php
に変換され、コードはそれをロードしようとします。
ガジェットの例は:**O:10:"tmp_passwd":0:{}
**です。
もしファイルアップロードがあり、.php
拡張子のファイルをアップロードできる場合、この機能を直接悪用して、すでにRCEを取得することができます。
私の場合、そのようなものはありませんでしたが、同じコンテナ内に**phpggc
ガジェットに脆弱なライブラリ**を持つ別のcomposerウェブページがありました。
この別のライブラリを読み込むには、まずその別のウェブアプリのcomposerローダーを読み込む必要があります(現在のアプリケーションのものでは他のライブラリにアクセスできません)。アプリケーションのパスを知っていれば、次のように非常に簡単に実現できます:O:28:"www_frontend_vendor_autoload":0:{}
(私の場合、composerローダーは/www/frontend/vendor/autoload.php
にありました)
さて、他のアプリのcomposerローダーを読み込むことができるので、使用するためのphpgcc
ペイロードを生成する時が来ました。私の場合、Guzzle/FW1
を使用し、これによりファイルシステム内の任意のファイルを書き込むことができました。
注:生成されたガジェットは機能しませんでした。機能させるために、chain.php
のphpggcペイロードを修正し、すべての属性をプライベートからパブリックに設定しました。そうしないと、文字列をデシリアライズした後、作成されたオブジェクトの属性には値がありませんでした。
これで、他のアプリのcomposerローダーを読み込む方法があり、機能するphpggcペイロードも手に入れましたが、ガジェットが使用されるときにローダーが読み込まれるためには、同じリクエスト内でこれを行う必要があります。そのため、次のように両方のオブジェクトを含むシリアライズされた配列を送信しました:
最初にローダーが読み込まれ、その後ペイロードが表示されるのがわかります。
さて、ファイルを作成して書き込むことができますが、ユーザーはウェブサーバー内の任意のフォルダーに書き込むことができません。したがって、ペイロードに示されているように、PHPは**system
を呼び出し、base64を使用して/tmp/a.php
に作成されます。次に、他のウェブアプリのコンポーザーローダーを読み込むために、最初のタイプのペイロードを再利用して、生成された/tmp/a.php
**ファイルを読み込みます。それをデシリアライズガジェットに追加するだけです:
ペイロードの概要
同じコンテナ内の別のウェブアプリのcomposerオートロードを読み込む
phpggcガジェットを読み込む ことで、他のウェブアプリのライブラリを悪用する(最初のウェブアプリはデシリアライズに脆弱で、ライブラリにガジェットがなかった)
ガジェットは、/tmp/a.phpに悪意のあるコマンドを含むPHPペイロードのファイルを作成する(ウェブアプリのユーザーは、どのウェブアプリのフォルダーにも書き込むことができない)
ペイロードの最終部分は、生成されたPHPファイルを読み込むことでコマンドを実行する
私はこのデシリアライズを2回呼び出す必要があった。私のテストでは、最初の時に/tmp/a.phpファイルが作成されたが読み込まれず、2回目に正しく読み込まれた。
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)