ThinkPHP5.1 反序列化利用鏈


筆記里直接復制出來的
 
1 composer直接獲取框架代碼
 
➜  composer create-project --prefer-dist topthink/think tp5137
➜  cd tp5137
➜  vim composer.json # 把"topthink/framework": "5.1.*"改成"topthink/framework": "5.1.37"
➜  composer update
 
2 反序列化的利用點
  • 有一個內容完全可控的反序列化點,例如: unserialize(可控變量)
  • 存在文件上傳、文件名完全可控、使用了文件操作函數,例如: file_exists('phar://惡意文件')
 
 
3 反序列化鏈
3.0 存在反序列化的點,尋找有__desctruct方法的類,在對象析構時會自動執行其中的代碼
 
3.1 在 think\process\pipes\Windows 類的 __destruct 方法中調用了$this->removeFiles();
 
3.2 在$this->removeFiles() 中調用了file_exists($filename)
 
3.3 file_exists()需要字符串類型參數,在執行file_exists($filename)時會觸發類的__toString()
 
3.4 全局搜索__toString(),尋找可利用的__toString(),找到think\model\concern\Conversion
__toString 內調用了$this->toJson(),toJson()內調用了json_encode($this->toArray(), $options);
 
3.5 Conversion類內,在$this->toArray()中,存在$relation->visible($name),$relation 和 $name來自$this,可控
 
3.6 尋找有visible方法和__call方法的類,找到了think\Request 類,其中有__call,會執行array_unishift($args, $this);
call_user_func_array($this->hook[$method], $args);
 
同時 think\Request 類的 input 方法經常是鏈中一個非常棒的 Gadget ,相當於 call_user_func($filter,$data) ,但是由於array_unishift在參數數組開頭插入了一個對象,需要找一個調用input方法,並且第一個參數可控的函數傳入Request對象
 
3.7 找到$this->param 調用了input方法,找到isAjax 和 isPjax 方法調用了$this->param 並且第一個參數可控,構造完成
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM