POC:概念證明,即概念驗證(英語:Proof of concept,簡稱POC)是對某些想法的一個較短而不完整的實現(xiàn),以證明其可行性,示范其原理,其目的是為了驗證一些概念或理論。?
聲明:請勿利用文章內(nèi)的相關(guān)技術(shù)從事非法測試,如因此產(chǎn)生的一切不良后果與文章作者和本博客無關(guān)。
????????今天本來在手刷漏洞(太菜了,0day挖不出來,只能撿漏一下大佬挖過的),用Fofa?API調(diào)用的腳本搜集一下最近剛了解到的網(wǎng)絡(luò)設(shè)備漏洞的網(wǎng)站信息,導(dǎo)出后發(fā)現(xiàn)大概600多條。太多了,手刷有點慢,到網(wǎng)上找了一下也沒有發(fā)現(xiàn)此類POC利用的腳本,想了想不如自己寫一個簡易的方便以后操作,編寫完成后想著與大家分享一下編寫思路。(Fofa?API調(diào)用腳本網(wǎng)上有很多大佬寫好的,大家可以自行找一下)
編寫思路
第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) #創(chuàng)建一個Request對象
response = urllib.request.urlopen(req) #發(fā)送請求并獲得響應(yīng)
html = response.read() #讀取響應(yīng)內(nèi)容復(fù)制給html
print(html) #打印html
第2步:更改輸出信息
改一下輸出,當成功訪問時,輸出網(wǎng)站地址;如果發(fā)生異常,則會打印異常信息
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}
req = urllib.request.Request(url, headers=headers)
try:
urllib.request.urlopen(req)
print("成功訪問:"+url) #訪問成功則打印 請求的URL
except Exception as e:
print(e) #訪問失敗則打印 異常信息
第3步:SSL證書驗證報錯
?當訪問 https?協(xié)議網(wǎng)頁是發(fā)生了報錯:
<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1002)>
這個錯誤是由于SSL證書驗證失敗引起的。在使用 urllib.request.urlopen() 函數(shù)發(fā)送HTTPS請求時,會對服務(wù)器的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
因為此時還是需要手動向代碼內(nèi)添加請求URL,所以我們利用循環(huán)語句讀取文件內(nèi)的URL來進行判斷(代碼中文件名為 urls.txt ,可以根據(jù)需要自己更改)
import urllib.request
import ssl
user_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循環(huán)遍歷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步:文件目錄和參數(shù)信息可控
在利用漏洞進行測試時,我們需要根據(jù)不同的漏洞自行輸入不同的 文件目錄?和?參數(shù)信息,所以我們需要可控的函數(shù)進行傳參(parsed_url[2]和parsed_url[4]分別為文件目錄和參數(shù)信息傳參位置)
urlparse() 函數(shù)是Python標準庫中 urllib.parse 模塊提供的一個函數(shù),用于解析URL字符串并返回一個包含URL各個部分的命名元組。
????????URL(Uniform Resource Locator)是用于標識互聯(lián)網(wǎng)上資源位置的字符串。例如,https://example.com/index.html 就是一個URL。它由多個部分組成,包括協(xié)議(scheme)、網(wǎng)絡(luò)位置(netloc)、路徑(path)、查詢參數(shù)(query)、片段(fragment)等。
quote() 函數(shù)是Python標準庫中 urllib.parse 模塊提供的一個函數(shù),用于將字符串進行URL編碼。該函數(shù)將字符串中的特殊字符轉(zhuǎn)換為它們的十六進制表示,以便它們可以安全地在URL中傳輸。
import urllib.request
import ssl
from urllib.parse import urlparse, quote
user_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循環(huán)遍歷url列表
for url in urls:
url = url.strip() # 去除每行url中的換行符和空白字符
parsed_url = list(urlparse(url)) # 將元組對象轉(zhuǎn)換成列表
parsed_url[2] += "" # 將字符串添加到path屬性上
parsed_url[4] = "" # 修改查詢參數(shù)部分的值
encoded_path = quote(parsed_url[2]) # 對路徑部分進行編碼
encoded_query = quote(parsed_url[4]) # 對查詢參數(shù)部分進行編碼
final_url = f"{parsed_url[0]}://{parsed_url[1]}{encoded_path}?{encoded_query}" # 拼接編碼后的URL
req = urllib.request.Request(final_url, headers=headers)
try:
urllib.request.urlopen(req, context=context)
print("成功訪問:" + final_url)
except Exception as e:
print(e)
第6步:自動添加協(xié)議頭
????????在運行過程中產(chǎn)生了報錯(因為報錯涉及隱私信息就不做展示了),此錯誤是因為在創(chuàng)建 urllib.request.Request 對象時,報告了一個位置的URL類型。通過對錯誤信息查看發(fā)現(xiàn)缺少了協(xié)議部分,這是由于URL字符串格式不正確導(dǎo)致的,查看后發(fā)現(xiàn)導(dǎo)出到?txt?文件中的網(wǎng)站信息存在部分沒有協(xié)議。
對url進行判斷,如果有用協(xié)議部分,自動添加http協(xié)議頭文章來源:http://www.zghlxwxcb.cn/news/detail-831594.html
import urllib.request
import ssl
from urllib.parse import urlparse, quote
user_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循環(huán)遍歷url列表
for url in urls:
url = url.strip() # 去除每行url中的換行符和空白字符
parsed_url = list(urlparse(url)) # 將元組對象轉(zhuǎn)換成列表
if not parsed_url[0]: # 如果協(xié)議部分為空字符串,則手動添加默認協(xié)議
parsed_url[0] = "http"
parsed_url[2] += "" # 將字符串添加到path屬性上
parsed_url[4] = "" # 修改查詢參數(shù)部分的值
encoded_path = quote(parsed_url[2]) # 對路徑部分進行編碼
encoded_query = quote(parsed_url[4]) # 對查詢參數(shù)部分進行編碼
final_url = f"{parsed_url[0]}://{parsed_url[1]}{encoded_path}?{encoded_query}" # 拼接編碼后的URL
req = urllib.request.Request(final_url, headers=headers)
try:
urllib.request.urlopen(req, context=context)
print("成功訪問:" + final_url)
except Exception as e:
print(e)
????????此時一個網(wǎng)絡(luò)設(shè)備漏洞利用的簡易POC就編寫完成了,parsed_url[2]和parsed_url[4]分別為文件目錄和參數(shù)信息傳參位置文章來源地址http://www.zghlxwxcb.cn/news/detail-831594.html
到了這里,關(guān)于利用python編寫簡易POC腳本的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!