1、效果演示
2、填写漏洞模板
3、批量提交脚本
开发原因:提交漏洞更方便,节省时间。
web_xpath.py
web_bug = {
'反射型XSS': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[1]/li[2]/a',
'存储型XSS': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[1]/li[3]/a',
'基于DOM型XSS': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[1]/li[4]/a'
, '其他类型XSS': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[1]/li[5]/a',
'SQL注入': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[2]/li[2]/a',
'命令注入': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[2]/li[3]/a'
, 'CRLF注入': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[2]/li[4]/a',
'其他注入': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[2]/li[5]/a',
'逻辑漏洞': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[1]/a'
, '平行越权': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[3]/li[2]/a',
'垂直越权': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[3]/li[3]/a',
'其他权限控制缺失': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[3]/li[4]/a'
, '支付漏洞': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[2]/a',
'密码重置': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[4]/li[2]/a',
'任意注册': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[4]/li[3]/a'
, '任意登陆': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[4]/li[4]/a',
'撞库/扫号/暴力破解': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[4]/li[5]/a',
'其他认证缺陷': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/ul[4]/li[6]/a',
'弱口令': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[3]/a',
'条件竞争': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[4]/a',
'代码执行': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[5]/a'
, '信息泄露': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[6]/a',
'文件包含': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[7]/a',
'任意文件操作': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[8]/a'
, '上传漏洞': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[9]/a',
'URL重定向': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[10]/a',
'XXE': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[11]/a'
, 'SSRF': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[12]/a',
'CSRF': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[13]/a',
'疑似入侵/存在后门': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[14]/a'
, '其他': '//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[15]/a'
}
bug_level = {
'高危': '//*[@id="submitform"]/div[6]/div/div/div/ul/li[2]/a',
'中危': '//*[@id="submitform"]/div[6]/div/div/div/ul/li[3]/a',
'低危': '//*[@id="submitform"]/div[6]/div/div/div/ul/li[4]/a'} # 漏洞级别
上面这个可以优化,不需要映射也可以找到对应的xpath,以后优化!!!
auto_vulbox.py
import time
import re
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import web_xpath
from selenium.webdriver.common.keys import Keys
class Auto_vulbox:
# 浏览器初始化
def __init__(self):
# 取消"Chrome正受到自动软件的控制"
self.chrome_options = webdriver.ChromeOptions()
self.chrome_options.add_experimental_option('useAutomationExtension', False)
self.chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
# 声明一个浏览器对象 指定使用chromedriver.exe路径
self.browser = webdriver.Chrome(executable_path='D:\chromedriver.exe', options=self.chrome_options)
self.browser.implicitly_wait(10) # 隐式等待 设定等待时间
self.browser.maximize_window() # 窗口最大化
self.login_url = "https://account.tophant.com/login"
self.username = "xxxx"
self.password = "xxxx"
# 登录漏洞盒子
def login_vulbox(self):
self.browser.get(self.login_url)
username = self.browser.find_element_by_id("username") # 输入用户名
username.send_keys(self.username)
password = self.browser.find_element_by_id("password") # 输入密码
password.send_keys(self.password)
self.browser.find_element_by_id("loginBtn").click() # 点击登录会跳转到登录中心
self.browser.find_element_by_xpath('//*[@id="loginCenter"]/div/div/a[2]').click() # 登录到vulbox 会新打开一个选项卡
self.browser.switch_to.window(self.browser.window_handles[1]) # 切换选项卡到 管理中心
self.browser.find_element_by_css_selector("#two > ul > li:nth-child(2)").click() # 点击提交漏洞按钮
# 复现步骤
def bug_content(self, content_list):
if type(content_list) == list:
for content in content_list:
res = re.findall(r'[a-zA-Z]:\\(?:.*?\\)*?.*', content)
if res:
self.browser.find_element_by_xpath(
'//*[@id="submitform"]/div[15]/div/div[2]/div[1]/div[1]/ul/li[13]/a').click() # 点击图片上传
# self.browser.find_element_by_xpath(
# '//*[@id="submitform"]/div[15]/div/div[2]/div[1]/div[1]/ul/li[13]/div/ul/li[1]/a').click()
self.browser.find_element_by_xpath(
'//*[@id="submitform"]/div[15]/div/div[2]/div[1]/div[1]/ul/li[13]/div/ul/li[1]/a/input').send_keys(
content) # 上传图片
time.sleep(2)
# self.upload_img(content)
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[17]/div/div/div[1]/div[4]').send_keys(
Keys.ENTER)
else:
self.browser.find_element_by_xpath(
'//*[@id="submitform"]/div[15]/div/div[2]/div[1]/div[4]').send_keys(
content)
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[17]/div/div/div[1]/div[4]').send_keys(
Keys.ENTER)
else:
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[15]/div/div[2]/div[1]/div[4]').send_keys(
content_list)
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[17]/div/div/div[1]/div[4]').send_keys(
Keys.ENTER)
# 修复方案
def bug_repair(self, bug_repair_list):
if type(bug_repair_list) == list:
for content in bug_repair_list:
res = re.findall(r'[a-zA-Z]:\\(?:.*?\\)*?.*', content)
if res:
self.browser.find_element_by_xpath(
'//*[@id="submitform"]/div[17]/div/div/div[1]/div[1]/ul/li[13]/a').click() # 点上传图片按钮
# self.browser.find_element_by_xpath(
# '//*[@id="submitform"]/div[17]/div/div/div[1]/div[1]/ul/li[13]/div/ul/li[1]/a').click() # 点上传图片按钮
# self.upload_img(content)
self.browser.find_element_by_xpath(
'//*[@id="submitform"]/div[17]/div/div/div[1]/div[1]/ul/li[13]/div/ul/li[1]/a/input').send_keys(
content) # 上传图片
time.sleep(2)
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[17]/div/div/div[1]/div[4]').send_keys(
Keys.ENTER)
else:
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[17]/div/div/div[1]/div[4]').send_keys(
content)
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[17]/div/div/div[1]/div[4]').send_keys(
Keys.ENTER)
else:
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[17]/div/div/div[1]/div[4]').send_keys(
bug_repair_list)
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[17]/div/div/div[1]/div[4]').send_keys(
Keys.ENTER)
# 自动提交
def gy_src(self, bug_dic):
# bug_dic = {
# 'bug_title': 'xxxx有限公司-存在致远OA任意文件下载',
# 'bug_type': '通用型',
# 'bug_firm_name': 'xxxx股份有限公司',
# 'bug_firm_url': 'www.xxx.cn',
# 'bug_type_web': '任意文件操作',
# 'bug_level': '中危',
# 'bug_description': '致远OA webmail.do文件读取漏洞,由于 /seeyon/webmail.do 页面 filePath 参数过滤不严,导致可以读取系统敏感文件。通过修改filePath参数来下载服务器文件/seeyon/webmail.do?method=doDownloadAtt&filename=conf&filePath=../conf/datasourceCtp.properties',
# 'bug_url': 'http://x.x.x.x:8081/seeyon/index.jsp',
# 'bug_poc': 'GET /seeyon/webmail.do?method=doDownloadAtt&filename=conf&filePath=../conf/datasourceCtp.properties HTTP/1.1\nHost: 58.250.250.236:8081\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\nAccept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3\nAccept-Encoding: gzip, deflate\nCookie: JSESSIONID=2dd52332-d13b-4d67-8365-10e340309a2; loginPageURL=""\nDNT: 1\nConnection: close\nUpgrade-Insecure-Requests: 1',
# 'bug_content': ['C:\\Users\\s\Desktop\\2.png','利用漏洞直接下载', 'C:\\Users\\s\Desktop\\1.png','C:\\Users\\s\Desktop\\2.png','C:\\Users\\s\Desktop\\3.png','C:\\Users\\s\Desktop\\4.png'],
# 'bug_repair': ['打补丁'],
# 'bug_city': '广东/深圳/南山区',
# 'bug_industry': '计算机软件',
# 'bug_industry_type': '',
# 'bug_display': '是'
# }
####################### 漏洞复现/修复方案 文字描述和图片的顺序取决于上面列表中的先后顺序 ############################
# 漏洞标题
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[2]/div/input').send_keys(bug_dic['bug_title'])
# 漏洞类型
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[3]/div/div/div/div[2]/label/input').click() # 通用型
# self.browser.find_element_by_xpath('//*[@id="submitform"]/div[3]/div/div/div/div[1]/label/input').click() # 事件型
# 厂商信息-名称
self.browser.find_element_by_id('bug_firm_name').send_keys(bug_dic['bug_firm_name'])
# 厂商信息-域名
self.browser.find_element_by_id('bug_firm_url').send_keys(bug_dic['bug_firm_url'])
# 漏洞类型
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[5]/div/div[1]/div').click() # 选择漏洞类型
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[5]/div/div[2]/div/ul/li[1]/a').click() # web漏洞
self.browser.find_element_by_xpath(web_xpath.web_bug[bug_dic['bug_type_web']]).click() # 任意文件操作
# 漏洞等级
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[6]/div/div/button').click()
self.browser.find_element_by_xpath(web_xpath.bug_level[bug_dic['bug_level']]).click() # 中危
# 漏洞描述
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[8]/div/textarea').send_keys(
bug_dic['bug_description'])
# 漏洞url/位置
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[9]/div/input').send_keys(bug_dic['bug_url'])
# 漏洞POC请求包
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[11]/div/textarea').send_keys(bug_dic['bug_poc'])
# 复现步骤
self.bug_content(bug_dic['bug_content'])
# 修复方案
self.bug_repair(bug_dic['bug_repair'])
# 所属地区
city = bug_dic['bug_city']
city_xpatg_list = city.split("/")
# FIXME 北京的定位有问题:打开地区列表后北京的dom元素没有加载出来。解决办法一调整分辨率
if len(city_xpatg_list) == 3:
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[18]/div/div/div/span').click() # 打开地区列表
province_xpath = '//li[contains(text(), "{}")]'.format(city_xpatg_list[0]) # //li[contains(text(), "河北")]
self.browser.find_element_by_xpath(province_xpath).click() # 省
city_xpath = '//li[contains(text(), "{}")]'.format(city_xpatg_list[1])
self.browser.find_element_by_xpath(city_xpath).click() # 市
area_xpath = '//li[contains(text(), "{}")]'.format(city_xpatg_list[2])
self.browser.find_element_by_xpath(area_xpath).click() # 区/县
elif len(city_xpatg_list) == 2:
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[18]/div/div/div/span').click() # 打开地区列表
province_xpath = '//li[contains(text(), "{}")]'.format(city_xpatg_list[0]) # //li[contains(text(), "河北")]
self.browser.find_element_by_xpath(province_xpath).click() # 省
city_xpath = '//li[contains(text(), "{}")]'.format(city_xpatg_list[1])
self.browser.find_element_by_xpath(city_xpath).click() # 市
else:
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[18]/div/div/div/span').click() # 打开地区列表
province_xpath = '//li[contains(text(), "{}")]'.format(city_xpatg_list[0]) # //li[contains(text(), "河北")]
self.browser.find_element_by_xpath(province_xpath).click() # 省
# 所属行业
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[19]/div/div/div/input').click() # 打开行业列表
industry = bug_dic['bug_industry']
industry_type = bug_dic['bug_industry_type']
industry_xpath = '//dd[contains(text(), "{}")]'.format(industry)
if "/" in industry: # 区分有无行业分类
self.browser.find_element_by_xpath(industry_xpath).click() # 计算机硬件/网络设备
industry_type_xpath = '//input[contains(@value, "{}")]'.format(industry_type)
self.browser.find_element_by_xpath(industry_type_xpath).click() # 网络设备
else:
self.browser.find_element_by_xpath(industry_xpath).click()
# 匿名
if bug_dic['bug_display'] == "是":
self.browser.find_element_by_xpath('//*[@id="submitform"]/div[21]/div/div/div/div/span[2]').click()
# 提交
self.browser.find_element_by_id("submit").click()
time.sleep(10) # 等待一会页面自动跳转到提交漏洞页面继续提交漏洞
## 预览
# self.browser.find_element_by_xpath('//*[@id="submitform"]/div[23]/div/input[2]').click()
# print(read_bug(bug))
def read_bug(self, bug):
df_example = pd.read_csv(bug, encoding="utf-8")
df_dict = df_example.to_dict(orient='records')
return df_dict
if __name__ == '__main__':
bug = "./bug.csv"
a = Auto_vulbox()
a.login_vulbox()
df_dict = a.read_bug(bug)
for info in df_dict:
if "&" in info['bug_content']:
bug_content = info['bug_content'].split("&")
info['bug_content'] = bug_content
if "&" in info['bug_repair']:
bug_repair = info['bug_repair'].split("&")
info['bug_repair'] = bug_repair
print(info)
a.gy_src(info) # 批量提交
批量提交