1.     漏洞描述

ThinkCMF是一款基于ThinkPHP+MySQL开发的中文内容管理框架,其中X系列基于ThinkPHP 3.2.3开发,最后更新到2.2.2版本。最近刚好在渗透测试项目中遇到这个CMS,便审了下源码发现多处SQL注入漏洞,在Github给项目方提issues后,提交到CVE官方后很快就拿到了分配的多个编号:CVE-2018-19894、CVE-2018-19895、CVE-2018-19896、CVE-2018-19897、CVE-2018-19898。

2.     影响版本

ThinkCMF X2.2.2(https://github.com/thinkcmf/cmfx)

3.     漏洞分析

3.1  CommentadminController.class.php check、delete方法SQL注入(CVE-2018-19894)

漏洞位于/application/Comment/Controller/CommentadminController.class.php的check、delete方法,
以62行为例,$_POST['ids']参数通过join后,传递到where语句中,但并没有使用where语句的in方法,而是直接拼接到SQL语句中,导致SQL注入。

测试Pyload为

http://127.0.0.1/cmfx/index.php?g=Comment&m=commentadmin&a=check&check=1

POST:  ids[]=1&ids[]=2 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)

3.2 NavController.class.php中edit_post方法SQL注入(CVE-2018-19895)

行。`$parentid`直接由`$_POST['parentid']`传递进来,随后被直接拼接到where语句中。

测试Payload为

http://127.0.0.1/cmfx/index.php?g=Admin&m=nav&a=edit_post

POST: parentid=1 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)

3.3 SlideController.class.php delete方法SQL注入(CVE-2018-19896)

行,delete方法中,$_POST['ids']通过implode方法变成字符串,随后直接拼接进入where语句的in子句中。

测试payload:

http://127.0.0.1/cmfx/index.php?g=Admin&m=slide&a=delete

POST: ids[]=1&ids[]=0 and updatexml(1, concat(0x7e,user(),0x7e),1)

3.4 AdminbaseController.class.php中_listorders方法存在SQL注入(CVE-2018-19897)

_listorders方法用于排序,在很多地方被调用。这里以LinkController.class.php中的listorders()为例进行分析,这里主要用做友情链接的排序。我们以phpstorm+phpstudy+ xdebug打下断点,一步步追踪。测试payload为:

http://127.0.0.1/cmfx/index.php?g=Admin&m=Link&a=listorders

POST: listorders[key][0]=exp&listorders[key][1]=0 and updatexml(1, concat(0x7e,user(),0),1)

行调用父类的_listorders()方法。

跟到application/Admin/Controller/LinkController.class.php 166行的_listorders()方法,$_POST['listorders']为二维数组传递给$ids,经过foreach循环,输入的payload进入$data中,仍然为二维数组,而$data则进入save方法。

行,$data和$options进入update方法,$data仍然为二维数组不变。

 
 

行parseSet方法的定义,$data经过foreach循环后,$val变为一维数组,$key为键值。而当$val为数组并且数组的第一个元素为exp时,$val[1]会和$key直接用等号拼接传递到$set,387行数组$set被逗号implode后拼接到SET子句中。

 
 

返回到update方法,SET子句被拼接到$sql中,最终执行的sql语句为

UPDATE `cmf_links` SET `listorder`=0 and updatexml(1, concat(0x7e,user(),0),1) WHERE `link_id` = 'key'

 
 

3.5  ArticleController.class.php edit_post方法SQL注入(CVE-2018-19898)

ThinkCMF X2.2.2是基于ThinkPHP 3.2.3开发的,ThinkPHP 3.x版本之前被爆出存在bind注入,这个漏洞就是ThinkPHP3.x注入的典型案例。漏洞位于前台文章编辑处,测试payload如下:

http://127.0.0.1/cmfx/index.php?g=portal&m=article&a=edit_post

POST: post[id][0]=bind&post[id][1]=0 and updatexml(1, concat(0x7e,user(),0x7e),1)-- -

行,会调用think_filter方法对参数进行过滤。

 

 由于正则字符中没有匹配bind,所以导致了后面的注入漏洞,ThinkPHP官方的修复措施就是在此处匹配时加上了bind。接下来进入典型的数据库更新操作了,$articles为多维数组包含payload。

我们F7继续跟进,会进入simplewind/Core/Library/Think/Model.class.php的where方法,给$this->options['where']赋值后,返回当前对象。随后进入simplewind/Core/Library/Think/Model.class.php的save方法,随后执行到update方法

 
 

