漏洞介绍
CMS Made Simple(CMSMS)是一个免费的开放源码内容管理系统,为开发人员、程序员和网站所有者提供基于网络的开发和管理功能。CVE-2019-9053是一个未验证的SQL注入漏洞,攻击者可利用该漏洞获取管理员密码或密码重置令牌。
漏洞范围
CMS Made Simple < 2.2.10
漏洞靶场
使用vulhub的靶场:
使用的环境是cmsms 2.2.9.1
vulhub-master/cmsms/CVE-2019-9053
启动靶场环境:
1 | docker-compose up -d |
服务启动后,访问http://your-ip/install.php并安装CMS服务。安装过程请根据页面中的安装向导来进行,其中MySQL数据库的地址是db,数据库名是cmsms,账号和密码均为root。

一路Next安装
访问http://127.0.0.1出现首页说明安装成功

漏洞原理
漏洞文件为 :/modules/News/action.default.php
主要内容如下:
1 | <?php |
/modules/News/action.default.php#L40-L70, L95-L108, L174
代码实例比较简单,params变量为重写的GET和POST请求,在这里idlist参数通过GET的方式获得传入的数值,经过字符判断,数组分割,再剔除无用数据,判断有无重复值,然后直接拼接到SQL语句query1中,最后在SelectLimit函数中执行。
SelectLimit函数如下:
1 | public function &SelectLimit( $sql, $nrows = -1, $offset = -1, $inputarr = null ) |
lib/classes/Database/class.Connection.php#L285-L330
可以看到,该函数将传入进来的SQL语句,拆分并装入数组,根据数组内字符类型不同而进行不同的处理,最后再重新拼接起来,执行SQL语句。这样的处理就导致了普通的SQL注入无法进行,如上文中的联合注入(联合注入中的一些字符在进行分割时被丢弃了)和普通布尔型注入(这里的SQL语句仅仅是整个SQL语句中的片段,并不影响整个SQL语句执行结果的TRUE或者FALSE)。
如下图,为整个SQL查询的语句:

漏洞复现
poc使用
使用https://www.exploit-db.com/exploits/46635的poc
1 | python2 poc.py -u http://your-ip |

获取了用户名,邮箱,密码的盐值和hash值
根据源码可知,密码是盐值与密码进行了拼接后进行了md5处理

参考
https://cloud.tencent.com/developer/article/1472573