0x00 前言

该漏洞源于某真实案例,虽然攻击没有用到该漏洞,但在分析攻击之后对该版本的cmf审计之后发现了,也算是有点机遇巧合的味道,我没去找漏洞,漏洞找上了我XD

thinkcmf 已经非常久远了,该版本看github上的更新时间已经是4年前了,也就是2014年的时候,那时候我没学安全呢。。。

0x01 前台sql注入

前台在登录方法中存在注入,thinkcmf是基于thinkphp3.2写的,直接看

文件application\User\Controller\LoginController.class.php 方法 dologin

很明显的注入,通过extract我们可以注册$where数组,而后直接传入where方法,没有经过I方法过滤的引入参数是会引发表达式注入的。

比如这样子:

这里由于有验证码,无法轻易的编写批量脚本。当然引入打码工具另说。

注入之后,我们想到的一定是登录后台了。

那么先了解一下thinkcmf的管理员密码是怎么加密的。

看到 install\index.php 文件的 sp_password 方法

解释一下,$pre就是表前缀,$pw是密码,意思是

存储在数据库的密码 =  表前缀md5的前12位+密码md5+表前缀md5的后四位

比如值为c535018ee946e10adc3949ba59abbe56e057f20f883e89af 存储在数据库的密码。

那么拆分一下就是

c535018ee946(表前缀md5的前12位)
e10adc3949ba59abbe56e057f20f883e(密码md5)
89af(表前缀md5的后四位)

知道所谓的加密算法之后,我们就可以轻易获取到管理员密码的md5值,通过碰撞md5值的形式获取到管理员的真实密码。

现在我们可以登录上后台了,可登录后台之后要怎么getshell呢?

仔细分析了一下thinkcmf的后台,似乎没有可以getshell的地方。

0x02 权限验证处的任意代码执行

认真看了看代码,发现后台的一些操作会有权限验证,而跟踪权限验证代码的时候发现了一个eval的代码块。

看到权限验证处application\Common\Lib\iAuth.class.php  check 方法

使用了eval来引入变量,那么这个$command是否可控呢?

经分析其来源于sp_auth_rule表中的condition字段,备注为规则附加条件

而这些数据在安装的时候就早已经写入到数据库中了,除非我们有办法可以来修改这里的值?

是的,前面的sql注入排上用场了。

thinkphp 自 3系列开始就使用pdo作为连接数据库的驱动,而这里这个注入不涉及到参数绑定等问题,那么我们就可以利用它来执行多语句,插入数据或者修改数据了。

简单测试一下,比如修改一下后台管理员的user_email字段。

查看数据库,成功修改

多语句执行可以为我们省下很多事,比如密码过于复杂无法猜解出明文时,我们可以直接修改密码的hash值为我们想要的。

分析一下权限验证的代码,它是怎么触发的?

随便找了个需要登录后台的文件比如 application\Portal\Controller\AdminPageController.class.php

该controller继承于AdminbaseController,跟踪下去

而在AdminbaseController初始化的函数中,发现了检测权限的代码,跟进

发现如果$uid是1的话就直接返回了,这个$uid其实就是数据库里面的id字段值,也就是说要触发权限验证就必须是一个低权限的用户。

继续走,如果访问的不是url为admin/index/index 就会进行鉴权,跟进sp_auth_check方法

最终来到了我们的check方法。

具体意思都写在解释里面了,看到eval代码块,我们只要闭合掉左括号,即可引入我们的恶意代码。

那么整个利用过程就是登录一个低权限的用户,通过sql注入写入代码到我们可以访问的url的condition字段中。

比如我填加了一个低权限的用户hack,他拥有内容管理的权限

对应他能够访问的url有

那么我们只要在sp_auth_rule表中对应的url的condition字段插入代码,然后登陆该用户访问该url即可触发代码执行。

比如我们通过sql注入插入一段执行phpinfo的代码

payload:

where[id][]=exp&where[id][]=in ();update sp_auth_rules set `condition`='1);phpinfo();die();//' where id=#

请求

查看一下表sp_auth_rule,成功插入

那么后台登陆用户hack之后,访问url

http://127.0.0.1/index.php?g=Portal&m=AdminPage&a=add

即可看到phpinfo执行了

而在之后的研究中,我发现此处权限验证的代码来自于thinkphp 自身。

看到文件simplewind\Core\Library\Think\Auth.class.php  getAuthList方法的代码

是不是有种似曾相识的感觉,是的就是thinkcmf根据tp的改写的。

那么这里就引申出来一个审计点:

tp3框架中如果使用了auth类来验证权限,且有注入点,那么是可以尝试去审计一下任意代码执行。

类似的例子,暂时没看到,以后看到了更新上来。

0x03 总结

总结一下利用:

通过前台的sql注入,获取到后台权限(获取管理员密码,或者修改管理员hash值),登陆进后台,添加低权限用户,再通过sql注入来注入代码。登陆低权限用户,访问注入了代码的url,即可触发任意代码执行。

而在实际中,往往是已经有了低权限的用户,我们只需要观察用户能够访问的URL,直接注入代码即可,免去了添加低权限用户的步骤。

