作者 | 陳峻
審校 | 重樓
引言
近年來,隨著人們使用Web應用的與日俱增,各種與在線交易和通信相關的大量個人數據被存儲在其后端的數據庫中。對于那些由數據庫驅動的Web應用而言,SQL注入攻擊是一種相當嚴重的安全風險。攻擊者可以通過利用系統(tǒng)漏洞,繞過應用防火墻,未經授權地訪問到底層數據庫,并竊取各種敏感的數據信息。因此,我們需要制定一套針對SQL注入攻擊的有效應對措施,來提高Web應用的整體安全態(tài)勢。
基本概念
作為一種典型的攻擊形式,SQL注入(簡稱SQLi)通常會使用惡意SQL代碼,來操縱后端數據庫,獲取機密信息和數據庫管理員權限,進而盜取用戶列表、以及破壞整個數據庫。目前,根據訪問后端數據的方法和潛在危害,我們可以將SQL注入分為:
- 向字符串或字符參數直接注入,如:SELECT * from table where example = 'Example'
- 對數字參數予以注入,如:SELECT * from table where id = 123而根據數據庫管理系統(tǒng)(DBMS)和注入條件的漏洞類型,我們又可以將SQL注入分為:經典的帶內SQLi、盲猜式的推理SQLi、以及險招式的帶外SQLi。其中:
帶內SQLi
當攻擊者可以使用同一通信通道,實施攻擊并收集攻擊結果時,這種攻擊就被稱為帶內SQL注入。作為一種最流行、最直接的攻擊,帶內SQL注入又包括:基于錯誤的SQL注入和基于聯(lián)合的SQL注入兩種最常見的形式。
- 基于錯誤的SQL注入使用數據庫服務器的錯誤信息,來收集有關數據庫結構的信息。畢竟,在Web應用的實時運行過程中,各種錯誤會被記錄到安全文件中,那么攻擊者便可以通過枚舉來遍歷整個數據庫。
- 基于聯(lián)合的SQL注入是將兩到多個SELECT查詢的結果合并為一個結果,然后作為HTTP響應的一部分予以發(fā)送。
推理SQLi
與帶內SQL注入相比,推理SQL注入的攻擊時間更長。攻擊者可以通過發(fā)送有效負載、分析Web應用的響應、以及數據庫服務器的相應行為,來重新創(chuàng)建數據庫結構。由于無法獲取Web應用傳遞的數據,因此攻擊者無法查看到類似帶內攻擊的結果。而且,由于攻擊者需要逐個字符地枚舉數據庫,因此在攻擊大型數據庫時,其效率比較低下。
目前,推理SQL注入也包含:基于盲布爾的SQL注入和基于盲時間的SQL注入兩種形式。
- 基于盲布爾的SQL注入旨在讓Web應用根據查詢,返回的“真”或“假”不同的答案。
- 盲時間的SQL注入通過查詢,使得數據庫在響應前等待指定的時間(以秒為單位)。那么根據HTTP響應是有延遲、還是能即時給出,攻擊者就能確定查詢結果是“真”還是“假”。
帶外SQLi
由于依賴的是在Web應用數據庫服務器上已啟用的功能,因此帶外SQL注入并不常見。
應對措施
通常,Web應用防火墻(簡稱WAF)可以通過篩選和監(jiān)控Web應用與互聯(lián)網之間的HTTP流量,以及時發(fā)現(xiàn)跨站偽造、跨站腳本、文件包含和SQL注入等常見攻擊。在OSI模型中,WAF工作在第七層。作為一種反向代理,它往往被安裝在Web應用的前端,從而在客戶端請求到達服務器之前形成一道中間件式的屏障。和其他防火墻類似,WAF也需要通過一系列規(guī)則與策略的集合,來過濾惡意請求,進而防范應用漏洞被利用。目前,經常被部署到Web應用系統(tǒng)中的WAF類型包括:軟件型WAF、硬件型WAF、云WAF、以及Web應用內置的WAF服務。
上圖展示的是WAF防范SQL注入的邏輯過程??梢姡?/span>WAF強大之處在于,它可以快速、方便地執(zhí)行策略,并按需變更規(guī)則,從而對各種攻擊性請求做出更快的反應。
攻擊檢測
那么,WAF到底是遵循一個什么樣的流程來對攻擊進行檢測的呢?下面我們以一個典型的軟件型WAF為例,來深入探究。
- 首先,在接收到用戶提交的數據請求后,WAF會根據既有的白名單進行合法性檢查。如果已被涵括在白名單之內,它直接轉發(fā)給后端的Web服務器予以響應處理;如果落入了黑名單,則立即拒絕數據請求的通過;而如果既不在白名單、也不在黑名單(也就是我們常說的“灰名單”)內,則要進行數據包的解析。
- 解析后的數據包會被拿去與我們前面提到的規(guī)則策略進行匹配,如果符合規(guī)則,則可以交給后端的Web服務器予以響應處理;如果不符合,則被判定為惡意攻擊,進而執(zhí)行相應的警告、阻斷、以及留下記錄,以便后續(xù)分析之用。
- 作為一個閉環(huán),安全團隊需要從WAF的記錄中,獲取諸如:攻擊源的IP地址、攻擊目標的URL等實用信息,以便進行后續(xù)的安全分析或策略調整。
WAF繞過
我們常說“道高一尺,魔高一丈”,針對WAF在產品設計和部署配置上的參差不齊,SQL注入攻擊者時常會運用各種手段來繞過WAF,達到攻擊目的。例如,由于不同的WAF產品會自定義不同的警告頁面,因此攻擊者可以根據不同的頁面信息,來辨別出Web應用使用了哪一款WAF,從而制定出相應的能夠繞過WAF的數據請求特征。下面便是該領域的一些典型威脅與漏洞:
- 參數篡改:攻擊者使用那些對于目標Web應用根本不存在的參數,從安全性較低的數據庫中獲取異常信息。
- 參數化查詢:攻擊者頻繁地使用多種參數化查詢方式,增加SQL注入漏洞被利用的可能性。
- 頁面擴展的可見性:根據顯示頁面擴展出的可見信息,攻擊者可以猜測出Web應用可能用到的技術與組件。
- SQL版本泄露:攻擊者可以通過定位SQL的版本,去查找并利用相應類型的SQL漏洞。
- 可猜測的表名/列名:典型且常用的表名或列名,往往是攻擊者執(zhí)行漏洞查找的突破口。
- 空字節(jié)編碼:攻擊者可以通過在其提供的數據中添加URL編碼的空字節(jié)字符,來繞過WAF過濾器的完整性檢查。
- 信任憑據截獲:攻擊者可以通過截獲安全性較低的Web應用的用戶憑據,達到曲線注入的效果。
此外,常見的WAF繞過方法還有:關鍵字替換,特殊符號與編碼,利用注釋,重復參數污染,緩沖區(qū)溢出,以及利用多種繞過技術打“組合拳”,通過未經授權地訪問Web應用的系統(tǒng)文件,進而改變預期運行邏輯。
小結
綜上所述,針對Web應用的SQL注入攻擊與應對,好似一個永無止境的“貓鼠游戲”。我們只有通過持續(xù)檢測,持續(xù)跟蹤,持續(xù)調整,持續(xù)更新,以及持續(xù)引入新的防御技術,才能更加靈活地應對SQL注入、遠程代碼執(zhí)行(RCE)、以及跨站點腳本(XSS)等復雜多變的攻擊,才能在這場安全競賽中占得先機。
作者介紹
陳峻(Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項目實施經驗,善于對內外部資源與風險實施管控,專注傳播網絡與信息安全知識與經驗。