# SSTI Lab7
這題是 Server-Side Template Injection (SSTI) with Custom Exploit,你需要透過模板漏洞,結合目標程式邏輯,最終刪除 Carlos 的檔案 `/home/carlos/.ssh/id_rsa`。
可以使用以下認證登錄自己的帳戶:`wiener:peter`
一樣先進入網站並登入。


這題登入之後除了可以改使用者名字之外還可以上傳照片,但還不確定能幹嘛,所以先透過過去有試過的方法去進行測試(資料不多的情況下先走保守路線,再一步步去找新線索)。

可以發現我們依然會顯示名稱,所以回到更改使用者名字的頁面,在前面的章節能透過這樣的方法進行注入,因此我這裡也使用相同的方式來試誤。


顯然是可以注入的,所以我看看能不能直接抓他的檔案內容(這步比較跳脫,就是單純通靈戰術)。

一樣是 302,不過在 Histroy 中出現了新的資訊。

這裡直接 GET 過去看看。

可以看到我們上傳的照片(???),這裡我還沒想到甚麼,但能確定我們可以讀取系統裡的檔案,接著我想說先嘗試看看上傳照片檔可以做甚麼。


結果他直接報錯,但有個 .php,或許有用,所以我直接去看看這個檔案內容。
```
{{ user.setAvatar('/home/carlos/User.php', 'image/jpg') }}
```


一路看下來,發現這裡特別詭異:

這裡執行了三件事:
- `readlink($this->avatarLink)` → 拿到 avatar 檔案的「實際檔案路徑」。
- 如果是 symlink,就解開。
- 指定的 avatar 是 `/home/carlos/.ssh/id_rsa`,所以這邊就是拿那個路徑。
- `rm(...)` → 呼叫自訂刪除函式 `unlink()` 去刪檔案。
- 所以這一步就是直接 `unlink("/home/carlos/.ssh/id_rsa")`。
- `delete()` → 寫入 disabled 檔案(不是我們的重點)。
這個 gdprDelete() 就是我們要用來刪掉 Carlos 的私鑰的方法,所以我們先把 Carlos 的私鑰設為 avatar。
```
{{+user.setAvatar('/home/carlos/.ssh/id_rsa',+'image/jpg')+}}
```

接著刪除他。


---