POC:概念證明,即概念驗證(英語:Proof of concept,簡稱POC)是對某些想法的一個較短而不完整的實現,以證明其可行性,示范其原理,其目的是為了驗證一些概念或理論。?
聲明:請勿利用文章內的相關技術從事非法測試,如因此產生的一切不良后果與文章作者和本博客無關。
????????今天本來在手刷漏洞(太菜了,0day挖不出來,只能撿漏一下大佬挖過的),用Fofa?API調用的腳本搜集一下最近剛了解到的網絡設備漏洞的網站信息,導出后發現大概600多條。太多了,手刷有點慢,到網上找了一下也沒有發現此類POC利用的腳本,想了想不如自己寫一個簡易的方便以后操作,編寫完成后想著與大家分享一下編寫思路。(Fofa?API調用腳本網上有很多大佬寫好的,大家可以自行找一下)
編寫思路
第1步:找爬蟲代碼
隨便找了一個爬蟲代碼
import urllib.request
url = "" #請求的URL地址
user_agent = "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0"
headers = {"User-Agent":user_agent} #定義了一個名為"user_agent"的變量,其中存儲了一個用戶代理(User-Agent)字符串,用來偽裝成Mozilla Firefox瀏覽器
req = urllib.request.Request(url,headers = headers) #創建一個Request對象
response = urllib.request.urlopen(req) #發送請求并獲得響應
html = response.read() #讀取響應內容復制給html
print(html) #打印html
第2步:更改輸出信息
改一下輸出,當成功訪問時,輸出網站地址;如果發生異常,則會打印異常信息
import urllib.requesturl = "" #請求的URL地址
user_agent = "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0"
headers = {"User-Agent": user_agent}
req = urllib.request.Request(url, headers=headers)try:urllib.request.urlopen(req)print("成功訪問:"+url) #訪問成功則打印 請求的URL
except Exception as e:print(e) #訪問失敗則打印 異常信息
第3步:SSL證書驗證報錯
?當訪問 https?協議網頁是發生了報錯:
<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1002)>
這個錯誤是由于SSL證書驗證失敗引起的。在使用 urllib.request.urlopen() 函數發送HTTPS請求時,會對服務器的SSL證書進行驗證,以確保連接的安全性。
更改代碼直接忽略SSL證書驗證(這樣做會降低連接的安全性,需要謹慎使用)
import urllib.request
import ssl
url = "" #請求的URL地址
user_agent = "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0"
headers = {"User-Agent":user_agent}
req = urllib.request.Request(url,headers = headers)
context = ssl._create_unverified_context()
try:urllib.request.urlopen(req, context=context)print("成功訪問:"+ url)
except Exception as e:print(e)
第4步:讀取文件中的URL
因為此時還是需要手動向代碼內添加請求URL,所以我們利用循環語句讀取文件內的URL來進行判斷(代碼中文件名為 urls.txt ,可以根據需要自己更改)
import urllib.request
import ssluser_agent = "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0"
headers = {"User-Agent": user_agent}
context = ssl._create_unverified_context()# 從txt文件中讀取url列表
with open("urls.txt", "r") as file:urls = file.readlines()# 使用for循環遍歷url列表
for url in urls:url = url.strip() # 去除每行url中的換行符和空白字符req = urllib.request.Request(url, headers=headers)try:urllib.request.urlopen(req, context=context)print("成功訪問:" + url)except Exception as e:print(e)
第5步:文件目錄和參數信息可控
在利用漏洞進行測試時,我們需要根據不同的漏洞自行輸入不同的 文件目錄?和?參數信息,所以我們需要可控的函數進行傳參(parsed_url[2]和parsed_url[4]分別為文件目錄和參數信息傳參位置)
urlparse() 函數是Python標準庫中 urllib.parse 模塊提供的一個函數,用于解析URL字符串并返回一個包含URL各個部分的命名元組。
????????URL(Uniform Resource Locator)是用于標識互聯網上資源位置的字符串。例如,https://example.com/index.html 就是一個URL。它由多個部分組成,包括協議(scheme)、網絡位置(netloc)、路徑(path)、查詢參數(query)、片段(fragment)等。
quote() 函數是Python標準庫中 urllib.parse 模塊提供的一個函數,用于將字符串進行URL編碼。該函數將字符串中的特殊字符轉換為它們的十六進制表示,以便它們可以安全地在URL中傳輸。
import urllib.request
import ssl
from urllib.parse import urlparse, quoteuser_agent = "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0"
headers = {"User-Agent": user_agent}
context = ssl._create_unverified_context()# 從txt文件中讀取url列表
with open("1.txt", "r") as file:urls = file.readlines()# 使用for循環遍歷url列表
for url in urls:url = url.strip() # 去除每行url中的換行符和空白字符parsed_url = list(urlparse(url)) # 將元組對象轉換成列表parsed_url[2] += "" # 將字符串添加到path屬性上parsed_url[4] = "" # 修改查詢參數部分的值encoded_path = quote(parsed_url[2]) # 對路徑部分進行編碼encoded_query = quote(parsed_url[4]) # 對查詢參數部分進行編碼final_url = f"{parsed_url[0]}://{parsed_url[1]}{encoded_path}?{encoded_query}" # 拼接編碼后的URLreq = urllib.request.Request(final_url, headers=headers)try:urllib.request.urlopen(req, context=context)print("成功訪問:" + final_url)except Exception as e:print(e)
第6步:自動添加協議頭
????????在運行過程中產生了報錯(因為報錯涉及隱私信息就不做展示了),此錯誤是因為在創建 urllib.request.Request 對象時,報告了一個位置的URL類型。通過對錯誤信息查看發現缺少了協議部分,這是由于URL字符串格式不正確導致的,查看后發現導出到?txt?文件中的網站信息存在部分沒有協議。
對url進行判斷,如果有用協議部分,自動添加http協議頭
import urllib.request
import ssl
from urllib.parse import urlparse, quoteuser_agent = "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0"
headers = {"User-Agent": user_agent}
context = ssl._create_unverified_context()# 從txt文件中讀取url列表
with open("1.txt", "r") as file:urls = file.readlines()# 使用for循環遍歷url列表
for url in urls:url = url.strip() # 去除每行url中的換行符和空白字符parsed_url = list(urlparse(url)) # 將元組對象轉換成列表if not parsed_url[0]: # 如果協議部分為空字符串,則手動添加默認協議parsed_url[0] = "http"parsed_url[2] += "" # 將字符串添加到path屬性上parsed_url[4] = "" # 修改查詢參數部分的值encoded_path = quote(parsed_url[2]) # 對路徑部分進行編碼encoded_query = quote(parsed_url[4]) # 對查詢參數部分進行編碼final_url = f"{parsed_url[0]}://{parsed_url[1]}{encoded_path}?{encoded_query}" # 拼接編碼后的URLreq = urllib.request.Request(final_url, headers=headers)try:urllib.request.urlopen(req, context=context)print("成功訪問:" + final_url)except Exception as e:print(e)
????????此時一個網絡設備漏洞利用的簡易POC就編寫完成了,parsed_url[2]和parsed_url[4]分別為文件目錄和參數信息傳參位置