前言#
異次元発卡は、サードパーティの開発者がプラグインを開発してウェブサイトの機能を拡張することをサポートし、プラグインの有料化による収益を得ることができます。プラグインの制限は、そのプラグインを購入していない場合、ストアからインストールすることができないというものです。プラグインを入手し手動でインストールしても、そのプラグインを有効にすることはできません。開発者が開発したプラグインがストアに登録されていない場合も使用することはできません。
分析#
/kernel/kernel.php でプラグインの初期化が行われていることがわかります。まず、プラグインをスキャンし、初期化関数を呼び出します。
//プラグインライブラリ
if (\Kernel\Util\Context::get(\Kernel\Consts\Base::STORE_STATUS) && \Kernel\Util\Context::get(\Kernel\Consts\Base::IS_INSTALL)) {
require("Plugin.php");
//プラグインの初期化
\Kernel\Util\Plugin::scan();
Initialize();
//プラグインの初期化
hook(\App\Consts\Hook::KERNEL_INIT);
}
重要なのは、この Plugin.php ファイルです。
ファイルを開くと、ファイルが暗号化されていることがわかります。そのため、一つのアプローチは、ファイルを復号化し、関連するチェックコードを変更することです。
踏み込む#
このファイルは Z5 暗号化を使用しています。これは、Z-Blog アプリケーションセンターが提供する PHP 暗号化ソリューションであり、Z-Blog アプリケーションセンターで唯一サポートされている暗号化ソリューションです。
復号化の難易度は非常に高いです。
さまざまな処理を経て、人間が理解できるコードに変換された後、これは PHP で書かれた仮想マシンであることがわかります。実際のコードは仮想マシンのコードに変換され、仮想マシンで実行されます。元のコードを取得するには、仮想マシンを逆アセンブルする必要があり、その難易度は非常に高いです。
アイデア#
復号化されたコードに苦しんだ数日後、昼寝中にひらめきました。なぜプラグインシステムを再構築してみないのかというアイデアです。
最初はこの考えが現実的ではないと感じました。なぜなら、プラグインシステムを再構築するには多くの作業が必要だからです。そのため、まずは既存のプラグインシステムの分析から始めることにしました。
分析の結果、プラグインシステムは主にフックメカニズムに依存しており、フック関数の登録とフック関数のトリガーによってプラグインの機能が実現されていることがわかりました。
/kernel/Util/Plugin.php で完全なフックの登録とフックのトリガーの関数を見つけましたが、これらは暗号化されていないため、興奮しました。
最初に Initialize (); という関数を削除してみましたが、不正なプラグインは正常に起動できましたが、フックはトリガーされませんでした。
さらに、hook 関数を分析しました。
public static function hook(int $point, mixed &...$args)
{
if (Context::get(\Kernel\Consts\Base::STORE_STATUS) && \Kernel\Util\Context::get(\Kernel\Consts\Base::IS_INSTALL)) {
$list = _Point($point);
foreach ($list as $item) {
$instance = _Instance($item);
$ref = new \ReflectionClass($instance);
$reflectionProperties = $ref->getProperties();
foreach ($reflectionProperties as $property) {
$reflectionProperty = new \ReflectionProperty($instance, $property->getName());
$reflectionPropertiesAttributes = $reflectionProperty->getAttributes();
foreach ($reflectionPropertiesAttributes as $reflectionAttribute) {
$ins = $reflectionAttribute->newInstance();
if ($ins instanceof \Kernel\Annotation\Inject) {
di($instance);
}
}
}
$result = call_user_func_array([$instance, $item['method']], $args);
if ($result) {
return $result;
}
}
}
}
キー値を使用してフック関数を取得する関数_Point ($point) は、以前の暗号化ファイルで定義されていることに気づきました。var_dump を使用して返り値を取得し、必要に応じて形式を変更することで回避できます。
クラック#
/kernel/Util/Plugin.php の hook 関数を以下のように変更すると、不正なプラグインを有効にすることができます。
public static function hook(int $point, mixed &...$args)
{
if (Context::get(\Kernel\Consts\Base::STORE_STATUS) && \Kernel\Util\Context::get(\Kernel\Consts\Base::IS_INSTALL)) {
//$list = _Point($point);
$list = Plugin::$container['hook'][$point];
//var_dump($list,$point);
foreach ($list as $item) {
$instance = _Instance($item);
$ref = new \ReflectionClass($instance);
$reflectionProperties = $ref->getProperties();
foreach ($reflectionProperties as $property) {
$reflectionProperty = new \ReflectionProperty($instance, $property->getName());
$reflectionPropertiesAttributes = $reflectionProperty->getAttributes();
foreach ($reflectionPropertiesAttributes as $reflectionAttribute) {
$ins = $reflectionAttribute->newInstance();
if ($ins instanceof \Kernel\Annotation\Inject) {
di($instance);
}
}
}
$result = call_user_func_array([$instance, $item['method']], $args);
if ($result) {
return $result;
}
}
}
}
同時に、/kernel/Plugin.php ファイルを削除し、/kernel/kernel.php から以下の行を削除することをお勧めします。
if (\Kernel\Util\Context::get(\Kernel\Consts\Base::STORE_STATUS) && \Kernel\Util\Context::get(\Kernel\Consts\Base::IS_INSTALL)) {
//require("Plugin.php");//この行を削除
//プラグインの初期化
\Kernel\Util\Plugin::scan();
//Initialize();この行を削除
//プラグインの初期化
hook(\App\Consts\Hook::KERNEL_INIT);
}
その他#
異次元発卡を使用しないことをお勧めします。多くの脆弱性が存在し、私の手元には公開されていない脆弱性がいくつかあります。賢明な人々がこれらの脆弱性を見つけることは間違いありませんので、カードの安全性のためにも使用を中止してください。
もし異次元発卡に脆弱性がないと信じているなら、私と議論しないでください。自分で続けて使用してください。
プラグインが盗まれるのを防ぐ他のメカニズムがあるかどうかはわかりませんが、私のテストでは使用できるようになりました。プラグインは他の人のものを使う必要があります。