网络安全之SQL注入
文章目錄
- SQL注入的定義
- SQL注入為什么會成功?
- 為什么發(fā)生SQL注入?
- SQL注入的分析
- SQL的注入流程
- 判斷SQL注入點
- 判斷注入類型
- SQL注入的通常方法
- 防止SQL注入
SQL注入的定義
SQL注入是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務(wù)器執(zhí)行惡意的SQL命令。比如先前的很多影視網(wǎng)站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊。當(dāng)應(yīng)用程序使用輸入內(nèi)容來構(gòu)造動態(tài)sql語句以訪問數(shù)據(jù)庫時,會發(fā)生sql注入攻擊。
如果代碼使用存儲過程,而這些存儲過程作為包含未篩選的用戶輸入的字符串來傳遞,也會發(fā)生sql注入。
理解:
現(xiàn)代的注入手法,其實就是利用現(xiàn)成的表格數(shù)據(jù)來執(zhí)行非常規(guī)指令。簡單的說,利用非該段執(zhí)行文本數(shù)據(jù),代替正常數(shù)據(jù)做運算從而得到正確解。能夠?qū)崿F(xiàn)這種操作的技術(shù)就叫做sql注入。
SQL注入為什么會成功?
Sql注入攻擊是利用是指利用設(shè)計上的漏洞,在目標(biāo)服務(wù)器上運行Sql語句以及進行其他方式的攻擊,動態(tài)生成Sql語句時沒有對用戶輸入的數(shù)據(jù)進行驗證是Sql注入攻擊得逞的主要原因。
為什么發(fā)生SQL注入?
程序員在編寫代碼的時候,沒有對用戶輸入數(shù)據(jù)的合法性進行判斷,使應(yīng)用程序存在安全隱患
用戶可以提交一段數(shù)據(jù)庫查詢代碼,根據(jù)程序返回的結(jié)果,獲得某些他想得知的數(shù)據(jù)或進行數(shù)據(jù)庫操作
當(dāng)應(yīng)用程序使用輸入內(nèi)容來構(gòu)造動態(tài)sql語句以訪問數(shù)據(jù)庫時,會發(fā)生sql注入攻擊。如果代碼使用存儲過程,而這些存儲過程作為包含未篩選的用戶輸入的字符串來傳遞,也會發(fā)生sql注入。
sql注入可能導(dǎo)致攻擊者使用應(yīng)用程序登陸在數(shù)據(jù)庫中執(zhí)行命令。
如果應(yīng)用程序使用特權(quán)過高的帳戶連接到數(shù)據(jù)庫,這種問題會變得很嚴(yán)重。在某些表單中,用戶輸入的內(nèi)容直接用來構(gòu)造(或者影響)動態(tài)sql命令,或者作為存儲過程的輸入?yún)?shù),這些表單特別容易受到sql注入的攻擊。而許多網(wǎng)站程序在編寫時,沒有對用戶輸入的合法性進行判斷或者程序中本身的變量處理不當(dāng),使應(yīng)用程序存在安全隱患。這樣,用戶就可以提交一段數(shù)據(jù)庫查詢的代碼,根據(jù)程序返回的結(jié)果,獲得一些敏感的信息或者控制整個服務(wù)器,于是sql注入就發(fā)生了。
SQL注入的分析
對于Java數(shù)據(jù)庫連接JDBC而言,SQL注入攻擊只對Statement有效,對PreparedStatement是無效的,這是因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結(jié)構(gòu)。
如驗證用戶是否存在的SQL語句為:用戶名'and password='密碼'
如果在用戶名字段中輸入: 'or 1=1'或是在密碼字段中輸入:'or 1=1'
將繞過驗證,但這種手段只對只對Statement有效,對PreparedStatement無效。相對Statement有以下優(yōu)點:
SQL的注入流程
判斷SQL注入點
找注入點是最關(guān)鍵,也最基礎(chǔ)的一個環(huán)節(jié)
本質(zhì)原理:
找一個需要后臺處理后提交給數(shù)據(jù)的點,所有的輸入只要和數(shù)據(jù)庫進行交互的,都有可能觸發(fā)SQL注入
一般分為三大類:
Get參數(shù)觸發(fā)SQL注入
POST參數(shù)觸發(fā)SQL注入
Cookie觸發(fā)SQL注入
例如:
在常規(guī)的鏈接的參數(shù)中(鏈接?參數(shù))找形如?id=num的搜索框
而驗證是否存在注入點方法有很多種
最常規(guī)也是最簡單的方法,引入單引號判斷是否注入點
http://host/test.php?id=100;返回錯誤說明有可能注入
http://host/test.php?id=100 and 1=1 返回正常
http://host/test.php?id=100 and 1=2 返回錯誤
判斷注入類型
數(shù)字型注入點
http://host/test.php?id=100 and 1=1 SELECT first_name, last_name FROM users WHERE user_id = '1' or '1'='1'字符型注入點
http://host/test.php?name=man' and '1'='1 select * from student where sname='張三' or 1=1 -- and password='123' "select id from users where username = ''+username +"'" and password = '' + password +"'"在表單中username的輸入框中輸入’ or 1=1-- ,password的表單中隨便輸入一些東西,假如這里輸入123.此時我們所要執(zhí)行的sql語句就變成了select id from users where username = ’ ’ or 1=1-- and password = ‘123’,我們來看一下這個sql,因為1=1是true,后面 and password = '123’被注釋掉了。
搜索型注入點 — 目前常見的
http://host//test.php?keyword=python%' and 1=1 and '%'='內(nèi)聯(lián)式SQL注入 –常用
在 SQL語句中, AND的優(yōu)先級是大于 OR的
先計算 AND,然后計算 OR,所以這里我們的語句會被 OR分為兩段 SQL語句
SQL注入的通常方法
SQL注入主要分兩種方式:
一是直接將代碼插入到與SQL命令串聯(lián)在一起并使得其以執(zhí)行的用戶輸入變量。上面筆者舉的例子就是采用了這種方法。由于其直接與SQL語句捆綁,故也被稱為直接注入式攻擊法。
二是一種間接的攻擊方法,它將惡意代碼注入要在表中存儲或者作為原書據(jù)存儲的字符串。在存儲的字符串中會連接到一個動態(tài)的SQL命令中,以執(zhí)行一些惡意的SQL代碼。注入過程的工作方式是提前終止文本字符串,然后追加一個新的命令。如以直接注入式攻擊為例。就是在用戶輸入變量的時候,先用一個分號結(jié)束當(dāng)前的語句。然后再插入一個惡意SQL語句即可。由于插入的命令可能在執(zhí)行前追加其他字符串,因此攻擊者常常用注釋標(biāo)記“—”來終止注入的字符串。執(zhí)行時,系統(tǒng)會認(rèn)為此后語句位注釋,故后續(xù)的文本將被忽略,不背編譯與執(zhí)行。
注入大致方法:
先猜表名 And (Select count(*) from 表名)<>0
猜列名 And (Select count(列名) from 表名)<>0
或者也可以這樣
返回正確的,那么寫的表名或列名就是正確
這里要注意的是,exists這個不能應(yīng)用于猜內(nèi)容上,例如and exists (select len(user) from admin)>3這樣是不行的
防止SQL注入
防止SQL注入,我們需要注意以下幾個要點:
1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和 雙"-"進行轉(zhuǎn)換等。
2.永遠不要使用動態(tài)拼裝sql,可以使用參數(shù)化的sql或者直接使用存儲過程進行數(shù)據(jù)查詢存取。
3.永遠不要使用管理員權(quán)限的數(shù)據(jù)庫連接,為每個應(yīng)用使用單獨的權(quán)限有限的數(shù)據(jù)庫連接。
4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
5.應(yīng)用的異常信息應(yīng)該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝
6.sql注入的檢測方法一般采取輔助軟件或網(wǎng)站平臺來檢測,軟件一般采用sql注入檢測工具jsky,網(wǎng)站平臺就有億思網(wǎng)站安全平臺檢測工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻擊等。
數(shù)據(jù)庫操作,是觸發(fā)技術(shù)使用的關(guān)鍵。
圍繞這一點,可以想到許多系統(tǒng)層面的防護。
第一點就是,避免使用普適性的名詞去做主要關(guān)鍵詞,可以做適當(dāng)?shù)男薷淖冃巍ql注入其實也是技術(shù)門檻比較高的,它需要破解者對于項目網(wǎng)站本身就有一定的了解。
第二點可以考慮加強過濾手段,通過對于主要關(guān)鍵詞周邊風(fēng)險詞的限制降低風(fēng)險。根據(jù)理論模型來看,這種語句過濾可以極大程度防范技術(shù)侵入。
更多相關(guān)一
更多相關(guān)二
總結(jié)
以上是生活随笔為你收集整理的网络安全之SQL注入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回归后的香港行政区和澳门行政区属于()
- 下一篇: cglib动态代理导致注解丢失问题及如何