* 本文中涉及到的相关漏洞已报送厂商并得到修复, 本文仅限技术研究与讨论, 严禁用于非法用途, 否则产生的一切后果自行承担
前言
海洋 cms 是为解决站长核心需求而设计的内容管理系统, 一套程序自适应电脑, 手机, 平板, App 多个终端入口, 无任何加密代码, 安全有保障, 是最佳的建站工具.
前段时间看到朋友圈不止一个朋友提到了 seacms 前台无条件 rce, 想起自己最开始学习代码审计时, 也审计过这个系统, 毛都没发现一个, 现在一年过去了, 想看看自己有没有进步, 于是又做一次审计, 结果分析过程中找到一处变量覆盖漏洞. 由于几乎是全局的, 正常情况是有很多方法扩大影响的, 想进行前台 rce, 但是由于系统过滤实在变态, 无奈之下退而求其次, 只好曲线救国了.
另外本篇文章已经在 cnvd 上提交, 且海洋 cms 也已发布了新的版本修复漏洞了, 本篇文章仅用于技术交流, 请勿恶意利用.
正文
seacms 存在全局的变量覆盖漏洞, 最终导致越权进入后台 RCE. 这里以最新版本 v9.92 为例进行演示 (当时是最新的版本, 这两天连续更了三个版本到 v9.95 了).
common.PHP 文件是整个系统的核心文件, 几乎所有的页面都会包含它, 首先在 22 行处为了防止变量覆盖, 对请求中的参数做了校验.
但是这里忘记了校验 "FILES", 而 115 行处又有动态赋值, 导致这里我们可以注册 $FILES 变量
之后在 200 行处判断是否有 $_FILES 变量, 如果有的话就包含 uploadsafe.inc.PHP
跟进 uploadsafe.inc.PHP
可以看到 34 行这里又一个变量覆盖, 且这里没有对 $key 的值做限制, 这样我们就可以覆盖任意值了, 不管是 session 还是 cfg. 但是值得注意的是由于 21 行有判断, 所以如果我们需要覆盖 $SESSION['seaadminid'], 需要在请求中同时添加对应的其他三个参数, 如下图所示, 请求中提交如下五个参数可以覆盖 session 中的 seaadminid,seagroupid, 以及 sea_ckstr(登陆需要使用到的验证码).
现在进行复现漏洞, 在前台注册一个普通用户 test:123456, 系统默认是开启会员功能的, 就算没开启, 也完全可以通过覆盖 $cfg_user 来绕过, 代码如下
这里我就不演示了用户注册了, 注册成功后, 前台登陆抓包, 构造如下图所示请求
登陆成功后, 访问后台地址将会直接进入后台且是管理员权限
后台 RCE
后台 rce 就比较简单了, 可能是运气好, 进后台肯定是想 getshell 嘛, 于是先看了写配置的功能.....
adminconfigmark.PHP 文件是处理图片水印设置的, 19~23 行中循环接收了请求中的 "photo_*" 进行动态注册变量, 然后拼凑成字符串 $configstr
最后在 56 行处写入配置文件中, 然后包含.
复现
保存后, 再次访问
来源: http://www.tuicool.com/articles/qMV73iR