单线程和多线程 如何编写Python漏洞验证脚本

我们实战经常会遇到以下几个问题:
1、遇到一个利用步骤十分繁琐的漏洞,中间错一步就无法利用
? 2、挖到一个通用漏洞,想要批量刷洞小赚一波,但手动去测试每个网站工作量太大
这个时候编写一个poc脚本将会减轻我们很多工作 。本文将以编写一个高效通用的poc脚本为目的,学习一些必要的Python知识,这周也是拒绝做工具小子努力学习的一周

单线程和多线程 如何编写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 requestsfrom requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.packages.urllib3.disable_warnings(InsecureRequestWarning)requests.get('https://github.com', verify=False) 
代理【单线程和多线程 如何编写Python漏洞验证脚本】使用代理的目的就不说了,使用方法如下:
# 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
单线程和多线程 如何编写Python漏洞验证脚本

文章插图
 
 
保持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的请求后,我们需要通过分析响应包判断是否存在漏洞 。往往存在漏洞的响应包都有一些特殊值,我们只需要在响应包中找到这样的特殊值即可证明存在漏洞,所以这里我们通常有两种写法
单线程和多线程 如何编写Python漏洞验证脚本

文章插图
 
 
 
成员运算符 - inif '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 requestsimport refrom requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.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 = https://www.isolves.com/it/cxkf/yy/Python/2022-02-07/{'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)


推荐阅读