前端安全之CSRF攻擊

2021-09-25 15:33:51 字數 3344 閱讀 3292

csrf,即(cross-site request forgery), 中文名為跨站請求偽造。是一種挾持使用者在當前已登入的web應用程式上執行非本意的操作的一種攻擊方式。csrf攻擊的本質在於利用使用者的身份,執行非本意的操作。根據csrf的全名,可以得出的結論是:csrf的請求是跨域且偽造的。

偽造指的是如果這個請求不是使用者自身的意願,那麼這個請求就是偽造的。

簡單的說,跨站請求偽造的攻擊是攻擊者通過一些技術手段欺騙使用者的瀏覽器去訪問使用者曾經認證過的**並執行一些操作(如傳送郵件、發訊息、甚至財產操作如轉賬和購買商品等)。由於瀏覽器曾經認證過,所以被訪問的**會認為是真正的使用者操作而去執行。這利用了web登入身份認證的乙個漏洞:簡單的身份認證只能保證請求來自使用者的瀏覽器,但不能識別請求是使用者自願發出的。

get csrf

post csrf

get csrf

兩個**的網域名稱不一樣,目標**a上有乙個刪除文章的功能,通常是使用者單擊』刪除文章『鏈結時才會刪除指定的文章。這個鏈結是www.a.com/blog/del?id=1, id代表不同的文章。實際上就是發起乙個get請求。

如果在目標**a上存在xss漏洞,那麼可以利用這個xss漏洞來進行攻擊。注意,xss攻擊是在使用者的瀏覽器上進行的。如果對xss攻擊不熟悉的朋友,可以看看這篇文章。傳送門:前端安全之xss攻擊

2. 或者在目標**a上動態建立乙個標籤(script, img, iframe等),將其src指向www.a.com/blog/del?id=1, 那麼攻擊就會發起。實際上通過這種方式發起的請求就是乙個get請求。

3. 最後欺騙使用者登入目標**a,那麼攻擊就會發生。

如果在目標**a上不存在xss漏洞,那麼可以利用get csrf進行攻擊

1. 無法使用ajax發起get請求。因為csrf請求是跨域的,而ajax有同源策略的限制。

2. 可以通過在惡意**b上靜態或者動態建立img,script等標籤發起get請求。將其src屬性指向www.a.com/blog/del?id=1。通過標籤的方式發起的請求不受同源策略的限制。

3. 最後欺騙已經登入目標**a的使用者訪問惡意**b,那麼攻擊就會發生。此時惡意**b的請求是身份認證後的。

對比csrf和xss攻擊可以看出,csrf攻擊有以下幾個關鍵點

請求是跨域的。可以看出請求是從惡意**b上發出的

通過img, script等標籤來發起乙個get請求。因為這些標籤不受同源策略的限制

發出的請求是身份認證後的。這一點是csrf中最重要的一點。如以下**

other-request-name: other-request-value:對比以上的**可以看出,只有referer欄位不同。也就是說,只有請求**不相同,而傳送刪除文章的請求時都會帶上相同的cookie資訊。這樣的請求就是身份認證後的,csrf攻擊就會成功。

post csrf:post請求實際上就是在惡意**b上發起乙個post請求,同樣的,這個請求也是跨域和身份認證後的。如靜態或動態的建立乙個form表單,當使用者訪問到這個惡意**b時,就會提交這個表單。

setform()以上說了get和post的csrf攻擊。本質上都是欺騙使用者以自己的身份去執行非本意的操作。欺騙流程大致如下

1. 首先欺騙使用者登入目標**。

2. 然後欺騙使用者登入惡意**。這種惡意的**有很多種形式,藏身於網頁中的許多地方。此外,攻擊者也不需要控制放置惡意**的**。例如他可以將這種位址藏在論壇,部落格等任何使用者生成內容的**中。這意味著如果伺服器端沒有合適的防禦措施的話,使用者即使訪問熟悉的可信**也有受攻擊的危險。

模擬表單提交盜取使用者資金。實際上就是上面所說的post csrf攻擊

篡改目標**上的使用者資料。

盜取使用者隱私資料

檢測請求頭中的referer欄位

從get csrf例子中可以看到,目標**a和惡意**b發出的請求中,請求頭唯一的不同就是referer欄位。通常來說,referer欄位通常與host欄位的網域名稱是一樣的。

以上面刪除文章功能為例,在目標**a中的referer欄位為,而惡意**b中的referer欄位為。所以根據referer欄位與host欄位在同一網域名稱下的規則,可以檢測referer字段值,如果發現其與host值不在同一網域名稱下,這時候伺服器就能夠識別出惡意的訪問了。

新增檢驗token

由於csrf的本質在於攻擊者欺騙使用者去訪問自己設定的位址,所以如果要求在訪問敏感資料請求時,要求使用者瀏覽器提供不儲存在cookie中,並且攻擊者無法偽造的資料作為校驗,那麼攻擊者就無法再執行csrf攻擊。這種資料通常是表單中的乙個資料項。伺服器將其生成並附加在表單中,其內容是乙個隨機數。即的形式。

當客戶端通過表單提交請求時,這個隨機數也一併提交上去以供校驗。正常的訪問時,客戶端瀏覽器能夠正確得到並傳回這個隨機數,而通過csrf傳來的欺騙性攻擊中,攻擊者無從事先得知這個隨機數的值,伺服器端就會因為校驗token的值為空或者錯誤,拒絕這個可疑請求。

為了防範csrf,在需要增刪改資料時,使用post請求,而不要使用get請求。

具體的方案如下:

1. 服務端在收到客戶端請求時,生成乙個隨機數,在渲染頁面時將隨機數埋入頁面(一般埋入form表單中),)`的形式。每次重新整理頁面後這個隨機數都會改變,並在伺服器中儲存。

2. 服務端設定set-cookie, 把該隨機數作為cookie種入使用者瀏覽器。

3. 當使用者傳送get或post請求時帶上_csrf_token引數(對於form表單直接提交即可)

4. 後台在接受到請求後解析請求頭中的cookie欄位,獲取_csrf_token的值,然後和使用者請求提交的_csrf_token值做比較。如果相等則表示請求**是合法的。

前端安全之CSRF攻擊

csrf,即 cross site request forgery 中文名為跨站請求偽造。是一種挾持使用者在當前已登入的web應用程式上執行非本意的操作的一種攻擊方式。csrf攻擊的本質在於利用使用者的身份,執行非本意的操作。根據csrf的全名,可以得出的結論是 csrf的請求是跨域且偽造的。偽造指...

Web安全之CSRF攻擊

csrf是什麼?csrf cross site request forgery 中文是跨站點請求偽造。csrf攻擊者在使用者已經登入目標 之後,誘使使用者訪問乙個攻擊頁面,利用目標 對使用者的信任,以使用者身份在攻擊頁面對目標 發起偽造使用者操作的請求,達到攻擊目的。舉個例子 簡單版 假如有個加關注...

Web安全之CSRF攻擊

源文位址 csrf是什麼?csrf cross site request forgery 中文是跨站點請求偽造。csrf攻擊者在使用者已經登入目標 之後,誘使使用者訪問乙個攻擊頁面,利用目標 對使用者的信任,以使用者身份在攻擊頁面對目標 發起偽造使用者操作的請求,達到攻擊目的。舉個例子 簡單版 假如...