某些**為了實現友好的使用者互動,提供了一種自定義的錯誤頁面,而不是顯示乙個大大的404 ,比如csdn上的404提示頁面如下:
這樣雖然提高了使用者體驗,但是在編寫對應poc進行檢測的時候如果只根據返回的http頭部資訊判斷,則很可能造成誤報,為了能準確檢測到404頁面,
需要從狀態碼和頁面內容兩個方面來進行判斷。
從狀態碼來判斷比較簡單。可以直接使用requests庫傳送http請求,得到響應碼即可。
從頁面內容上進行判斷的話,採用的思路是訪問web站點上明顯不存在的頁面,獲取頁面內容進行儲存,然後訪問目標頁面,將二者進行比較,如果相似度達到某一閾值,則該頁面為404頁面,否則為正常頁面。
為了判斷兩個頁面的相似度,採用python的simhash庫,這個庫具體實現的演算法我不太懂,但是python的好處就是:不懂無所謂,直接拿來用就行。這裡也只是簡單的拿來用一下:
#-*- encoding:utf-8 -*-
# 404 頁面識別
from hashes.simhash import simhash
import requests
class page_404:
def __init__(self, domain): #檢測站點
self._404_page = # 404頁面
self._404_url = #404 url
self._404_path = ["test_404.html", "404_test.html", "helloworld.html", "test.asp?action=modify&newsid=122%20and%201=2%20union%20select%201,2,admin%2bpassword,4,5,6,7%20from%20shopxp_admin"] #404頁面路徑,用於生成一部分404頁面
self._404_code = [200, 301, 302] #當前可能是404頁面的http請求的返回值
#自己構造404url,以便收集一些404頁面的資訊
for path in self._404_path:
for path in self._404_path:
if domain[-1] == "/":
url = domain + path
else:
url = domain + "/" + path
response = requests.get(url)
if response.status_code in self._404_code:
if _404_page not in self._404_page:
if _404_url not in self._404_url:
def is_similar_page(self, page1, page2):
hash1 = simhash(page1)
hash2 = simhash(page2)
similar = hash1.similarity(hash2)
if similar > 0.85: #當前閾值定義為0.85
return true
else:
return false
def is_404(self, url):
if url in self._404_url:
return true
response = requests.get(url)
if response.status_code == 404:
return true
if response.status_code in self._404_code:
for page in self._404_page:
if self.is_similar_page(response.content, page):
return true
else:
return false
return false
上面的**中,檢測類中主要儲存了這樣幾個資訊:
_404_page:404頁面,用於與其他請求的頁面進行相似度判斷,以便識別404頁面,這裡用列表主要為了防止乙個站點有多種404頁面,這段**執行時間越長它的準確度越高
_404_url:404 頁面的url,儲存之前判斷出頁面是404的url,已經判斷出來的就不再判斷,為了提公升效率
_404_path:構建不存在頁面的url,最後乙個是乙個sql注入的**,這裡為了識別出那些被防火牆攔截而顯示的錯誤頁面
_404_code:可能返回404頁面的響應碼,如果響應碼為這些,則需要對頁面進行判斷
類在初始化時需要傳入乙個網域名稱,根據這個網域名稱來拼接幾個不存在的或者會被防火牆攔截的請求並提交這些請求,得到返回資訊,將這些資訊作為判斷的資訊進行儲存。
在判斷時首先根據之前儲存的404 url資訊進行判斷,如果當前url是404頁面則直接返回,提高效率。然後提交正常的http請求並獲取響應資訊,
如果響應碼為404則返回true,否則再狀態碼是否在_404_code列表中,最後再與之前儲存的404頁面資訊進行比較得到結果。
這段**的測試**如下:
from page_404 import page_404
if __name__ == '__main__':
domain = ""
check_404 = page_404(domain)
dest_url = "/textbox2.asp?action=modify&newsid=122%20and%201=2%20union%20select%201,2,admin%2bpassword,4,5,6,7%20from%20shopxp_admin"
print (check_404.is_404(dest_url))
python檢測404頁面
某些 為了實現友好的使用者互動,提供了一種自定義的錯誤頁面,而不是顯示乙個大大的404 比如csdn上的404提示頁面如下 這樣雖然提高了使用者體驗,但是在編寫對應poc進行檢測的時候如果只根據返回的http頭部資訊判斷,則很可能造成誤報,為了能準確檢測到404頁面,需要從狀態碼和頁面內容兩個方面來...
python檢測404頁面
某些 為了實現友好的使用者互動,提供了一種自定義的錯誤頁面,而不是顯示乙個大大的404 比如csdn上的404提示頁面如下 這樣雖然提高了使用者體驗,但是在編寫對應poc進行檢測的時候如果只根據返回的http頭部資訊判斷,則很可能造成誤報,為了能準確檢測到404頁面,需要從狀態碼和頁面內容兩個方面來...
python3判斷url鏈結是否為404的方法
import pymysql import threading import time import urllib import requests 開啟資料庫連線 db pymysql.connect 192.168.0.username password databasename 使用 curso...