看看有哪些 Web 攻擊技術.

JMCui 發表於 2020-06-30

一、前言

HTTP 協議具有無狀態、不連線、盡最大努力的特點,對於 Web 網站的攻擊基本也是針對 HTTP 協議的這些特點進行的。比如無狀態的特點,就要求開發者需要自行設計開發"認證"和"會話管理"功能來滿足 Web 應用的安全,而形形色色的自行實現,也為使用者會話劫持、SQL 注入等攻擊埋下了風險;而不連線的特點表示客戶端可以肆意的修改 HTTP 的請求內容,而服務端可能會接收到與預期資料不相同的內容。

Web 漏洞中,邏輯漏洞佔比最大,邏輯漏洞是指由於程式邏輯不嚴或邏輯太複雜,導致一些邏輯不能夠正常處理或處理錯誤,一般出現在支付金額、越權訪問、資訊查詢、登陸認證等地方。邏輯漏洞很大的一部分原因是因為對程式碼的不夠認真和對客戶的過於信任,比如返回資料中包含使用者敏感資訊、登入認證存在撞庫風險等
看看有哪些 Web 攻擊技術.

技術漏洞攻擊指的是使用者通過一定的技術手段,利用攻擊程式碼達到自己非法獲取資訊、身份偽裝等目的。技術漏洞攻擊可以分為主動攻擊和被動攻擊。

主動攻擊(active attack)是指攻擊者通過直接訪問 Web 應用,把攻擊程式碼植入的攻擊模式。具有代表性的攻擊是 SQL 注入攻擊和 OS 命令注入攻擊。

被動攻擊(passive attack)是指利用圈套策略執行攻擊程式碼的攻擊模式,比如利用釣魚網站誘使使用者點選等。具有代表性的攻擊是跨站指令碼攻擊(XSS)和跨站點請求偽造(CSRF)。

二、主動攻擊

1. SQL 注入

SQL隱碼攻擊(SQL Injection) 是指標對 Web 應用使用的資料庫,通過執行非法的 SQL 而產生的攻擊。簡單點來說,就是通過表單輸入的內容,誘使伺服器拼接成一個非法的 SQL。比如有一個正常的 SQL 語句如下:

SELECT * FROM user WHERE name='張三' and password = '123456'

正常情況下,使用者輸入使用者名稱“張三”和密碼“123456”(正常來說,密碼要 MD5 加密處理)完成認證過程。

假設使用者名稱輸入的使用者名稱是“張三'--”,我們來看看 SQL 會變成啥樣?SQL 語句中的 -- 之後全視為註釋,使用者就成功繞過了認證。

SELECT * FROM user WHERE name='張三'--' and password = '666666'

常見的預防 SQL 注入的手段就是 SQL 語句預編譯處理。

2. OS 命令注入攻擊

OS 命令注入攻擊(OS Command Injection)是指通過 Web 應用,執行非法的作業系統命令達到攻擊的目的。OS 命令注入攻擊可以向 Shell 傳送命令,讓 Windows 或 Linux 作業系統的命令列啟動程式。也就是說,通過 OS 注入攻擊可執行 OS 上安裝著的各種程式。

OS 命令注入和 SQL 注入類似,SQL 注入偽造的是非法 SQL,OS 命令注入偽造的是非法 shell 命令。

常見的預防 OS 注入的手段是對 shell 執行的符號進行轉碼替換(比如 &&、&、| 等)。

3. Dos 攻擊

DoS 攻擊(Denial of Service attack)是一種讓執行中的服務呈停止狀態的攻擊。有時也叫做服務停止攻擊或拒絕服務攻擊。DoS 攻擊的物件不僅限於 Web 網站,還包括網路裝置及伺服器等。

Dos 攻擊簡單點理解就是傳送大量的合法請求,造成伺服器資源過載耗盡,從而使伺服器停止服務。(由於伺服器很難分辨何為正常請求,何為攻擊請求,因此很難防止 DoS 攻擊。)

Dos 攻擊還可通過攻擊安全漏洞使服務停止。

三、被動攻擊

1. XSS 攻擊

跨站指令碼攻擊(Cross-Site Scripting, XSS)是指通過在使用者的瀏覽器內執行非法的 HTML 標籤或 JavaScript 向存在安全漏洞的 Web 網站進行的一種攻擊。攻擊者編寫指令碼設下陷阱,使用者在自己的瀏覽器上執行時,一不小心就會受到被動攻擊。

常見的 XSS 攻擊比如虛假輸入表單騙取使用者個人資訊、竊取使用者 Cookie 傳送惡意請求 等。

常見的預防 XSS 攻擊的手段比如對 HTML 標籤、JavaScript 進行轉義處理、禁止 JavaScript 讀取 Cookie 等。

2. CSRF 攻擊

跨站點請求偽造(Cross-Site Request Forgeries,CSRF)攻擊是指攻擊者通過設定好的陷阱,強制對已完成認證的使用者進行非預期的個人資訊或設定資訊等某些狀態更新。
看看有哪些 Web 攻擊技術.

常見的預防 CSRF 攻擊的手段比如:驗證 Referer + POST 提交、增加 token 認證等。

3. HTTP 首部注入攻擊

HTTP 首部注入攻擊(HTTP Header Injection)是指攻擊者通過在響應首部欄位內插入換行,新增任意響應首部或主體的一種攻擊。比如重定向至任意的 URL、替換掉要返回的主體內容等。

比如存在某個需要重定向的頁面,本來的 header 資訊是這個樣子的:

Location: http://example.com/?cat=101

因為重定向需要帶回引數,攻擊者就誘使使用者在引數中加入攻擊程式碼 —— 加入或替換任意的 header 資訊。(下面這個 Location 可能不會生效,不同的瀏覽器對重複的 header 欄位有不同的處理方式)

Location: http://example.com/?cat=101(%0D%0A:換行符)
Location: http://xxx.com

4. 會話劫持攻擊

會話劫持(Session Hijack)攻擊是指攻擊者通過某種手段拿到了使用者的會話 ID,並非法使用此會話 ID 偽裝成使用者,達到攻擊的目的。

常見的預防會話劫持的手段比如:將會話 ID 和使用者裝置資訊繫結在一起,當使用者在其他裝置上使用該會話 ID 時,就會提示被盜用風險,要求使用者重新登入。

四、我們能做什麼?

  1. 輸入值驗證。檢查數值是否符合系統業務邏輯或檢查字元編碼,永遠不要相信使用者的輸入,注意不要依賴客戶端驗證,客戶端驗證的目的只是為了儘早的辨識輸入錯誤,起到提高 UI 體驗的作用(客戶端驗證可被修改繞過)。
  2. 輸出值轉義。比如對 HTML 標籤、JavaScript 進行轉義處理再輸出,避免存在攻擊程式碼。
  3. Web 應用不直接丟擲異常,或謹慎輸出錯誤提示,防止被攻擊者利用。
  4. 敏感欄位,比如密碼,進行加 salt 加密處理,防止被暴力破解(比如常見的 彩虹表)。
  5. 簽名認證,防止資料被篡改。客戶端設定簽名,服務端校驗簽名是否正確。
  6. 禁止開放重定向(Open Redirect)功能,防止被攻擊者選中並用來作為釣魚攻擊的跳板。
  7. 涉及到登入口的地方,增加圖形驗證碼,防止爆破機器人。
  8. 上線前將一些測試介面或後門程式刪除,避免被攻擊者利用。
  9. 不要將公司程式碼傳到公共倉庫。