判斷SQL注入點(diǎn)
單引號判斷法
在瀏覽器地址框輸入下面的內(nèi)容:
http://xxx/test.php?id=1'
如果頁面返回錯誤,則存在sql注入顶岸,無論字符型還是整形都會因?yàn)閱我杺€數(shù)不匹配而報(bào)錯。
判斷注入類型
通常SQL注入分為兩種:數(shù)字型+字符型
數(shù)字型:
select * from table_name where id = X,通常構(gòu)造 and 1=1 以及 and 1=2來判斷
字符型:
select * from table_name where id = 'X',通常構(gòu)造 and '1'='1 以及 and '1'='2來判斷
通過返回的數(shù)據(jù)來判斷,如果 and '1'='1 可以返回?cái)?shù)據(jù),and '1'='2 不返回?cái)?shù)據(jù)嚎幸,表示漏洞存在光坝。
驗(yàn)證
在環(huán)境中選擇SQL Injection (GET/Search)頁面進(jìn)行跳轉(zhuǎn),拼接SQL進(jìn)行測試张惹,是否存在漏洞:
image.png
通過返回芋肠,可以看到上面的查詢字符串已經(jīng)造成sql的異常,需要將SQL變成正常可以的幽崩,修改如下:
image.png
修改的查詢語句為:t %' and '1' = '1' --+
注入防范
1.減少錯誤信息
不要把類似SQL的信息返回給前端,盡可能減少有用信息的返回
2.對輸入特殊符號進(jìn)行轉(zhuǎn)義
在前端或者后端苦始,將一些特殊符號進(jìn)行過濾或者轉(zhuǎn)義,例如:$id=mysql_escape_string($id)
3.對輸入特殊詞組進(jìn)行過濾
常見的關(guān)鍵字:and、or慌申、union 陌选、select、空格等等過濾
SQL 注入的分類
1.布爾型注入
http://test.com/view?id=1 and substring(version(),1,1)=5 蹄溉,聯(lián)合布爾查詢咨油,使得程序返回?cái)?shù)據(jù)。如果服務(wù)端MySQL版本是5.X的話柒爵,那么頁面返回的內(nèi)容就會跟正常請求一樣役电。
2.可聯(lián)合查詢注入
http://test.com/view?id=1 UNION ALL SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
最快捷的方法,通過UNION查詢獲取到所有想要的數(shù)據(jù)棉胀,前提是請求返回后能輸出SQL執(zhí)行后查詢到的所有內(nèi)容法瑟。構(gòu)造union語句,返回表唁奢、字段等相關(guān)信息霎挟。
3.基于時間延遲注入
select * from user where id= ‘4’ and sleep(3)
如果布爾型注入、可聯(lián)合查詢注入都無法發(fā)揮作用的時候或者頁面沒有返回異常信息等麻掸,可以使用基于時間延遲注入酥夭,來判斷SQL是否正常執(zhí)行。
4.報(bào)錯型注入
如果頁面有返回SQL報(bào)錯信息脊奋,可以直接從報(bào)錯信息中獲取想要的信息熬北,根據(jù)信息調(diào)整SQL語句,來測試返回诚隙。
5.可多語句查詢注入
http://test.com/view?id=1;update t set name = ‘a(chǎn)‘ where id=1
可以執(zhí)行多條SQL讶隐,有可能會導(dǎo)致數(shù)據(jù)全部丟失,慎用最楷。