seacms<=9.92前台getshell(已修复)
2019-09-04 10:17:00 Author: xz.aliyun.com(查看原文) 阅读量:216 收藏

一个月前,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 写的真的很烂,代码有很多问题。


文章来源: http://xz.aliyun.com/t/6191
如有侵权请联系:admin#unsafe.sh