seacms<=9.92前台getshell(已修复)

2019-09-04 约 75 字 预计阅读 1 分钟

声明:本文 【seacms<=9.92前台getshell(已修复)】 由作者 mochazz 于 2019-09-04 09:17:00 首发 先知社区 曾经 浏览数 86 次

感谢 mochazz 的辛苦付出!

一个月前,90sec团队内部分享了一个 seacms 最新版前台 getshell 。鉴于目前 seacms 已经更新到 9.98 版本,本文中的漏洞也已经修复了,网络上也公开了细节,这里将当时的记录分享出来。

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

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

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

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

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

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

getshell 结果如下:

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

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


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