这个漏洞比较有趣,写出来给大家分享一下
这个漏洞影响的版本有ranzhi协同oa<=4.6.1(包含专业版)还有喧喧及时聊天系统<=1.3
出问题的地方是喧喧聊天系统,由于然之开源版和专业版自4.0之后都自带这个聊天系统,所以都会被影响
从官网下周然之4.6.1之后首先看ranzhi\www\xuanxuan.php,这个文件是喧喧的入口,加载的模块在ranzhi\framework\xuanxuan.class.php,由于聊天信息是用aes加密过的,初始的密钥是88888888888888888888888888888888,我相信没有几个人会去改的吧,所以漏洞一开始就已经埋下来了
再往下看,看到118行的parseRequest这个函数,看看这个系统是怎么处理传递进来的参数的
首先,从原始post数据获取数据,解密,获取userID,module,method,params这几个参数,其中userID的用户id,module是调用模块,method是调用的方法,params是传递的参数,这里有一个限制,模块只能加载chat里面的,也就是只能加载和调用ranzhi\app\sys\chat\control.php这里面的函数,由于调用的函数名可以控制,其实可以调用继承的父类种函数,对,这个漏洞最关键一点是可以调用父类函数,看一下,这个chat类继承于control
control类在ranzhi\framework\control.class.php,可以看到这个类里面只有一个函数就是fetch函数,但是这个类又继承了baseControl这个类,但是已经不重要了,用这个函数就可以了
这个函数在前面检查模块是否存在之后就把参数放入call_user_func_array中了
call_user_func_array(array($module, $methodName), $params);这个函数的调用相当于$module::$methodName($params),$methodName只能是public类型才可以,可以利用call_user_func_array调用php的任意内置类的public函数,也可以调用include的任意类,所以我在不断尝试之后,最终选择调用baseDAO类的query函数去操纵数据库,添加一个管理员账号,因为然之后台可以查看网站的绝对地址:
数据库密码:
执行任意命令: