Python編寫漏洞驗證指令碼批次測試繁瑣漏洞
前言
我們實戰經常會遇到以下幾個問題:
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終端中使用