1. 程式人生 > >跨站點請求偽造(CSRF)

跨站點請求偽造(CSRF)

googl 不能 csr bsp 提取 返回 head afa 多種方式

CSRF(Cross Site Request Forgery)跨站點請求偽造:攻擊者誘使用戶在訪問 A 站點的時候點擊一個掩蓋了目的的鏈接,該鏈接能夠在 B 站點執行某個操作,從而在用戶不知情的情況下完成了一次對 B 站點的修改。

CSRF 實現

Cookie 策略

Cookie 分為 Session Cookie(臨時 Cookie) 和 Third-party Cookie(本地 Cookie)。本地 Cookie 有失效時間,在失效時間內都可以使用。臨時 Cookie 則在瀏覽器關閉後立即失效。CSRF 攻擊過程中,用戶瀏覽器將上傳 Cookie 作為認證信息(無需認證的除外)。如果用戶同時正在訪問 B 站點,那麽就有活躍的臨時 Cookie 將被上傳。然而,如果用戶並未打開 B 站點,但存有未失效的本地 Cookie,根據流量器安全策略的不同(IE 默認禁止在<img>、<iframe>、<script>、<link>等標簽中發送本地 Cookie,Firefox 默認允許發送本地 Cookie;默認會攔截本地 Cookie 的瀏覽器:IE 6/7/8,Safari;默認不攔截本地 Cookie 的瀏覽器:Firefox 2/3,Opera,Google Chrome,Android),本地 Cookie 可能被上傳認證,導致攻擊成功。【安全建議:及時清除瀏覽器數據,及時關閉瀏覽過的網站】

P3P 頭

The Platform for Privacy Preferences,P3P Header 是 W3C 制定的一項關於隱私的標準。如果網站返回給瀏覽器的 HTTP 頭中包含有 P3P 頭,則將允許瀏覽器發送本地 Cookie。在 IE 下即使是<iframe>、<script>等標簽也將不再攔截本地 Cookie 的發送。由於 Cookie 是以域和 path 為單位設置的,因此 P3P 頭設置後對 Cookie 的影響將擴大到整個域中的所有頁面。【安全建議:在 CSRF 的防禦中不能依賴於瀏覽器對第三方 Cookie 的攔截策略,因為如果設置了 P3P 頭,則瀏覽器自身的攔截策略將失效】

GET 請求和 POST 請求

雖然常見的 CSRF 都由發送 GET 請求的方式實現攻擊,但 POST 請求也是可以被利用來做 CSRF 攻擊的。如果站點沒有指定提交數據的請求方式,那麽 GET 和 POST 均可發送控制請求。如果只能用 POST 請求,最簡單的方法是,在頁面中隱含地構造一個 form 表單,然後使用 JavaScript 自動提交這個表單。即,如果 A 站點為攻擊者所控制,則只需讓鏈接觸發一個由 JavaScript 發送 POST 請求的動作;如果 A 站點非攻擊者所能控制,則只需讓鏈接指向一個能用 JavaScript 發送 POST 請求的 X 站點,由 X 站點做媒介,發送惡意請求的時候帶上 B 站點的本地/臨時Cookie。

Flash CSRF 和 CSRF Worm

Flash 有多種方式能夠發起網絡請求:POST、getURL、loadVars 等。IE 6/7 中,Flash 發送的網絡請求可以帶上本地 Cookie,IE 8 起禁用了該功能。

經過精心設計,CSRF 漏洞也可以用於蠕蟲攻擊——比如傳播消息。

CSRF 防禦

驗證碼

優點:簡單有效

缺點:用戶體驗不佳

Referer Check

Referer Check 可被用於檢查請求是否來自合法的“源”。常見的互聯網應用,頁面與頁面之間都具有一定的邏輯關系,這種關系使得每個正常請求的 Referer 具有一定規律。檢查 Referer 可以有效地防禦跨站點的請求偽造。

缺陷:然而服務器並非總是能夠提取到 Referer 屬性,很多用戶處於隱私保護的考慮,限制了 Referer 的發送,某些情況下瀏覽器也不會發送 Referer(比如 HTTPS 跳轉到 HTTP)。

Anti CSRF Token

CSRF 的本質原因是重要操作的所有參數都是可以被攻擊者猜測到的。因此 Anti CSRF Token 的原理就是,通過增加一個不可預測的請求參數 Token,來區分合法請求和非法請求,從而拒絕 CSRF。

Token 需要足夠隨機,而且應該作為一個“秘密”,僅為用戶與服務器所共同持有。

實際應用中 Token 可以放在用戶的 Session 中或瀏覽器的 Cookie 中【不建議】。推薦做法是將 Token 存放在頁面表單(隱藏的 input 字段)和 Session 中,而且提交操作應該設置為 POST,避免 Token 泄露。切記,不要在 URL 中存放 Token,否則通過 Referer 可以被竊取。

當一個站點同時存在 XSS 和 CSRF 漏洞的情況下情況將變得不容樂觀,攻擊者可以通過 XSS 漏洞獲取 Cookie 和 Token,然後輕易發起 CSRF 攻擊。

跨站點請求偽造(CSRF)