Web 資安漏洞大可不必 - Request Forgery 攻防之道
2022-11-20
系列文章介紹 Web 常見的資安漏洞,說明漏洞的實作方式以及在 .NET 環境該如何防禦的最佳實務。本次介紹的內容為 Request Forgery,包含 CSRF 以及 SSRF。
說明
Cross Site Request Forgery, CSRF
與 XSS 相同,同樣是利用惡意的 URL,但不需要透過 javascript Script,當使用者連結惡意連結會利用瀏覽器對於執行者的信任 (cookie) 來成功執行攻擊者的意圖。
<a href="https://bank.sdwh.dev/transer?to=hacker&amount=9999">最新消息</a>
除了 GET Method 外,POST Method 形式的 CSRF 也存在:
<form action="https://bank.sdwh.dev/transfer" method="POST">
<input type="hidden" name="to" value="hacker">
<input type="hidden" name="amount" value="9999">
<iinput type="submit" value="取得免費電子書">
</form>
防禦方式
- 避免所有的「交易」行為都透過 GET Method 完成
- 關鍵的交易行為 (變更密碼、刪除帳號),設計重新驗證身分機制
- 檢查 Request Header Origin 以及 Referer
- 使用 CSRF Token
- Origin
- 顯示 POST Request 是由何頁面發起 (URL Page)
- Referer
- 顯示 Request 是由何處發起 (URL)
- 對於 Cookie 使用 SameSite 屬性
- SameSite=Strict
- 會通知瀏覽器,外部網域的的 Request 不代入 Cookie
- SameSite=Lax
- 會通知瀏覽器,外部網域的的 POST Request 不代入 Cookie
<configuration>
<system.web>
<httpCookies
sameSite="[Strict|Lax|None|Unspecified]"
httpOnlyCookies="[ture|false]"
requireSSL="[true|false]" />
<system.web>
<configuration>
.NET Solutions
ASP.NET MVC 使用 Scaffolding 的 POST 預設會自動帶入 [ValidateAntiForgeryToken]
,避免 CSRF。
View
@using (Html.BeginForm("Action", "Controller")){
@Html.AntiForgeryToken()
}
Controller
[ValidateAntiForgeryToken]
public ActionResult Action(){ }
而需要注意的是 GET 所搭配的 Controller 不要提供會改變狀態 (新增、更新、刪除) 的交易行為,此外也要檢查 GET 所帶入的查詢字串。
Server Side Request Forgery, SSRF
利用對外服務的伺服器端,攻擊取得內部資源的攻擊方式,攻擊者透過的方式可能是藉由 URL 的操作,讓對外服務伺服器解析與處理 URL 的過程,達到取得或影響內部資源。SSRF 並不限於使用 HTTP 協定達成,FTP, SMB 及 SMTP 都有可能被使用。
防禦方式
OWASP Cheatsheet 將 SSRF 分為 Web AP 會對有限資源存取與任何資源存取的情境,提供不同的防禦方式建議。
在有限資源存取的情況,因為可以預期對外服務的伺服器預期連線的資源對象,所以可以藉由正向表列 (白名單、Allow List) 的方式進行設定。
並且檢查 Request 對於資源存取有影響的項目,是否符合 String, IP, Domain 以及 URL 格式。
此外在縱深防禦上,除了 Application 的檢查,Network 直接藉由防火牆限制不允許存取非正向表列的伺服器。
.NET Solutions
資源的檢查工具
IPAddress.TryParse(String, out IPAddress)
Uri.CheckHostName(String)
相關連結
基於角色的訪問控制(RBAC):演進歷史、設計理念及簡潔實現
參考資料
https://owasp.org/www-community/attacks/Server_Side_Request_Forgery
https://owasp.org/www-community/vulnerabilities/