sql注入繞過(guò) SQL注入點(diǎn)攔截了單引號(hào),是不是就無(wú)解了?
SQL注入點(diǎn)攔截了單引號(hào),是不是就無(wú)解了?并不是,太天真了。sql注入的方法有多種,不一定非得用單引號(hào)。SQL注入一般用于表單提交,尤其是登錄表單,通過(guò)提交一些sql語(yǔ)句的組合,使后臺(tái)驗(yàn)證邏輯出錯(cuò),順
SQL注入點(diǎn)攔截了單引號(hào),是不是就無(wú)解了?
并不是,太天真了。sql注入的方法有多種,不一定非得用單引號(hào)。SQL注入一般用于表單提交,尤其是登錄表單,通過(guò)提交一些sql語(yǔ)句的組合,使后臺(tái)驗(yàn)證邏輯出錯(cuò),順利進(jìn)入后臺(tái)。
方法一:
先猜表名
And (Select count(*) from 表名)<>0
猜列名
And (Select count(列名) from 表名)<>0
返回正確的,那么寫(xiě)的表名或列名就是正確,如果服務(wù)器沒(méi)有關(guān)系錯(cuò)誤提醒,就會(huì)將錯(cuò)誤的sql語(yǔ)句信息打印出來(lái),從而就獲取到真正的表名、列名。
方法二:
跳過(guò)登錄后臺(tái)
常見(jiàn)的 " or 1="1
比如后臺(tái)驗(yàn)證就變成
select name,pass from tbAdmin where name="" or 1="1" and pass="123456"
1="1"為真,這判斷就一直成立。
當(dāng)然還有很多種sql注入方式,大都是利用sql語(yǔ)句直接查詢(xún)的漏洞,或者報(bào)錯(cuò)信息。
只攔截了單引號(hào)還不夠,還有空格,等號(hào)等等一些符號(hào)。而且項(xiàng)目中千萬(wàn)避免前端提交的表單直接用原生sql語(yǔ)句查詢(xún),盡量用框架封裝的方法,這樣能很大程度上減少被sql注入的風(fēng)險(xiǎn)。畢竟前端提交的數(shù)據(jù)都是不可信的。
如何判斷PHP源碼是否存在SQL注入漏洞?
判斷是否存在SQL注入首先找到可能的注入點(diǎn);比如常見(jiàn)的get,post,甚至cookie,傳遞參數(shù)到PHP,然后參數(shù)被拼接到SQL中,如果后端接收參數(shù)后沒(méi)有進(jìn)行驗(yàn)證過(guò)濾,就很可能會(huì)出現(xiàn)注入。比如xxx.com?id=321,id就很可能是注入點(diǎn)。
說(shuō)白了就是不要相信用戶(hù)輸入,對(duì)用戶(hù)可控的參數(shù)進(jìn)行嚴(yán)格校驗(yàn)。注意是嚴(yán)格校驗(yàn)!簡(jiǎn)單的去空格,或者是特殊字符替換很容易繞過(guò)。
如果已經(jīng)有原碼,可以進(jìn)行代碼審計(jì),進(jìn)行逐一排查。也可以搭建本地環(huán)境使用類(lèi)似于sqlmap這樣的自動(dòng)化工具進(jìn)行可以鏈接的檢測(cè)。
個(gè)人理解僅供參考,如有偏頗望批評(píng)指正!