今天終於結束了 9 天的關西之旅 🇯🇵,玩得超累 XD。接下來繼續努力!
在第 7 天介紹 XSS 時有提到它和 CSRF 的組合技,今天來學習一下什麼是 CSRF。
大致上是指攻擊者引誘使用者點擊惡意網站的連結或按鈕,就可以利用使用者已登入某網站的狀態,對某網站做壞壞的事。
使用者在 A 銀行有 100 萬存款,而且電腦上已經登入了 A 銀行的網銀。
A 銀行的轉帳功能資訊如下
bank.a.com/transfer
POST
transfer_to
: 轉給誰amount
: 轉多少於是攻擊者設計了一個網站如下
<body>
<h1>參加銀行抽獎活動</h1>
<form action="https://bank.a.com/transfer" method="post">
<input type="hidden" name="transfer_to" value="attacker-account">
<input type="hidden" name="amount" value="1000000">
<input type="submit" value="點擊參加抽獎活動">
</form>
</body>
使用者按下抽獎按鈕的時候,也送出了一個看不見的表單到銀行的轉帳功能的 endpoint,100 萬就這樣被轉給攻擊者了💸
別擔心,當今流行的 Web 開發框架應該都內建了 CSRF 的保護機制,有一種是 server 會發一個 CSRF token 給使用者,送出表單的時候都需要帶這把 token,後端收到表單的時候會檢查是否符合。
CSRF token 還可以細分成有狀態(存在 server session)與無狀態(Double Submit Cookie),但因為時間問題今天先不討論 XD,後續如果有剩餘的篇幅我再一點詳細介紹。
OWASP 介紹 CSRF 的頁面也有列出一些常見的無效防禦方式,推薦大家去看看。
Cross-Site Request Forgery Prevention Cheat Sheet