HikaShop是基于著名开源CMS Joomla!的电子商务程序,可以帮助用户轻松的开发电子商务网站或网店。
距离上次发现Joomla!的HikaShop扩展对象注入漏洞(影响版本<2.3.3)已经两月有余了。现在这个漏洞允许黑客向网站发送恶意指令,从而造成远程代码执行。
对象注入通常发生在用户的输入,被传递给unserialize()函数然后进行调用的时候。黑客可以通过构造输入内容,向WEB服务器发送当前WEB应用下的一个序列化的类实例,保证这些被定义为魔术方法的类,在特定的时候会被触发,从而执行其中的恶意代码。
代码中的$infos变量被设置为JRequest::getVar()的返回值,这就意味着它可以接收$_GET['infos']或者$_POST['infos']的值。接着,$infos的值被base64编码后,会传递给unserialize()函数。
Hikashop漏洞的攻击利用方法如图:
首先要做的,就是分析该程序代码的执行顺序。PHP类的析构方法__destruct(),在脚本执行完毕时会自动执行析构函数。
在这个特定案例下,选择JDatabaseDriverMysqli类的析构方法来达成需求,这可以从任何存在的类里去调用方法。Destruct函数调用disconnect方法如图:
这里采用了$this->disconnectHandlers调用那些回调函数,Disconnect函数如图:
通过创建一个改版过的JDatabaseDriverMysqli类,它可以更改变量的默认值。特别需要指出的是,我们需要满足几个条件来实现序列化。一旦Hikashop被反序列化,会生成一些实例,然后析构函数会执行我们提供的任何函数或者方法。为了实现上述的需求,我们需要做到以下几点:
我们不能控制传递给目标函数的参数内容,这就限制了我们在以下环境里研究方法:
使用一些grep命令,我们会看到PHPMailer类的这个方法,PHPMailer类的require_once方法如图:
传递PHPMailer的一个实例,把$this->PluginDir设置指向为可以进行hack的地址(这可以产生一个LFI/RFI攻击,我们把$this->PluginDir指向http://blog.sucuri.net/)。然而这样会出现两个问题:问题1 PHPMailer类在当前环境下没有做定义
Joomla!采用了一些非常规则的类进行自动加载,这使得我们在导入PHPMailer类的过程中,自动导入JMail组件。为解决这个问题,在没有使用过的JDatabaseDriverMysqli的变量中创建了JMail的一个实例。这样的话,自动导入机制可以在导入JMail组件的文件的同时,加载PHPMailer的定义。
问题2 SmtpSend()方法被定义为保护模式,防止外部使用
如果不能直接调用SmtpSend(),可以找出另一个public方法,对SmtpSend()进行调用。PostSend函数调用SmtpSend()如图:
如下图是一个带有PostSend()函数的方法,即$this->SendmailSend(),Sendmail函数:
popen()函数使用了$sendmail变量($sendmail变量通常包含“/usr/sbin/sendmail -oi -t”或者“/usr/sbin/sendmail -oi -f’[email protected]’ -t”)来执行shell命令,所以可以使用Sendmail函数来发电子邮件。经过进一步分析,可以发现它使用了两个变量,即$this->Sender和$this->Sendmail,前者可以为空。它们使用了不同的函数:escapeshellcmd()和escapeshellarg()。在escapeshellcmd()里调用$this->Sendmail的话,以下这些特殊字符会被编码:#&;`|*?~^()[]{}$\, \x0A以及\xFF。最后只能使用字母、数字以及少量如“/”和“-”这样的字符。我们可以在Sendmail函数的原始命令中加入需要的参数。
还没有评论,来说两句吧...