,此处会进行循环操作,将所有的参数进行绑定。

随后进入parseWhere函数

分析parseWhere后,发现会执行 parseWhereItem方法,当$exp=='bind'的时候即$val[0]=='bind',会对$val[1]进行拼接,仔细看这里会多一个`:`,表示为参数绑定时的占位符。

,这是由于parseSet方法以及赋值了一个占位符:0,用来替代时间字符串,在随后的SQL语句执行阶段可被用来赋值,否则占位符没被赋值会因语法问题产生报错。

 
 

、1、2。

 
 

执行时产生XPATH异常报错,得到我们想要的数据。

 
 

4.     修复建议

由于ThinkCMF X系列在2.2.2版本后已经不再更新,建议用户及时升级到Think CMF5。

 

转载:https://anquan.baidu.com/article/490
本文来自百度安全SiemPent Team

欢迎关注,有问题一起学习欢迎留言、评论

ThinkCMF X2.2.2多处SQL注入漏洞分析的更多相关文章

  1. Vtiger CRM 几处SQL注入漏洞分析,测试工程师可借鉴

    本文由云+社区发表 0x00 前言 干白盒审计有小半年了,大部分是业务上的代码,逻辑的复杂度和功能模块结构都比较简单,干久了收获也就一般,有机会接触一个成熟的产品(vtiger CRM)进行白盒审计, ...

  2. Beescms_v4.0 sql注入漏洞分析

    Beescms_v4.0 sql注入漏洞分析 一.漏洞描述 Beescms v4.0由于后台登录验证码设计缺陷以及代码防护缺陷导致存在bypass全局防护的SQL注入. 二.漏洞环境搭建 1.官方下载 ...

  3. PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...

  4. DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入

    0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...

  5. [代码审计]DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入

    0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...

  6. 【代码审计】五指CMS_v4.1.0 copyfrom.php 页面存在SQL注入漏洞分析

      0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...

  7. 【代码审计】五指CMS_v4.1.0 后台存在SQL注入漏洞分析

      0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...

  8. 【代码审计】大米CMS_V5.5.3 SQL注入漏洞分析

      0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...

  9. 【代码审计】iZhanCMS_v2.1 前台IndexController.php页面存在SQL注入 漏洞分析

      0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...

随机推荐

  1. 【原】不定义Order属性,通过切面类的定义顺序来决定通知执行的先后顺序

    [结论] 在多个切面类的“切入点相同”并且每个切面都“没有定义order属性”的情况下,则切面类(中的通知)的执行顺序与该切面类在<aop:config>元素中“声明的顺序”相关,即先声明 ...

  2. 华为S5300系列升级固件S5300SI-V100R006C00SPC800.cc

    这个固件附带了web,V100R005可以直接升级到这个版本,但没什么必要,因为V100R005本身可以直接升级到V200. 升级小插曲: 1.升级的使用使用Windows,不要用Mac或者Linux ...

  3. ATMEL精妙的IRQ中断处理过程

    A: 从栈地址开始,栈顶为AT91SAM7S64的16K片内RAM尽头0x00204000IRQ_STACK_SIZE = 3*8*4FIQ_STACK_SIZE = 0x004ABT_STACK_S ...

  4. generator自动生成mybatis的xml配置

    generator自动生成mybatis的xml配置.model.map等信息:1.下载mybatis-generator-core-1.3.2.jar包.       网址:http://code. ...

  5. DM368 UBL和u-boot的裁剪

    转载:http://blog.csdn.net/olei_oleitao/article/details/7919307   一.DM36X的BOOT过程介绍 DM36x的BOOT过程和DM6446. ...

  6. Google In-App Billing 实现(内含Unity 实现经验)

    实现内购计费 傻逼目录   Adding the AIDL file Updating Your Manifest Creating a ServiceConnection Making In-app ...

  7. JSP 上传文件

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...

  8. springboot-线程池简单使用

    最近做项目,关于订单创建时候因为需要调用远程http服务获取数据,然后校验并写入数据库和修改数据库, 导致接口效率低,所以想到实现异步操作的方式解决. 在调用远程接口成功的时候即认为接口处理成功,返回 ...

  9. jquery实现上线翻滚效果公告

    //样式文件: <style type="text/css"> * { margin:; padding:; } .scrollNews { width: 100%; ...

  10. FFMPEG视音频编解码零基础学习方法 【荐】

    在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频 编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在 ...