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. 2017/05/03 java 基础 随笔

    1.硬盘500G 厂商是按照1000计算的 500g=500*1000*1000/1024/1024=465g 2.jdk1.7可以表示二进制了 0b001(b大小写无所谓) 3.进制转换 4.原码, ...

  2. Linux安装后首次设置root密码

    ① 1.sudo password root //给指定用户设置密码 2.sudo passwd root //给指定用户设置密码 ②su root //切换到指定用户

  3. SpringMVC使用Burlap发布远程服务

    参考这篇文章https://www.cnblogs.com/fanqisoft/p/10283156.html 将提供者配置类中的 @Bean public HessianServiceExporte ...

  4. NSIS程序安装包制作

    nsis下载地址:http://www.pc6.com/softview/SoftView_14342.html nsis使用: 启动NSIS程序主界面,选择"可视化脚本编辑器(VNISEd ...

  5. 【Python】JBOSS-JMX-EJB-InvokerServlet批量检测工具

    一.说明 在JBoss服务器上部署web应用程序,有很多不同的方式,诸如:JMX Console.Remote Method Invocation(RMI).JMXInvokerServlet.Htt ...

  6. Software development skills for data scientists

    Software development skills for data scientists Data scientists often come from diverse backgrounds ...

  7. GCC编译过程与动态链接库和静态链接库

    1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...

  8. python将图片转换为Framebuffer裸数据格式(终端显示图片)【转】

    转自:https://www.cnblogs.com/zqb-all/p/6107905.html 要在ubuntu终端显示图片或者在板子的LCD显示图片,Framebuffer是一个简单易用的接口, ...

  9. nodejs 访问网站并操作xpath

    var xpath = require('xpath'); //引用xpath包 var dom = require('xmldom-silent').DOMParser;//引用xmldom包 va ...

  10. 025_set专题

    一.sed过滤maven的setting文件的XML注释 sed 's/<!--.*-->//g' /usr/local/apache-maven-3.5.0/conf/settings. ...