【ネットワークセキュリティ】デシリアライゼーション脆弱性の詳細分析

ブロガーのニックネーム: Jumping Stairs Penguin
ブロガーのホームページ リンク:ブロガーのホーム ポータル

ブロガーのコラム ページへのリンク:コラム ポータル -- ネットワーク セキュリティ テクノロジ
の作成 当初の意図: このブログの本来の意図は、技術的な友人と通信することです. 誰のテクノロジにも欠点があり、ブロガーも同じです. 謙虚にアドバイスを求めてください. 友人指導します。
ブロガーのモットー: 光を発見し、光をたどり、光になり、光を放ちます;
ブロガーの研究方向: 侵入テスト、機械学習;
ブロガーのメッセージ: ご支援いただきありがとうございます, あなたのサポートは私の原動力です.前進する。

 1.シリアライズとは?

シリアル化は、変数またはオブジェクトを文字列に変換するプロセスです。

2. デシリアライゼーションの脆弱性

1 はじめに

    オブジェクトを送信可能な文字列に変換することであり、送信を容易にすることが目的です。このクラスにいくつかの変数を持つクラスを作成したとします。クラスがインスタンス化されると、使用プロセスの一部の変数値が変更されます。この変数は将来のある時点で使用されます. このクラスが破棄されないようにして、次に使用するときに再度呼び出されるのを待つと、システム リソースが浪費されます. 小さなプロジェクトを書くときは、あまり影響がないかもしれませんが、プロジェクトが大きくなるにつれて、いくつかの小さな問題が拡大され、多くの問題が発生します。この時点で、PHP は、このオブジェクトをシリアライズして文字列として保存し、使いたいときにそれを出すことができると教えてくれました。PHP デシリアライゼーションについて話すとき、基本的には、serialize() と unserialize() の 2 つの関数を中心に展開します。

 

2. デシリアライゼーションの脆弱性の原則

serialize() と unserialize() には、PHP の内部実装に抜け穴はありません.逆シリアル化の抜け穴が発生する理由は、アプリケーションがオブジェクト、魔法の関数、およびシリアライゼーション関連の問題を処理しているためです.

unserialize() に渡されたパラメーターが制御可能な場合、ユーザーは慎重に構築されたペイロードを注入できます。デシリアライズ時に、オブジェクト内のいくつかの魔法のメソッドがトリガーされ、予期しない損害が発生する可能性があります。

 class S{
        public $test="pikachu";
    }
    $s=new S(); //创建一个对象
    serialize($s); //把这个对象进行序列化

3. 連載文字の意味

O:1:"S":1:{s:4:"test";s:7:"pikachu";}
        O: オブジェクトを表す
        1: オブジェクト名の長さを表す文字 (つまり、「S」)
        S: オブジェクトの名前
        1: オブジェクト内の変数を表す
        s: データ型 (string string)
        4: 変数名の長さ
        test: 変数名
        s: データ型 (ピカチュウは文字列とも)
        7:変数値の長さ
        ピカチュウ:変数値

4.連載形式

O:strlen(クラス名): クラス名: クラスの変数の数: {型: 長さ: 値; 型: 長さ: 値...}

他のタイプのデータのシリアル化された形式は次のとおりです。

String类型 :s:size:value
Integer类型 :i:value
Boolean类型 : b:value (保存1或0)
Null型 :N
Array :a:size:{key definition;value definition}

もう 1 つの注意点は、異なるフィールドを最後に分割することです。これは逆シリアル化にとって非常に重要です。

5.シリアライズマジック機能

シリアライゼーションとデシリアライゼーションには問題はありませんが、デシリアライゼーションの内容がユーザー制御であり、PHP のマジック関数がバックグラウンドで不適切に使用されると、セキュリティ上の問題が発生します.
  いくつかの一般的なマジック関数: // は自動的に呼び出されますさまざまなシナリオ
        __construct() は、オブジェクトの作成時に呼び出されます

        __destruct()当一个对象销毁时被调用

        __toString()当一个对象被当作一个字符串使用

        __sleep() 在对象在被序列化之前运行

        __wakeup将在序列化之后立即被调用

6. 脆弱性の例:

  class S{
            var $test = "pikachu";
            function __destruct(){
                echo $this->test;    //一旦S这个类被创建,则将会自动使用魔法函数。当对象被销毁时,则下面的操作会被自动执行} }
        $s = $_GET['test'];
        @$unser = unserialize($a);

      ペイロード [有効な攻撃ペイロードは、エクスプロイトに使用する ShellCode に含まれる主な機能コードです]: O:1:"S":1:{s:4:"test";s:29 :"<script>alert( 'xss')</script>";}
デシリアライズされたコンテンツはユーザーのフロントエンドから送信されます。フロントエンドから送信されたコンテンツに悪意のあるデシリアライズされたコンテンツが挿入された場合、バックグラウンドでコンテンツが検出されることが検出された場合逆シリアル化されたインターフェイスを介して XSS 脆弱性が発生します。

第三に、デシリアライゼーションの脆弱性の修復

1. php関連のパラメータを確実に設定
      する.phpの設定ファイルにdisable_functions=設定があります.これにより一部のphp機能が禁止されます.
サーバーはこれを利用してphp実行コマンド機能を禁止します.

例:
disable_functions =system,passthru,shell_exec,exec,popen は、これらの関数を使用してシステム コマンドを実行することを無効にします。

2.ミドルウェアのアップグレード

3. 入力変数を厳密に制御し、マジック関数を厳密に使用する

おすすめ

転載: blog.csdn.net/weixin_50481708/article/details/127101222