この記事では、PHP に関する関連知識を提供します。主に逆シリアル化文字エスケープに関する関連問題を紹介します。PHP シリアル化後の文字列が置換または変更され、文字列の長さが変更されると、次のようになります。常に最初にシリアル化され、その後置き換えられ、修正されます。一緒に見てみましょう。皆様のお役に立てれば幸いです。
推奨学習: 「PHP ビデオ チュートリアル 」
エッセンス: 終了
カテゴリ: 文字数を増やす、文字数を減らす
共通点:
<?php function filter($string){ $filter = '/p/i'; return preg_replace($filter,'WW',$string); } $username = 'purplet'; $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 文字が追加されます
これにより、長さ割り当て読み取りエラーと逆シリアル化中の出力エラーが発生します
したがって、長さ読み取りの性質を利用して文字エスケープを構築することを検討してください
原字符串:";i:1;s:2:"10";} 目标子串:";i:1;s:2:"20";}長さを決定します: 16 (つまり、これらの文字を次の属性に入れるには、文字列にはさらに 16 文字が必要です)
文字が 1 つ増えるたびに 16 p
が必要になるため、次のように渡します:
結果出力:
<?php function filter($string){ $filter = '/pp/i'; return preg_replace($filter,'W',$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)); # 打印反序列 ?>
username: エスケープを構築するために必要なコード
A 続いて受信年齢文字列を入力し、構築の長さを計算します
、これらの 13 文字を占めることになります 2 p ごとに 1 w になり、これは 1 ビットをエスケープすることに相当します。したがって、13*2=26 p と入力します。文字長識別子は次のようになります。 26 は 13 w になり、次の 13 文字が残りの 13 ビットを占めます
ペイロード:
username='pppppppppppppppppppppppppp' age=A";i:1;s:2:"20";}
要約
以上がPHPデシリアライゼーションの文字エスケープの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。