Sqli-labs是一个学习sql注入的平台,通过闯关的形式让学习的过程没有那么枯燥。个人感觉还是蛮有意思的,因此准备写一个系列来记录自己学习的过程。
由于前十关都是GET请求,比较简单,而且我也是初学,所以没有准备其他工具,接下来所有的操作都是用的aipfox。
Less-1
进入第一关的页面,有一个提示:请输入id作为参数
简单尝试一下输入参数:
可以看到,页面上返回了相应的用户名和密码。
下一步我们传入 1'
作为参数,来判断sql语句是否是拼接而成:
语句报错了,可以看到报错的地方为 ''1'' LIMIT 0,1'
,很明显,把我们输入的 1'
当作字符串直接拼接进去了,我们再来确认一下:
传入1' --+
作为参数,返回了数据。因为此时的sql被拼接成了这样:
'select xxx from xxx where id = '1' --limit 0,1'
我们用 – 把后面的limit给注释掉了,然后用我们自己输入的单引号来和前面的单引号形成闭合。
这样一来注入sql就很简单了,只需要在1' --+
中间加上我们要注入的语句就可以了。
比如接下来可以使用order by语句判断sql查询的列数:
从 ?id=1' order by 1 --+
开始查,查到4报错了,说明这个查询sql只有三列,接下来我们看看这三列数据分别是怎么使用的:
通过?id=-1' union (select 1,2,3) --+
可以看出,第二列和第三列分别是用户名和密码,那第一列多半就是id了。
接下来可以查询当前数据库名:
这样我们就获取到了程序当前连接的数据库为security。然后根据数据库名,可以进一步查询security库中的所有表:
我们现在得到了 emails、referers、uagents、users四张表,后面获取表结构、表数据什么的,或者注入其他东西,也可以以同样的方法实现,就不赘述了。
Less-2
Less-2我们同样输入1'
作为参数测试:
这次的报错变了,报错的位置变成了'' LIMIT 0,1'
。这次是在limit的位置多出来了一个单引号,说明这很有可能是数字型注入,接下来进行确认:
到了这一步,剩下的就和Less-1没有什么区别了,比如:
Less-3
同样,我们使用1'
进行测试:
通过报错可以看出来,1后面多了个单引号,那么原本就应该是1')
,所以我们就可以通过前面的方式进行注入:
Less-4
Less-4,我们用1'
进行测试,这次居然不报错了:
此时我们把参数改成1"
再试试:
可以看到,这次1的后面多了个双引号,那就很简单了,我们使用1")
进行注入:
Less-5
Less-5和前面四关略有不同,当我们输入正确的参数时,不会再回显数据了,而是固定的一句话:
此时我们使用与前四关同样的方法确定注入类型,然后可以通过拼接条件的形式来获取想要的信息:
我们通过id=‘1’ and length(database())=1两个条件来判断,没有查出数据,说明数据库名字的长度不是1,继续查,直到查到8,查出数据来了:
此时我们再通过left()函数来逐位判断,直到确定每一位是什么:
此时这个漏洞就成了一个只会回答是否的机器。
Less-6
Less-6和上一关是一样的,区别是参数变成了双引号1"
:
Less-7
Less-7我们尝试1'
作为参数的时候,发现没有具体的报错sql了:
此时我们可以检查闭合符号,也就是括号:
加了一个括号还是不行,那我们再加一个:
这次可以了,说明注入点为1'))
,接下来我们可以采用与5、6关相同的方法进行盲注。
Less-8
第八关报错的时候没有报错信息。而是显示为空:
其实原理是一样的,我们只要通过有没有回显值来判断就可以了:
Less-9
第9关,这次无论我们输入什么参数,都会回显同样的字符串,这时布尔盲注已经不适用了,可以使用时间注入。时间注入和前面8关的盲注没有本质的区别,我们使用sleep()方法来手动给符合条件的sql增加一个区别。
if(a,sleep(10),1)如果a结果是真的,那么执行sleep(10)页面延迟10秒,如果a的结果是假,执行1,页面不延迟。
一直穷举到页面睡了5秒,剩下的和前面的题是一样的。
Less-10
第10关和第9关一样,只是注入点换成了双引号: