這陣子在幹壞事的時候才發現國內一些站台都沒有處理好... XD (我絕對沒有說是哪些站喔,自己裝 Web Developer 用他的 View Form Information 看吧 XD)
直接以程式碼舉例。我在我自己的站上放一個 html,裡面有一個 form 與一段 javascript,會自動 submit 出去:
<form
action="http://dingding.example.org/delete-my-account.php"
id="myform" method="post" name="myform">
<input ... /> (某些需要的欄位)
</form>
<script>
var f = document.getElementById("myform");
f.submit();
</script>
如果網站沒有正確處理,就可以讓別人幫你砍帳號,或是發文章 (Spam 的好方法?),或是其他事情。這是因為瀏覽器連到 dingding.example.org
的時候會帶 cookie 進去。
解法也很簡單,用類似 Double Cookie 的方式解決。以 PHP 為例,產生 form 的時候多送一個 hidden input:
<input type="hidden" name="doublecookie"
value="<?= md5(session_id()) ?>" >
然後在接收 form 的程式碼裡面判斷:
if (!isset($_POST["doublecookie"]) ||
$_POST["doublecookie"] != md5(session_id())) {
// not match, break it
}
你可以看到 Google 的 Blogger 就是用類似的方法做的。在 securityToken
(被我劃掉的地方) 的地方:(點小圖看 1024x1024 的大圖,不過我為了塞到一頁裡面,字縮小了兩次...)
CSRF/XSRF:)
dingding.example.org 還真是非常鮮明的實例啊 XD
如果有分某一長相的 url 全部是 update 的動作的話, 直接從 web server 上對那一區 check referer 也許是最快的做法? :Q
不行,因為現在愈來愈多 firewall 會過濾 Referer 送出。
基本上, CSRF 的利用一定都是針對特定 Web App 的 Target Attack, 所以 Hidden Value 的值仍可能在 CSRF Code 裡面實作並解析 Hidden Value (利用 iframe) 並模擬含Hidden Value格式來發送 Request.
那如果在form page裡面加javascript
讓他把自己擺到_top
這樣能不能解決?
這實在是太可怕啦~~