前言
最近也是玩上了CTF啊,不过CTF涉及到的知识点可真多,先从最简单的web安全-SQL注入学起吧!听说 SQLi Labs 是一个开源且全面的 SQL 注入靶场,那就拿这个来练练 SQL 手工注入吧!同时也学学 sqlmap 的使用。
手工注入
判断是否存在 SQL 注入
- 一进来就提醒输入一个数字的id值
- 输入发现会回显内容,输入不同的id值,会回显不同的内容,所以我们后端应该就是根据我们输入的值来查询数据了。(这里推荐使用 chrome 的 HackBar 插件,在浏览器直接输入的话,特殊符号老是被编码,不太好看)
- 接下来判断是否存在注入,是字符型注入还是数字型注入
直接输入 1 是没问题的,但是输入 1’ 就报错了,所以这应该是字符型注入。
- 进一步验证猜想
为了进一步验证这是字符型,可以使用 AND 1=1、 AND 1=2 查看结果。
从上面2张图可以确定这不是数字型注入了,因为 AND 后面的条件没生效。
从上面2张图可以确定这是字符型注入,使用单引号闭合了前面的查询条件,因此 AND 后面的查询条件生效了,所以2次查询结果不一样。
联合注入爆数据
- 确定 SELECT 列数
接下来就是使用联合注入爆各种数据了,不过在此之前需要先确定一下 SELECT 的内容有多少列,因为 UNION 的列数需要一致。
使用 ORDER BY 来确认列数,ORDER BY 4 时报错了,所以 SELECT 的列数是3。
- 爆显示位
输入一个不存在的id,把后面的内容 UNION 上去,确认显示位。
可以看到回显的内容是第二、第三列。
- 爆库名
接下来就可以爆整个数据库实例的库名了,先使用 database() 查看当前查询的库,以及查询 information_schema.schemata 的 schema_name 列获取所有库名。
- 爆表名
查询 information_schema.tables 获取 security 库下的所有表名。
- 爆字段
当前显示了用户名、密码,这些数据肯定存在 users 表中,所以查查这张表有什么字段吧!
可以看到表中的字段有 id、username、password
- 爆数据
直接查询 users 表的 username 和 password
sqlmap
使用 sqlmap 注入
sqlmap github: https://github.com/sqlmapproject/sqlmap
- 先查询所有库
1 | sqlmap -u http://192.168.0.120:10000/Less-7/?id=1 --dbs |
- 查询 security 下的表
1 | sqlmap -u http://192.168.0.120:10000/Less-7/?id=1 -D security |
- 查询 users 表数据
1 | sqlmap -u http://192.168.0.120:10000/Less-7/?id=1 -D security -T users --columns --dump |
总结
- 先确认是字符型注入还是数字型注入,再使用注释把后面的 SQL 注释掉,然后确认注入格式,再使用联合注入查询库、表名,最后查询数据
- 这种简单的 case,sqlmap 直接能解决。不过现在处于练习阶段,还是得手工注入,理解原理