Web安全高危漏洞之SQL注入
一、 什么是SQL注入
“有人的地方就有江湖浩螺,有數(shù)據(jù)庫存在的地方就可能存在 SQL 注入漏洞盯另。”
------某某大佬
在客戶端發(fā)出請(qǐng)求的過程中源哩,在請(qǐng)求數(shù)據(jù)包的參數(shù)中,破壞原有SQL結(jié)構(gòu)鸦做,插入惡意的SQL命令励烦,最終達(dá)到欺騙服務(wù)器或數(shù)據(jù)庫執(zhí)行惡意的SQL命令,導(dǎo)致數(shù)據(jù)庫信息泄露泼诱。
二坛掠、 漏洞分析及產(chǎn)生的原理
1、sql注入按照參數(shù)類型可分為兩種:數(shù)字型坷檩、字符型和搜索型却音。
1)數(shù)字型
當(dāng)注入點(diǎn)的參數(shù)為整數(shù)時(shí),比如 ID=1矢炼,num=4系瓢,page=45等,這種形式的注入句灌,通常稱為數(shù)字型注入漏洞夷陋。
select * from 表名 where id=1
select * from 表名 where id=1 and 1=1
2)字符型
當(dāng)注入點(diǎn)是字符串時(shí)欠拾,則稱為字符型注入,字符型注入需要引號(hào)骗绕、括號(hào)來閉合藐窄,例如
name=”用戶輸入字符”
sql = "select * from users where name=’admin’ ”;
sql = "select * from users where name=’admin’’and 1=1‘ ”;
3)搜索型
網(wǎng)站資源搜索出存在注入時(shí),則稱為搜索型注入酬土,注入點(diǎn)的SQL語句通常為like模糊查詢荆忍,通常利用“%”實(shí)現(xiàn)注入。
select * from 表名 where 字段 like '%關(guān)鍵字%'
select * from 表名 where 字段 like '%測(cè)試%' and '%1%'='%1%'
2撤缴、按照數(shù)據(jù)提交的方式來分類
(1)GET 注入
提交數(shù)據(jù)的方式是 GET , 注入點(diǎn)的位置在 GET 參數(shù)部分刹枉。比如有這樣的一個(gè)鏈接http://127.0.0.1/news.php?id=1 , id 是注入點(diǎn)。
(2)POST 注入
使用 POST 方式提交數(shù)據(jù)屈呕,注入點(diǎn)位置在 POST 數(shù)據(jù)部分中的一個(gè)參數(shù)中微宝,常發(fā)生在表單中。
(3)Cookie 注入
HTTP 請(qǐng)求的時(shí)候會(huì)帶上客戶端的 Cookie, Cookie 當(dāng)中的某個(gè)字段會(huì)存在注入點(diǎn)虎眨。
(4)HTTP 頭部注入
注入點(diǎn)在 HTTP 請(qǐng)求頭部的某個(gè)字段中蟋软。例如 User-Agent 字段。
3嗽桩、按照?qǐng)?zhí)行效果來分類
(1)基于布爾的盲注
當(dāng)頁面屏蔽sql查詢結(jié)果時(shí)遵堵,可以利用返回的正常頁面和空值的對(duì)比机杜,判斷條件真假進(jìn)行注入屠尊。例如:
"SELECT * FROM users WHERE id=1 and ascii(substr(database(),1,1))>114--+LIMIT 0,1"
詳細(xì)利用過程請(qǐng)參考以下地址:https://blog.csdn.net/weixin_40709439/article/details/81355856
(2)基于時(shí)間的盲注
當(dāng)不能根據(jù)頁面返回內(nèi)容判斷任何信息時(shí)虱咧,用條件語句查看時(shí)間延遲語句是否執(zhí)行(即頁面返回時(shí)間是否增加)來判斷。
例如:select * from users where id=1 and sleep(3);
(3)基于報(bào)錯(cuò)注入
當(dāng)頁面會(huì)返回錯(cuò)誤信息時(shí)种樱,通過插入報(bào)錯(cuò)型注入的惡意sql查詢,將結(jié)果直接返回報(bào)錯(cuò)的信息中俊卤。
例如:通過floor報(bào)錯(cuò),注入語句如下:
and select 1 from (select count(),concat(version(),floor(rand(0)2))x from information_schema.tables group by x)a);
(4)聯(lián)合查詢注入
可以使用sql查詢語句中的union的情況下的注入嫩挤。
(5)堆查詢注入
可以同時(shí)執(zhí)行多條語句的執(zhí)行時(shí)的注入。
(6)寬字節(jié)注入
三消恍、漏洞加固方法
1岂昭、預(yù)編譯SQL語句和綁定變量
例如使用PreparedStatement預(yù)編譯語句代替Statement語句,將全部符號(hào)進(jìn)行轉(zhuǎn)義狠怨。
2约啊、過濾字符
- SQL查詢的關(guān)鍵字
"and","exec","execute","insert","delete","update","count","drop","chr","mid","master","truncate","char","declare","sitename","net user","xp_cmdshell","like","create","table","from","grant","use","group_concat","column_name","information_schema.columns","table_schema","union","where","select","update","order","by","or",dbcc,alter,backup,if,else,add,set,open,close,begin,retun,as,go,exists,end
2) 特殊字符
"*", " ' ", ";" ,"&","-","--","+","http://","/","%","#","|",""","$","<",">","=","[","]","||","@"
3、其他注意事項(xiàng)
1)固定數(shù)據(jù)長度佣赖,能在一定程度上防止比較長的SQL注入語句語句執(zhí)行恰矩。
2)統(tǒng)一數(shù)據(jù)層編碼,建議使用UTF-8編碼憎蛤,上下層編碼不一致有可能導(dǎo)致一些過濾規(guī)則被繞過外傅。
3)避免網(wǎng)站顯示SQL錯(cuò)誤信息纪吮,比如類型錯(cuò)誤、字段不匹配等萎胰,防止攻擊者利用這些錯(cuò)誤信息進(jìn)行一些判斷碾盟。
4)嚴(yán)格限制網(wǎng)站數(shù)據(jù)庫運(yùn)行權(quán)限,建議以最小權(quán)限(例如:僅有讀取和運(yùn)行權(quán)限)用戶運(yùn)行數(shù)據(jù)庫技竟,從而最大限度的減少注入對(duì)數(shù)據(jù)庫的危害冰肴。