SQL注入攻擊是業界一種非常流行的攻擊方式,是由rfp在1998年《Phrack》雜志第54期上的“NT Web Technology Vulnerabilities”文章中首次提出的。時過境遷,相關SQL注入的技術和工具都進行了不斷的發展和演化。目前 SQL注入漏洞已經是信息安全的一大領域,無論是小到個人網站,還是大到電子商務網站,都或多或少的存在SQL注入漏洞。為什么SQL注入漏洞會屢禁不止,原因就在于要想防御SQL注入漏洞,需要對SQL語句、業務流程行為、各種主流數據庫相關機制都有較為深入的認識和理解,才能真正做好SQL注入的攻擊和防范。

SQL注入和盲注
對于SQL注入的定義和一般的判斷方法,無非就是著名的三段式。普通SQL注入是通過構造SQL語句,將敏感信息直接暴露在網頁上,有兩種方式,一種是通過報錯方式,一種是通過union select聯合查詢方式。普通的SQL注入并不是完美的,一旦開發人員將錯誤頁面進行處理,將unionselect關鍵字進行過濾,注入將不再有效。其實這種修復方式存在較大的問題。如果是在不采取其他措施的情況下,僅僅更換成統一的錯誤頁面是不能避免SQL注入的,這將會產生一種更高級的SQL注入方式盲注。盲注是通過構造SQL判斷語句,通過返回頁面的不同將信息判斷出來。返回頁面有三種:有結果頁面、0結果頁面和錯誤過濾頁面。只要有其中的兩個頁面,無論哪兩個頁面都可以,就可以判斷存在注入漏洞。當然,這中間還有一個前提,就是這些不同的頁面是由輸入到URL中的SQL語句執行的不同造成的。但是普通的盲注也不是絕對有效的,一旦沒有兩個以上的差異頁面,或者不能通過頁面的不同來來判斷 URL中SQL語句的有效性,此時就要使用基于時間的SQL盲注。基于時間的SQL盲注的特點和使用假設有這么一個文件,無論怎么注入,頁面內容都一樣,但此文件確實存在注入點。最關鍵的是通過普通盲注不能得到差異頁面,沒有差異也就沒法進行盲注。
為什么沒有差異,有這么幾種情況: 第一種情況:無論輸入什么都只顯示無信息頁面,例如登陸頁面。這種情況下可能只有登錄失敗頁面,錯誤頁面被屏蔽了,并且在沒有密碼的情況下,登錄成功的頁面一般情況下也不知道。在這種情況下,有可能基于時間的SQL注入會有效。
第二種情況:無論輸入什么都只顯示正常信息頁面。例如,采集登錄用戶信息的模塊頁面。采集用戶的 IP、瀏覽器類型、refer字段、session字段,無論用戶輸入什么,都顯示正常頁面。
第三種情況:差異頁面不是由輸入URL中的SQL語句來決定的。這種情況下,也只能使用基于時間的盲注。
總之,情況有很多種,只要無法通過差異頁面來進行一般SQL盲注,基于時間的SQL盲注就都有存在的可能。Oracle數據庫盲注 Oracle中基于時間的盲注主要是使用了DBMS_PIPE.RECEIVE_MESSAGE()函數和CASEWHEN?THEN?語句。下面是一個示例: 5593=(CASE WHEN (ASCII(SUBSTRC((SELECT NVL(CAST([ColumnName] AS VARCHAR(4000)),CHR(32)) FROM (SELECT [ColumnName],ROWNUM AS LIMIT FROM
|