信息查询

数据库名的查询

select database();

数据库版本

防火墙的绕过会涉及。

select version();

判断字符型还是数字型

注释符:“#” “–+” “%23”

方法1:使用 and 1=1and 1=2 来判断

比如对于lab1,我们提交?id=1 and 1=1 或者?id=1 and 1=2都能正常显示界面,则不可能是数字型注入,即为字符型注入。
对于lab1,我们提交?id=1 and 1=2都不能正常显示界面,则为数字型注入。

如果是数字型注入,那我们就不需要测试闭合方式,否则还需要判断闭合方式:' " ') ")

方法2:使用 id=2-1

数字型是可以进行运算的,那么就相当于是id=1

注意:最好不用 + ,在URL编码中通常会使用 + 或 %20 来代替空格,解码会把 + 编码为空格。
所以有时我们也可以用 + 绕过空格限制。

对列数的判断

union

select * from users where id=1 union select 1,2,3;

增加union后面的数字,当报错说明超过最大列数。

判断数据位置

select * from users where id=-1 union select 1,2,3;

这里id后面我们要写不存在的id号,这样就能将1,2,3显示在对应的位置;
当我们写正常存在的id,那么就不会显示1,2,3;

这样就知道2,3处的数据会显示,以及位置。

接下来就是在2或者3处构造,就能在对应位置显示数据:

group by

select * from users where id=1 group by 1;

group by:按照第几列进行分组。
替换group by后面的数字,当报错说明超过最大列数。

order by

select * from users where id=1 order by 1;

order by:按照第几列进行排序(默认是升序,desc表示降序)。
替换order by后面的数字,当报错说明超过最大列数。

回显限制,多行->1行

有些地方回显只有一行,我们可以利用这一行来显示多行数据,通过将多行数据整合到一行。

group_concat

select group_cancat(id, username, passwd) from users;

limit

select name from users limit 0,1;

limit 0,1:0:第0行; 1:每次显示一行。

回显字符数限制

substring()

如果回显限制了字符数,我们可以利用substring从后面开始显示。

substring(123456, 4, 3)

参数一:需要显示的字符串
参数二:从第几个字符开始显示
参数三:一共显示几个字符

获取表名和列名

提前了解

数据库:Information_schema包含所有mysql数据库的简要信息,其中包含两个数据表:
- tables:存有所有表名
- columns:存有所有列名

where后面可以接上这些变量限制:

  • table_schema 是数据库的名称
  • table_name 是具体的表名。
  • table_type 表的类型。

可以看到显示了email表名,但是这里肯定还有其他表,显示不全,还需要其他手法。
table_schema:哪个数据库。

就是前面提到的group_concat

查找这个数据库下的所有列名:

查找到用户名和密码:

报错注入

原理:构造语句,让错误信息中夹杂可以显示数据库内如的查询语句。

extractValue()报错注入

我们就利用报错会返回路径来构造注入语句。

select extratvalue(doc, concat(0x7e, (select database()))) from users;

extractvalue():第一个参数可以随便写。
concat()函数是将第一个参数和第二个参数拼接。
0x7e是 ~ 的ascii码。

之后我们只用改变concat()的第二个参数,换为其他查询指令。

查询users表下面的所有列名:

updatexml报错注入

函数解析:

原理

extractvalue(),输入错误的第二个参数,即更改路径符号:
正常句式:

select updatexml(doc, '/book', '1') from xml;

输入错误路径会报错并返回路径,所以我们利用这个回显来返回我们想要的数据。

floor报错注入

涉及的函数解析

rand():随机返回0-1之间的小数
floor():小数向下取整。向上取整ceiling()
concat_ws():将括号内的数据用第一个字段连接起来
group_by():分组
as:起别名
count():汇总统计数量
limit():用于显示指定行数

例子:

技巧一

select rand() from users;users表中有多少行,就会调用rand()函数多少次;

技巧二

select concat_ws('-', (select database()), 3);:security-3

使用例子

模版:我们只用改select version()为其他指令就行;

?id=1' union select 1,count(*),concat_ws('-', (select version()), floor(rand(0)*2)) as x from information_schema.tables group by x --+

rand()中数字有时需要改变来触发报错。

布尔盲注

关键函数

ascii():返回字母的ascii值,例如select ascii('a');

例子

?id=1' and ascii(substr(select database(),1,1))>=100 --+

substr():按字符来判断,逐个爆破。