zoukankan      html  css  js  c++  java
  • ThinkCMF X2.2.2多处SQL注入漏洞分析

     

     1.     漏洞描述

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

    2.     影响版本

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

    3.     漏洞分析

    3.1  CommentadminController.class.php checkdelete方法SQL注入(CVE-2018-19894

    漏洞位于/application/Comment/Controller/CommentadminController.class.phpcheckdelete方法, 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.phpedit_post方法SQL注入(CVE-2018-19895

    跟进`application/Admin/Controller/NavController.class.php`,在文件的173行。`$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

    application/Admin/Controller/SlideController.class.php93行,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)

    首先进入application/Admin/Controller/LinkController.class.php 70行的listorders方法,71行调用父类的_listorders()方法。

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

    跟进到simplewind/Core/Library/Think/Model.class.php 396行的save方法,该方法为thinkphp的核心函数。由于$data不为空,跳过之前的很多判断直接到452行,$data$options进入update方法,$data仍然为二维数组不变。

       

    跟进到simplewind/Core/Library/Think/Db/Driver.class.php 893行的update()方法,$data经过parseSet方法后拼接到$sql中。跟到371parseSet方法的定义,$data经过foreach循环后,$val变为一维数组,$key为键值。而当$val为数组并且数组的第一个元素为exp时,$val[1]会和$key直接用等号拼接传递到$set387行数组$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)-- -

    application/Portal/Controller/ArticleController.class.php 182行,输入的参数通过I("post.post")传递到$article;跟进到/simplewind/Core/Common/functions.phpI方法定义,在428行,会调用think_filter方法对参数进行过滤。

     

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

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

       

    继续往下,进入到parseSet方法,可以看到传递的参数在进行参数绑定操作,其中时间字符串被赋于占位符0,此处会进行循环操作,将所有的参数进行绑定。

    随后进入parseWhere函数

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

    这里也就理解为什么第二个数组构造的时候需要添加一个数字0,这是由于parseSet方法以及赋值了一个占位符:0,用来替代时间字符串,在随后的SQL语句执行阶段可被用来赋值,否则占位符没被赋值会因语法问题产生报错。

       

    随后可以看到bindValue:0绑定为时间字符串,实际上这里有三个参数需要绑定,因此第二个数组的首位值可以为012

       

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

       

    4.     修复建议

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

     

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

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

  • 相关阅读:
    obj2opengl:转换OBJ 3D模型到iPhone OpenGL ES兼容的数组中
    [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型
    [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析
    Excel双击“单元格”后,自动跳转到相关“工作表
    如何设置UITextField的焦点?
    IOS 数据储存
    解决Use 'LimitInternalRecursion' to increase the limit if necessary的问题 CodeIgniter .htaccess
    iOS 9界面适配利器:详解Xcode 7的新特性UIStackView
    iOS警告收集
    iOS划虚线
  • 原文地址:https://www.cnblogs.com/lovebing/p/10155066.html
Copyright © 2011-2022 走看看