sql-lab Less1-5题 Write Up
Less-1

输入一个id看看

题目是单引号,因此id加一个单引号看看

可以看到报错了。说明单引号被成功解析,那么我们就通过闭合单引号来进行注入。
首先通过order by判断字段:

不断提高order by后面的数值

可以看到order by到4的时候报错了,说明字段只有3个。
接下来通过union看看页面显示的内容对应的位置

页面成功执行,但是返回的内容没有变化,说明页面只会返回第一条结果(id=1),因此我们可以把id变成系统中没有的(id=-1),让服务器返回select的结果

可以看到页面返回了2和3,说明页面返回的是select的第二个和第三个地方,所以我们注入的地方就是2和3
接下来查询当前网站使用的数据库 database()、当前Mysql的版本 version()、当前Mysql的用户 user()
CONCAT_WS(separator,str1,str2,...),连接str1、str2等字符串,并在各字符串中以separator分隔

接下来先查询服务器一共有多少个数据库
Mysql中默认存放一个information_schema的数据库,该库中,有三个重要的表,分别是schemata, tables和columns
schemata储存该用户创建的所有数据库的库名,库名字段为schema_name
tables储存该用户创建的所有数据库的库名和每个库中的表名,库名字段是table_schema,表名字段是table_name
columns储存该用户创建的所有数据库的库名、每个库的表名和每个库中每个表中的字段名,库名字段是table_schema,表名字段是table_name,字段名是column_name

可以看到第一个表为information_schema,修改limit 0,1中0的值,遍历

最终得到所有的库名。
然后查询数据库中的表名,以security为例

遍历查询,就得到所有的表名。
然后获取表的字段名,以emails为例

遍历可以得到emails的所有字段id,email_id
然后获取字段内容

遍历

可以看到一共有8条数据

通过这样我们就可以把整个服务器的数据库down下来。
补充:
我们可以使用group_concat将信息输出到一行,这样更为方便。

Less-2

注入单引号,根据报错信息可以看出id在sql中是整型

通过布尔条件测试判断能否注入


得出结论存在注入,使用union注入

查询数据库名

注入成功,后续爆库步骤省略。
Less-3
单引号测试,查看报错信息

猜测sql语句形式为
1 | SELECT * FROM * WHERE id=('$id') LIMIT 0,1 |
布尔测试


可以注入,注意构造的形式

爆库

Less-4
双引号测试

猜测sql语句
1 | SELECT * FROM * WHERE id=("$id") LIMIT 0,1 |
布尔测试

union注入:

爆库

Less-5
单引号测试

布尔测试


可以看到存在注入,但是当布尔值为真时页面没有回显,因此考虑布尔注入
首先判断该数据表的字段


可以看到一共有三个字段。
判断数据库名字的长度
使用length()函数
可以看到长度大于等于1

小于15

多次测试后发现数据库名长度为8
再按位测试数据库每一位的值
使用substr(str,a,b)函数,a是从第几个字符开始(注意:字符从1开始,不是从0开始),b是每次返回几个字符

当测试到s时返回真,则数据库名的第一个字符为s

通过这种方式可以进行爆库。