seacms9.92从变量覆盖到getshell(已修复)

2019-09-07 约 97 字 预计阅读 1 分钟

声明:本文 【seacms9.92从变量覆盖到getshell(已修复)】 由作者 mochazz 于 2019-09-07 11:05:36 首发 先知社区 曾经 浏览数 96 次

感谢 mochazz 的辛苦付出!

前几天看到朋友在 Freebuf 发的 seacms 9.92全局变量覆盖从越权到RCE 文章,其实这个地方在1个月前审计另外一个洞的时候也发现了,这里简单记录下。鉴于漏洞已经修复,且网络上已公开细节,这里便分享出来。

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

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

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

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

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

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

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

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 ,接着直接访问后台地址就可以越权登录了。

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

严重怀疑这个 CMS 把别的 CMS 漏洞抄了一遍?可以参考 DedeCMS、DuomiCMS 等的历史漏洞。再一个,即便是最新版的代码,虽然过滤了 $_SESSION、$_FILES ,但是我们前面说过,程序本身的校验逻辑顺序就有问题。我们只要找到 session_start() 的地方,就又可以覆盖 $_SESSION ,只不过 $_SESSION['hashstr'] 我们无法预测罢了。

关键词:[‘安全技术’, ‘漏洞分析’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now