ホームページ  >  記事  >  バックエンド開発  >  PHPデシリアライゼーションの文字エスケープの詳細な分析

PHPデシリアライゼーションの文字エスケープの詳細な分析

WBOY
WBOY転載
2022-04-14 12:06:495582ブラウズ

この記事では、PHP に関する関連知識を提供します。主に逆シリアル化文字エスケープに関する関連問題を紹介します。PHP シリアル化後の文字列が置換または変更され、文字列の長さが変更されると、次のようになります。常に最初にシリアル化され、その後置き換えられ、修正されます。一緒に見てみましょう。皆様のお役に立てれば幸いです。

PHPデシリアライゼーションの文字エスケープの詳細な分析

推奨学習: 「PHP ビデオ チュートリアル

エッセンス: 終了
カテゴリ: 文字数を増やす、文字数を減らす
共通点:

  1. php によってシリアル化された文字列が置換または変更され、文字列の長さが変化しました。
  2. 常に最初にシリアル化してから、置換と変更を実行します。操作

分類

#文字の増加

    ##アイデア:
  • 文字列形式によるシリアル化および特性の後、文字数によって後で認識される長さが決まります。
    属性を変更するには、属性を置換する必要があります。これは、渡された文字列によって制御できます。
    先行する二重引用符を閉じるには、それを渡します。構築する文字
    ただし、この時点では前の文字列の長さが一致しないため、構築は無効です
    解決策: 置換文字の長さの変化に応じて、構築された文字列が長さの範囲外であり、次の部分になります
    (置換中の長さの変換により、挿入された文字列のギャップが埋められます)
  • ヒント:
    フィルタリング後の各文字の文字数が元の文字よりも x 個多いと判断します
  1. 挿入されるターゲット部分文字列の長さ n を決定します
  2. 挿入された文字は n/x 回繰り返され、挿入された文字は文字が含まれます (建設コードの長さ ÷ 余分な文字の数)
    例:
  • 目標: オブジェクト内の値を変更します。たとえば、年齢は次のようになります。 20に変更されました
<?php function filter($string){
    $filter = &#39;/p/i&#39;;
    return preg_replace($filter,&#39;WW&#39;,$string);
}
$username = &#39;purplet&#39;;
$age = "10";
$user = array($username,$age);

var_dump(serialize($user));
echo "<pre class="brush:php;toolbar:false">";
$r = filter(serialize($user));
var_dump($r);
var_dump(unserialize($r));
?>
次の部分をテンプレートとして記録できます。質問を行うときに最初に出力します

var_dump(serialize($user));    # 序列化
echo "<pre class="brush:php;toolbar:false">";
$r = filter(serialize($user)); # 替换后序列化
var_dump($r);
var_dump(unserialize($r));     # 打印反序列化
各置換によって p が ww に変更されることがわかります。つまり、毎回さらに 1 文字が追加されます

これにより、長さ割り当て読み取りエラーと逆シリアル化中の出力エラーが発生します
PHPデシリアライゼーションの文字エスケープの詳細な分析 したがって、長さ読み取りの性質を利用して文字エスケープを構築することを検討してください

To 10 を 20 に変更します。まず、後で作成する文字列を決定します:

原字符串:";i:1;s:2:"10";}
目标子串:";i:1;s:2:"20";}
長さを決定します: 16 (つまり、これらの文字を次の属性に入れるには、文字列にはさらに 16 文字が必要です)

文字が 1 つ増えるたびに 16 p
が必要になるため、次のように渡します:

PHPデシリアライゼーションの文字エスケープの詳細な分析 結果出力:

PHPデシリアライゼーションの文字エスケープの詳細な分析

文字削減

値エスケープ

値フィルタリング、最初の値には最後のキーと値(左括弧まで)が含まれます

##例
    目標: 年齢を20に変更します

  • <?php function filter($string){
        $filter = &#39;/pp/i&#39;;
        return preg_replace($filter,&#39;W&#39;,$string);
    }
    $username = "ppurlet"
    $age = "10";
    $user = array($username,$age);
    
    var_dump (serialize($user));    # 序列化
    echo "<pre class="brush:php;toolbar:false">";
    $r = filter(serialize($user)); # 替换后序列化
    var_dump ($r);
    var_dump (unserialize($r));     # 打印反序列
    ?>
  • は上記のコードと似ていますが、2 つの p が 1 つの w に置き換えられ、文字が ## だけ削減される点が異なります。 # 同じ値が対応しない場合、逆シリアル化は失敗します


username: エスケープを構築するために必要なコード

age: エスケープ コードを構築する


A 続いて受信年齢文字列を入力し、構築の長さを計算します

PHPデシリアライゼーションの文字エスケープの詳細な分析第一步

、これらの 13 文字を占めることになります PHPデシリアライゼーションの文字エスケープの詳細な分析 2 p ごとに 1 w になり、これは 1 ビットをエスケープすることに相当します。したがって、13*2=26 p と入力します。文字長識別子は次のようになります。 26 は 13 w になり、次の 13 文字が残りの 13 ビットを占めます


ペイロード: PHPデシリアライゼーションの文字エスケープの詳細な分析

username='pppppppppppppppppppppppppp'
age=A";i:1;s:2:"20";}

要約

増加文字数

##最初のパラメータの末尾の引用符から最後の右括弧 (対象文字列) までの長さを見てください。n
  1. それぞれを見てください。置換インクリメント
      #2 番目のパラメータで構築します
    1. クロージャを先頭に設定します: A" (構築方法は後で検討します)
    2. 最初から何文字あるかを見てください。 A への最初のパラメータの後の右引用符 n
    3. 置換により x 文字が減ります
  2. オブジェクトの作成:
  3. 最初のパラメータは n*(x 1) 個の置換文字で渡されます
      2 番目のパラメーターはコンストラクターに渡されます。文字列
    1. 推奨学習: "
    2. PHP ビデオ チュートリアル
    3. "

以上がPHPデシリアライゼーションの文字エスケープの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。