初心者のための不安定な逆シリアル化


導入


OWASPによって報告された一番上の重要な問題の位置高さの不安定な逆シリアル化数字.
この記事では、私は不安定な逆シリアル化の基礎に触れます.
今日では、多くの場合、他の構成要素を格納したり通信したりするためのデータの転送が必要となる.
アプリケーションは、特定の形式でデータを転送し、他方、データを受け取るアプリケーションは、標準形式に変換する必要があります.
SideIrializationは、コンピュータプログラムによって読まれて、使用されることができる形式にシリアライズされたデータを変換するプロセスです.オブジェクト直列化は反対を参照して、オブジェクトがそのオブジェクトを保存するか、または送信するためにバイトのストリームに変換されるプロセスです.

不安定な逆シリアル化は、アプリケーションが悪意のあるデータを逆シリアル化するときに発生する脆弱性です.

なぜこの欠陥は面白いですか?


不安定な逆シリアル化は、攻撃者がターゲットシステム上で任意のコードを実行できるようにします.悪意のあるシリアル化されたオブジェクトを作り出し、ターゲットシステムに送信することで、これを行うことができます.私
ウェブサイトがユーザー制御可能なデータを逆シリアル化するとき、これは不安定な逆シリアル化として知られています.
重要な脆弱性であることに加えて、彼らは防御するのは難しい.
シリアル化されたオブジェクトを完全に別のクラスのいずれかに置き換えることも可能です.
驚いたことに、どんなクラスが予想されても、ウェブサイトに公開されているクラスのオブジェクトは逆シリアル化され、作成されます.
その結果、安全でない逆シリアル化はしばしば「オブジェクト注入」脆弱性と呼ばれます.
予期しないクラスのオブジェクトを使用する場合は、例外をスローすることができます.
しかし、この時点で既に危害を加えていたかもしれません.
多くの逆シリアル化ベースの攻撃は、逆シリアル化プロセスが完了する前に行われます.
これは、ウェブサイトの独自の機能が悪意のある項目と直接相互作用しない場合でも、逆シリアル化プロセスが攻撃を開始する可能性があることを意味します.
その結果、論理が非常にタイプされた言語に基づくウェブサイトは同様にこれらの戦術に弱いかもしれません.

どのように不安定な逆化欠陥が出現するか?


攻撃者がアプリケーションによって逆シリアル化されているシリアル化されたデータを変更することができるとき、不安定な逆シリアル化脆弱性が発生します.
つの主要な理由:
  • 信頼できないソースからデータを読み込みます.
  • 検証やサニテーションなしでデータを読む.
  • これは、攻撃者がデータを逆シリアル化するとき、アプリケーションによって実行される悪意のあるコードを注入することができます.
    PHPで書かれた脆弱なコードを取りましょう.
    <?php 
        class PHPObjectInjection{
            public $inject;
            function __construct(){
            }
            function __wakeup(){
                if(isset($this->inject)){
                    eval($this->inject);
                }
            }
        }
        if(isset($_REQUEST['r'])){  
            $var1=unserialize($_REQUEST['r']);
            if(is_array($var1)){
                echo "<br/>".$var1[0]." - ".$var1[1];
            }
        }
        else{
            echo ""; # nothing happens here
        }
    ?>
    
    magic methodは、オブジェクトの特定の操作が行われたときにPHPの既定の動作を変更する特別なメソッドです.不安定な逆シリアル化を利用するために、PHPコードでそれらを見つけようとします.
  • ChangRage wakeup ()は、オブジェクトがアンシリアライズされています.
  • オブジェクトが削除されるとき、
  • CherrError ().
  • オブジェクトが文字列に変換されるときは、
  • Chertle ToString ()を使用します.
  • PHPはオブジェクトのシリアル化をサポートしていますので、攻撃者は影響を受けるUnserialize ()メソッドに任意のシリアル化された文字列を供給し、任意のPHPオブジェクトをアプリケーションスコープに注入します.
    コードを説明しましょう.
    最初に、phpobjectInjectionという名前のクラスを作成します.次に、マジック関数のウェイクアップを行います.
    これがコードの主な機能です.このコードを利用するには、コードを少し変更する必要があります.
    "Inject "パラメータに値を代入するpublic $inject="system('ls');";
    クラスの最後に新しいオブジェクトを作りました$foo = new PHPObjectInjection();次に、シリアル化オブジェクトの値を出力します.echo serialize($foo);
    これは、印刷の結果です.O:18:"PHPObjectInjection":1:{s:6:"inject";s:13:"system('ls');";}コードが「wakeup」機能を呼ぶとき、wilは注入されたOSコマンドを実行します.echo $foo->__wakeup();
    結論として、逆シリアル化脆弱性に対して保護する最善の方法は、完全にユーザー入力を逆シリアル化することを避けることです.ユーザー入力を逆シリアル化する必要がある場合は、データが改ざんされていないことを確認するための措置をとり、汎用逆シリアル化機能を使用しないでください.目標は、ユーザー入力の逆シリアル化を防ぐことです.
    次の記事では、詳細については不安定な逆シリアル化を説明し、脆弱なJavaコードを利用しようとします.