筆記里直接復制出來的
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 並且第一個參數可控,構造完成