整个利用构造下来还是比较有趣的,不完美的是还是需要登录后台,因为很多网站或许会把后台隐藏掉,但是也有可能会因为不理解tp支持的url模式而导致绕过 ,这里就不细说了,懂的人自然懂。

打完收工~

[漏洞分析]thinkcmf 1.6.0版本从sql注入到任意代码执行的更多相关文章

  1. 【漏洞分析】Discuz! X系列全版本后台SQL注入漏洞

    0x01漏洞描述 Discuz!X全版本存在SQL注入漏洞.漏洞产生的原因是source\admincp\admincp_setting.php在处理$settingnew['uc']['appid' ...

  2. 干货|CVE-2019-11043: PHP-FPM在Nginx特定配置下任意代码执行漏洞分析

    近期,国外安全研究员Andrew Danau,在参加夺旗赛(CTF: Capture the Flag)期间,偶然发现php-fpm组件处理特定请求时存在缺陷:在特定Nginx配置下,特定构造的请求会 ...

  3. 20.Ecshop 2.x/3.x SQL注入/任意代码执行漏洞

    Ecshop 2.x/3.x SQL注入/任意代码执行漏洞 影响版本: Ecshop 2.x Ecshop 3.x-3.6.0 漏洞分析: 该漏洞影响ECShop 2.x和3.x版本,是一个典型的“二 ...

  4. PHP-CGI远程任意代码执行漏洞(CVE-2012-1823)修复方案

    首先介绍一下这个漏洞,其实是在apache调用php解释器解释.php文件时,会将url参数传我给php解释器,如果在url后加传命令行开关(例如-s.-d .-c或  -dauto_prepend_ ...

  5. SQL注入原理及代码分析(二)

    前言 上一篇文章中,对union注入.报错注入.布尔盲注等进行了分析,接下来这篇文章,会对堆叠注入.宽字节注入.cookie注入等进行分析.第一篇文章地址:SQL注入原理及代码分析(一) 如果想要了解 ...

  6. 修复Apache Log4j任意代码执行漏洞安全风险通告

    2021年12月10日 0x01漏洞背景 Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具.该工具重写了Log4j框架,并且引入了 ...

  7. WordPress wp-includes/functions.php脚本远程任意代码执行漏洞

    漏洞名称: WordPress wp-includes/functions.php脚本远程任意代码执行漏洞 CNNVD编号: CNNVD-201309-166 发布时间: 2013-09-13 更新时 ...

  8. Struts 2最新0day破坏性漏洞(远程任意代码执行)等的重现方法

    Struts 2的远程任意代码执行和重定向漏洞,是这两天互联网上最重大的安全事件,据说国内互联网企业中,很多电商纷纷中招,应该已经有大规模的用户隐私泄露.这里我们简单总结下怎样在自己机子上重现这些漏洞 ...

  9. Git漏洞允许任意代码执行(CVE-2018-17456)复现

    Git漏洞允许任意代码执行(CVE-2018-17456) 国外安全研究员 joernchen 在 9 月 23 日向 git 官方报告了漏洞的相关细节.10月5日,Git项目披露了一个漏洞,编号为C ...

随机推荐

  1. 【Python】多线程-线程池使用

    1.学习目标 线程池使用 2.编程思路 2.1 代码原理 线程池是预先创建线程的一种技术.线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中.这些线程都是处于睡眠状态,即均为启动,不消耗 ...

  2. 【转】SSH服务详解

    [转]SSH服务详解 第1章 SSH服务 1.1 SSH服务协议说明 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Working Gro ...

  3. Linux命令学习总结:date命令【转】

    本文转自:http://www.cnblogs.com/kerrycode/p/3427617.html 命令简介: date 根据给定格式显示日期或设置系统日期时间.print or set the ...

  4. 关于 MVCC 的基础【转】

    1. 什么是MVCC 1.1 基础概念 MVCC,Multi-Version Concurrency Control,多版本并发控制.MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据 ...

  5. WPF通过DynamicResource的用法

    1.先在资源类库中编写:style.xaml,如下: <ResourceDictionary   xmlns="http://schemas.microsoft.com/winfx/2 ...

  6. 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  7. Ex 5_26 变量约束是否能同时满足(并查集)_第九次作业

    利用并查集进行处理,定义一个维护数组components,components[i]表示变量序号为i的变量所处的集合,首先处理相等的变量,把它们放入同一个集合中,最后再处理不相等变量,若两个不相等的变 ...

  8. java调用monkeyrunner(亲测绝对可行)

    我自己试验了下和官方的API编写不太一样,老别扭了,建议还是用Python写吧 昨天在网上查了一下一天,都是转来贴别人的,真正敲的很少,我真不知道转的大侠你们自己敲了么? 先截一段不负责任的blog图 ...

  9. NodeJs>------->>第一章:Node.js介绍

    一:章节前言 二:Node.js概述 1:使用node.js能够解决什么问题 2:实现高性能服务器 3:非阻塞型I/O及事件环形机制 4:node.js适合开发的程序 三:node.js安装 一.No ...

  10. 深度学习Bible学习笔记:第二、三章 线性代数 概率与信息论

    推荐资源: <线性代数的本质>:Essence of linear algebra 视频教程 <数学之美>(科普类书籍),吴军系列书籍都不错. 易向军<大嘴巴漫谈数据挖掘 ...