如何编写Python漏洞验证脚本(单线程和多线程)
moboyou 2025-06-07 16:56 47 浏览
我们实战经常会遇到以下几个问题:
1、遇到一个利用步骤十分繁琐的漏洞,中间错一步就无法利用
2、挖到一个通用漏洞,想要批量刷洞小赚一波,但手动去测试每个网站工作量太大
这个时候编写一个poc脚本将会减轻我们很多工作。本文将以编写一个高效通用的poc脚本为目的,学习一些必要的python知识,这周也是拒绝做工具小子努力学习的一周
requests模块使用技巧
Requests是Python中一个常用的HTTP请求库,使用Requests库来发起网络请求非常简单,具体的使用方法这里就不多介绍了,这里只提几个Requests模块的使用技巧,请收好
取消重定向
Requests 会自动处理所有重定向,但有时我们并不需要重定向,可以通过 allow_redirects 参数禁用重定向处理:
r = requests.get('http://github.com', allow_redirects=False)SSL 证书验证
Requests在请求https网站默认会验证SSL证书,可有些网站并没有证书,可增加 verify=False 参数忽略证书验证,但此时可能会遇到烦人的 InsecureRequestWarning 警告消息。最终能没有警告消息也能访问无证书的https网站的方法如下:
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
requests.get('https://github.com', verify=False)代理
使用代理的目的就不说了,使用方法如下:
# http代理,需要指定访问的http协议和https协议两种
proxies = {
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:1080",
}
# socks5代理
proxies = {
'http': 'socks5://user:pass@host:port',
'https': 'socks5://user:pass@host:port'
}
requests.get("http://example.org", proxies=proxies)有个使用技巧就是代理到burp中,检查一下python发包。如我本地抓到requests请求包如下,可以发现特征十分明显,所以我们在实战使用时尽量修改User-Agent
保持cookie
使用session会话对象,向同一主机发送多个请求,底层的 TCP 连接将会被重用,不仅能提性能还能保持cookie
s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")在编写poc脚本时我们只需要利用Requests模块发送带有payload的数据即可,配合上这里的小技巧可能会有更好的体验
验证结果
发送带有payload的请求后,我们需要通过分析响应包判断是否存在漏洞。往往存在漏洞的响应包都有一些特殊值,我们只需要在响应包中找到这样的特殊值即可证明存在漏洞,所以这里我们通常有两种写法
成员运算符 - in
if 'xxx' in r.text:
print('存在漏洞')
else:
print('不存在漏洞')正则匹配 - re.search()
if re.search('xxx',r.text):
print('存在漏洞')
else:
print('不存在漏洞')这两种写法差不多,不过re.search()有个好处是可以使用正则表达式,在漏洞特征是动态变化的情况时也能有效地捕捉
单线程poc脚本
此时我们已经能写一个单线程poc脚本了,我对单线程的poc脚本的要求十分简单,就是简单,在面对不同的漏洞时简单修改几行代码就可以了。这里提供一个我自己写的单线程poc脚本,大概意思就是这样
import requests
import re
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
def Poc(url):
proxy = {
'http':'http://127.0.0.1:8080',
'https':'http://127.0.0.1:8080'
}
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36',
'Connection':'close'
}
data = {'name':'xxxx','value':'xxxx'}
try:
response = requests.post(url=url,headers=headers,data=data,verify=False,proxies=proxy,timeout=10)
if 'baidu' in response.text:
print('存在漏洞')
else:
print('none')
except Exception as e:
print(f'请求失败:{e}')
if __name__ == '__main__':
url = 'https://www.baidu.com'
Poc(url)使用多线程
当我们想批量验证数个网站是否存在漏洞时,就需要多线程来提升效率了。关于Python多线程的详细知识这里就不是这里的重点了。这里我们将利用Threading和queue做一个多线程poc脚本,我计划的流程如下
把所有目标url放到queue队列中;
启动多线程从queue队列中获取目标并执行;
保存执行结果。
具体代码最后会给出
颜色标记
我在使用多线程时就遇到一个问题,因为多线程处理的数据比较多,终端瞬间会输出大量信息,很容易就会忽略一些关键的信息
然后我就想用颜色来区分不同的信息,在linux终端中使用 \033[显示方式;前景色;背景色m 的格式就能输出各个颜色的字体。这里推荐python第三方库:colorama
colorama是一个可以跨多终端显示不同颜色字符与背景的第三方库,在linux终端上,使用ANSI转义字符来实现彩色字体的输出。在windows的终端上,通过包装stdout实现。在windows和linux上有不同的实现方案,从而达到跨平台的效果
安装第三方库的命令各位应该都会吧
pip install colorama具体使用参考官方文档:
https://pypi.org/project/colorama/
我的使用习惯就是报错信息的字体使用红色,发现漏洞的字体使用绿色,此时部分代码如下:
from colorama import init,Fore
init(autoreset=True)
print(Fore.GREEN + '[+]存在漏洞')
print(Fore.RED + '[!]连接错误')使用颜色后的终端输出如下,现在使用体验上明显会更好一点,大家也可以根据自己的喜好去设置
添加进度条
我们使用多线程的目的就是为了更快地处理更多的url,但目标过多,我们还是免不了更长时间的等待。我们经常会把脚本挂在那里跑,然后呆呆的等着。然后我就想做一个进度条,根据进度条能大概地去预估时间,然后安排自己的工作,提升工作效率,这不就是使用脚本的意义吗
我首先就找到了很多人推荐的第三方库: tqdm ,在多线程中使用时可以使用手动更新进度
import time
from tqdm import tqdm
with tqdm(total=200) as pbar:
pbar.set_description('Processing:')
for i in range(20):
time.sleep(0.1)
pbar.update(10)但我这里就遇到一个问题,很多人使用tqdm时只输出一个Progress bar任务条,但我们的需求是希望同时输出每次漏洞探测结果和任务条,这会导致这两者在终端中显示的混乱,如下图所示
有没有一种办法能让任务条一直固定输出在终端的末尾呢,这样两个信息都能很清晰地显示
我找了好久解决方法,但官方似乎说没有找到在多个平台上平等使用tqdm的方法,就没有这个功能。
不过我最终找到官方提供了一个tqdm.write()方法,似乎能解决这个问题,只需要把脚本中所有print()方法换成tqdm.write()方法
到这里我们就成功地拥有了一个进度条
多线程poc脚本
我最终写好的多线程poc脚本如下,中间还有很多可以优化的地方,希望能得到大家的指点
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
import threading
import queue
from colorama import init,Fore
from tqdm import tqdm
init(autoreset=True)
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
global_file_target_url = 'url.txt'
global_file_result = 'right.txt'
global_threads_num = 12
global_q = queue.Queue()
global_list_result = []
# 目标uri
global_where = ''
# payload 成功时页面标志信息
global_payload = 'test'
global_request_proxy = {
'http':'socks5://127.0.0.1:8080',
'https':'socks5://127.0.0.1:8080'
}
global_request_headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36',
'cookie':'xxxxxxxxxxxxxx',
'Connection':'close' #关闭多余的连接请求
}
global_request_data = {'name':'xxxx','value':'xxxx'} #POST传递的数据
global_error = 0
def req(url):
global global_error
i = 0
while i<3:
if i>0:
#print(f'[!]第{i}次重试请求{url}')
tqdm.write(f'[!]第{i}次重试请求{url}')
try:
response = requests.get(url=url,headers=global_request_headers,verify=False,timeout=10)
response.encoding = response.apparent_encoding
text = response.text
if global_payload in text:
return True
else:
return False
except Exception as e:
if i==0:
global_error +=1
i = i+1
#print(Fore.RED+f'[!]{url}请求失败')
tqdm.write(Fore.RED+f'[!]{url}请求失败')
def poc(pbar):
while not global_q.empty():
target_url = global_q.get()
url = target_url+global_where
if req(url):
#print(Fore.GREEN+'[+]存在漏洞:'+target_url)
tqdm.write(Fore.GREEN+'[+]存在漏洞:'+target_url)
global_list_result.append(target_url)
else:
#print('[-]未发现漏洞')
tqdm.write('[-]未发现漏洞')
pbar.update(1)
def main():
# 1、添加目标url队列
with open(global_file_target_url,'r') as f:
urls = f.readlines()
for url in urls:
url = url.strip()
global_q.put(url)
num_url = global_q.qsize()
pbar = tqdm(total=num_url)
pbar.set_description('Processing:')
tqdm.write('url总数:'+str(num_url))
# 2、启动多线程poc验证
threads = []
for _ in range(global_threads_num):
t = threading.Thread(target=poc,args=(pbar,))
threads.append(t)
t.start()
for t in threads:
t.join()
# 3、保存结果到文件 global_file_result
if global_list_result:
file = open(global_file_result,'w')
for res in global_list_result:
file.write(res+"\n")
file.close()
tqdm.write(f'失败请求数{global_error}')
if __name__ == '__main__':
main()原文链接:
https://www.tuicool.com/articles/Y3Mvuuz
相关推荐
- Excel技巧:SHEETSNA函数一键提取所有工作表名称批量生产目录
-
首先介绍一下此函数:SHEETSNAME函数用于获取工作表的名称,有三个可选参数。语法:=SHEETSNAME([参照区域],[结果方向],[工作表范围])(参照区域,可选。给出参照,只返回参照单元格...
- Excel HOUR函数:“小时”提取器_excel+hour函数提取器怎么用
-
一、函数概述HOUR函数是Excel中用于提取时间值小时部分的日期时间函数,返回0(12:00AM)到23(11:00PM)之间的整数。该函数在时间数据分析、考勤统计、日程安排等场景中应用广泛。语...
- Filter+Search信息管理不再难|多条件|模糊查找|Excel函数应用
-
原创版权所有介绍一个信息管理系统,要求可以实现:多条件、模糊查找,手动输入的内容能去空格。先看效果,如下图动画演示这样的一个效果要怎样实现呢?本文所用函数有Filter和Search。先用filter...
- FILTER函数介绍及经典用法12:FILTER+切片器的应用
-
EXCEL函数技巧:FILTER经典用法12。FILTER+切片器制作筛选按钮。FILTER的函数的经典用法12是用FILTER的函数和切片器制作一个筛选按钮。像左边的原始数据,右边想要制作一...
- office办公应用网站推荐_office办公软件大全
-
以下是针对Office办公应用(Word/Excel/PPT等)的免费学习网站推荐,涵盖官方教程、综合平台及垂直领域资源,适合不同学习需求:一、官方权威资源1.微软Office官方培训...
- WPS/Excel职场办公最常用的60个函数大全(含卡片),效率翻倍!
-
办公最常用的60个函数大全:从入门到精通,效率翻倍!在职场中,WPS/Excel几乎是每个人都离不开的工具,而函数则是其灵魂。掌握常用的函数,不仅能大幅提升工作效率,还能让你在数据处理、报表分析、自动...
- 收藏|查找神器Xlookup全集|一篇就够|Excel函数|图解教程
-
原创版权所有全程图解,方便阅读,内容比较多,请先收藏!Xlookup是Vlookup的升级函数,解决了Vlookup的所有缺点,可以完全取代Vlookup,学完本文后你将可以应对所有的查找难题,内容...
- 批量查询快递总耗时?用Excel这个公式,自动计算揽收到签收天数
-
批量查询快递总耗时?用Excel这个公式,自动计算揽收到签收天数在电商运营、物流对账等工作中,经常需要统计快递“揽收到签收”的耗时——比如判断某快递公司是否符合“3天内送达”的服务承...
- Excel函数公式教程(490个实例详解)
-
Excel函数公式教程(490个实例详解)管理层的财务人员为什么那么厉害?就是因为他们精通excel技能!财务人员在日常工作中,经常会用到Excel财务函数公式,比如财务报表分析、工资核算、库存管理等...
- Excel(WPS表格)Tocol函数应用技巧案例解读,建议收藏备用!
-
工作中,经常需要从多个单元格区域中提取唯一值,如体育赛事报名信息中提取唯一的参赛者信息等,此时如果复制粘贴然后去重,效率就会很低。如果能合理利用Tocol函数,将会极大地提高工作效率。一、功能及语法结...
- Excel中的SCAN函数公式,把计算过程理清,你就会了
-
Excel新版本里面,除了出现非常好用的xlookup,Filter公式之外,还更新一批自定义函数,可以像写代码一样写公式其中SCAN函数公式,也非常强大,它是一个循环函数,今天来了解这个函数公式的计...
- Excel(WPS表格)中多列去重就用Tocol+Unique组合函数,简单高效
-
在数据的分析和处理中,“去重”一直是绕不开的话题,如果单列去重,可以使用Unique函数完成,如果多列去重,如下图:从数据信息中可以看到,每位参赛者参加了多项运动,如果想知道去重后的参赛者有多少人,该...
- Excel(WPS表格)函数Groupby,聚合统计,快速提高效率!
-
在前期的内容中,我们讲了很多的统计函数,如Sum系列、Average系列、Count系列、Rank系列等等……但如果用一个函数实现类似数据透视表的功能,就必须用Groupby函数,按指定字段进行聚合汇...
- Excel新版本,IFS函数公式,太强大了!
-
我们举一个工作实例,现在需要计算业务员的奖励数据,右边是公司的奖励标准:在新版本的函数公式出来之前,我们需要使用IF函数公式来解决1、IF函数公式IF函数公式由三个参数组成,IF(判断条件,对的时候返...
- Excel不用函数公式数据透视表,1秒完成多列项目汇总统计
-
如何将这里的多组数据进行汇总统计?每组数据当中一列是不同菜品,另一列就是该菜品的销售数量。如何进行汇总统计得到所有的菜品销售数量的求和、技术、平均、最大、最小值等数据?不用函数公式和数据透视表,一秒就...
- 一周热门
- 最近发表
-
- Excel技巧:SHEETSNA函数一键提取所有工作表名称批量生产目录
- Excel HOUR函数:“小时”提取器_excel+hour函数提取器怎么用
- Filter+Search信息管理不再难|多条件|模糊查找|Excel函数应用
- FILTER函数介绍及经典用法12:FILTER+切片器的应用
- office办公应用网站推荐_office办公软件大全
- WPS/Excel职场办公最常用的60个函数大全(含卡片),效率翻倍!
- 收藏|查找神器Xlookup全集|一篇就够|Excel函数|图解教程
- 批量查询快递总耗时?用Excel这个公式,自动计算揽收到签收天数
- Excel函数公式教程(490个实例详解)
- Excel(WPS表格)Tocol函数应用技巧案例解读,建议收藏备用!
- 标签列表
-
- 外键约束 oracle (36)
- oracle的row number (32)
- 唯一索引 oracle (34)
- oracle in 表变量 (28)
- oracle导出dmp导出 (28)
- 多线程的创建方式 (29)
- 多线程 python (30)
- java多线程并发处理 (32)
- 宏程序代码一览表 (35)
- c++需要学多久 (25)
- css class选择器用法 (25)
- css样式引入 (30)
- css教程文字移动 (33)
- php简单源码 (36)
- php个人中心源码 (25)
- php小说爬取源码 (23)
- 云电脑app源码 (22)
- html画折线图 (24)
- docker好玩的应用 (28)
- linux有没有pe工具 (34)
- 可以上传视频的网站源码 (25)
- 随机函数如何生成小数点数字 (31)
- 随机函数excel公式总和不变30个数据随机 (33)
- 所有excel函数公式大全讲解 (22)
- 有动图演示excel函数公式大全讲解 (32)
