淺談HTML表單:CSRF 攻擊(理解轉載)
來自專欄 Miyas 技術學習小記
在老師文章的引導下,用自己的理解記錄下對CSRF 攻擊的理解,老司機若感過於簡單,請移步看若愚老師這篇包括解決辦法喲,嘿嘿~:
若愚:「每日一題」CSRF 是什麼?一、淺談CSRF 攻擊
其原理是攻擊者構造網站後台某個功能介面的請求地址,誘導用戶去點擊或者用特殊方法讓該請求地址自動載入。即
https://xxxx.com/gift/send?target=someone&giftId=ab231
用戶在登錄狀態下,就能給名為someone的用戶贈送禮品ab231
不過有沒有一種辦法讓用戶只要看到即使不點擊該網站也能自動送禮物給用戶?
可以利用圖片標籤可添加鏈接屬性的特徵,將該url加入src=""里實現這種誘導,即:
<img src="https://xxxx.com/gift/send?target=someone&giftId=ab231" alt="">
但是禮物雖然小,但贈送都是有歷史記錄的,用戶查看歷史記錄肯定會起疑心,能不能幫用戶刪除這條贈送記錄呢?經過測試,發現刪除贈送記錄的介面地址:
https://xxxx.com/gift/deleteRecord
其中,介面類型為post,請求參數為 { giftId:」ab231″}
構造一個可觸發該刪除贈送記錄介面地址的表單頁面
<form action = "https://xxxx.com/gift/deleteRecord" id="form" method="post" target="hiddenIframe"></form>
其中,用戶請求的網址為:
https://xxxx.com/gift/deleteRecord
這個請求被服務端接收後,會被誤以為是用戶合法的操作。對於 GET 形式的介面地址可輕易被攻擊,對於 POST 形式的介面地址也不能保證百分百安全,攻擊者可誘導用戶進入帶 Form 表單可用POST方式提交參數的頁面。
設置以下代碼觸發跳轉原始首頁功能,
<script> document.getElementById(form).submit(); location.href = "http://xxxx.com";</script>
即跳轉到http://xxxx.com,這樣用戶既在不知情的情況下贈送了禮品,又在不知情的情況下刪除了贈送記錄。
二、題外話:
type=hidden隱藏域的作用,結合 CSRF 攻擊來說明。
type=hidden隱藏域,作為校驗該用戶信息的一個隱藏值(判斷標準)。當用戶打開頁面後是看不見type=hidden相應的值,填寫用戶信息之後點擊提交時,用戶信息的數據(包括type=hidden值)隨即提交後台,打開後台則會展示代碼type=hidden所寫的相應元素屬性值。後台校驗type=hidden相應值如果是正確,即用戶提交為安全。
埋點(保護的參數)——瀏覽器提交後台有該參數作為校驗標準參考——若顯示錯值或無值,伺服器也將不承認所提交的數據;若為正確值,則說明該用戶獲取許可權,即為合法用戶,可防止CSRF攻擊
如圖所示:
推薦閱讀:
※CSRF防禦,token保存在伺服器session中,客戶端是如何獲取token?
※PHP加了Token驗證表單防止CSRF後還有必要做其它的防範嗎?
※Web 安全:CSRF 攻擊深入淺出(gitchat交流)
※如何用簡潔生動的語言理清XSS和CSRF的區別?
※記一次失敗 本地 csrf 演示文稿