一、XSS跨站腳本攻擊
1、XSS攻擊有兩大步驟:
(1)、攻擊者提交惡意代碼
(2)、瀏覽器執行惡意代碼
2、XSS攻擊的分類
根據攻擊的來源,XSS攻擊可以分為存儲型、反射型、DOM型三種:
類型 | 存儲區* | 插入點* | 防范措施 |
---|---|---|---|
存儲型 XSS | 后端數據庫 | HTML | 1、純前端渲染,把代碼和數據分割開 2、對html充分轉義 |
反射型 XSS | URL | HTML | |
DOM 型 XSS | 后端數據庫/前端存儲/URL | 前端 JavaScript |
2、DOM 中的內聯事件監聽器(
都可以把字符串作為代碼運行,使用的時候需要注意 |
存儲型 XSS
存儲型 XSS 的攻擊步驟:
- 攻擊者將惡意代碼提交到目標網站的數據庫中。
- 用戶打開目標網站時,網站服務端將惡意代碼從數據庫取出,拼接在 HTML 中返回給瀏覽器。
- 用戶瀏覽器接收到響應后解析執行,混在其中的惡意代碼也被執行。
- 惡意代碼竊取用戶數據並發送到攻擊者的網站,或者冒充用戶的行為,調用目標網站接口執行攻擊者指定的操作。
這種攻擊常見於帶有用戶保存數據的網站功能,如論壇發帖、商品評論、用戶私信等。
反射型 XSS
反射型 XSS 的攻擊步驟:
- 攻擊者構造出特殊的 URL,其中包含惡意代碼。
- 用戶打開帶有惡意代碼的 URL 時,網站服務端將惡意代碼從 URL 中取出,拼接在 HTML 中返回給瀏覽器。
- 用戶瀏覽器接收到響應后解析執行,混在其中的惡意代碼也被執行。
- 惡意代碼竊取用戶數據並發送到攻擊者的網站,或者冒充用戶的行為,調用目標網站接口執行攻擊者指定的操作。
反射型 XSS 跟存儲型 XSS 的區別是:存儲型 XSS 的惡意代碼存在數據庫里,反射型 XSS 的惡意代碼存在 URL 里。
反射型 XSS 漏洞常見於通過 URL 傳遞參數的功能,如網站搜索、跳轉等。
由於需要用戶主動打開惡意的 URL 才能生效,攻擊者往往會結合多種手段誘導用戶點擊。
POST 的內容也可以觸發反射型 XSS,只不過其觸發條件比較苛刻(需要構造表單提交頁面,並引導用戶點擊),所以非常少見。
DOM 型 XSS
DOM 型 XSS 的攻擊步驟:
- 攻擊者構造出特殊的 URL,其中包含惡意代碼。
- 用戶打開帶有惡意代碼的 URL。
- 用戶瀏覽器接收到響應后解析執行,前端 JavaScript 取出 URL 中的惡意代碼並執行。
- 惡意代碼竊取用戶數據並發送到攻擊者的網站,或者冒充用戶的行為,調用目標網站接口執行攻擊者指定的操作。
DOM 型 XSS 跟前兩種 XSS 的區別:DOM 型 XSS 攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端 JavaScript 自身的安全漏洞,而其他兩種 XSS 都屬於服務端的安全漏洞。
其它的防范策略:
避免加載外域代碼、禁止外域提交、HTTP-only Cookie、驗證碼、輸入長度控制、表單數據指定具體類型等
二、CSRF(Cross-site request forgery)跨站請求偽造
一個典型的CSRF攻擊有着如下的流程:
- 受害者登錄a.com,並保留了登錄憑證(Cookie)。
- 攻擊者引誘受害者訪問了b.com。
- b.com 向 a.com 發送了一個請求:a.com/act=xx。瀏覽器會默認攜帶a.com的Cookie。
- a.com接收到請求后,對請求進行驗證,並確認是受害者的憑證,誤以為是受害者自己發送的請求。
- a.com以受害者的名義執行了act=xx。
- 攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者,讓a.com執行了自己定義的操作。
1、常見的攻擊類型:
(1)、get請求:例如利用圖片發起一次http請求,會攜帶cookie
<img style="width:0;" src="https://www.test.com/xxx" />
(2)、post請求:例如利用隱藏表單自動提交
<form action="https://www.test.com/xxx" method=POST> <input type="hidden" name="account" value="xiaoming" /> <input type="hidden" name="amount" value="10000" /> </form> <script> document.forms[0].submit(); </script>
(3)、url攻擊:需要誘導用戶手動點擊
<a href="https://www.test.com/xxx" taget="_blank"> 一刀9999級,神級裝備,頂級神寵,開服就有!! <a/>
2、特點
- 攻擊一般發起在第三方網站,而不是被攻擊的網站。被攻擊的網站無法防止攻擊發生。
- 攻擊利用受害者在被攻擊網站的登錄憑證,冒充受害者提交操作;而不是直接竊取數據。
- 整個過程攻擊者並不能獲取到受害者的登錄憑證,僅僅是“冒用”。
- 跨站請求可以用各種方式:圖片URL、超鏈接、CORS、Form提交等等。部分請求方式可以直接嵌入在第三方論壇、文章中,難以進行追蹤。
3、防護策略
根據csrf的特點:
- CSRF(通常)發生在第三方域名。
- CSRF攻擊者不能獲取到Cookie等信息,只是使用。
制訂防護策略:
- 阻止不明外域的訪問
- 同源檢測
- Samesite Cookie
- 提交時要求附加本域才能獲取的信息
- CSRF Token
- 雙重Cookie驗證
- 驗證碼
同源檢測:根據請求的Origin和Referer,阻止外域請求或白名單以外的請求,html請求除外
Samesite Cookie:設置cookie屬性:Strict 除了本域外任何外域都無法攜帶,頁面跳轉也不會攜帶;Lax:這個請求是(改變了當前頁面或者打開了新頁面)且同時是個GET請求,則攜帶;Samesite Cookie不支持子域。
Token:請求攜帶隨機token, 這個token一定得是隨機的,讓攻擊者猜不到。可以是服務器生成的隨機數、也可以是隨機字符串、時間戳、userid加密生成的簽名
雙重Cookie驗證:請求自己攜帶cookie的同時,在請求參數上也拼接cookie,服務器進行對比。(csrf攻擊可以攜帶cookie,但是無法獲取cookie),但是子域可以修改cookie,所以攻擊者可以通過子域修改cookie,使得雙Cookie驗證失效
驗證碼:在關鍵位置使用驗證碼或類似支付密碼的方式
其它一些防范措施:
- 嚴格管理所有的上傳接口,防止任何預期之外的上傳內容(例如HTML)。
- 添加Header
X-Content-Type-Options: nosniff
防止黑客上傳HTML內容的資源(例如圖片)被解析為網頁。 - 對於用戶上傳的圖片,進行轉存或者校驗。不要直接使用用戶填寫的圖片鏈接。
- 當前用戶打開其他用戶填寫的鏈接時,需告知風險(這也是很多論壇不允許直接在內容中發布外域鏈接的原因之一,不僅僅是為了用戶留存,也有安全考慮)