最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)Web指紋識別實(shí)例

 更新時(shí)間:2023年10月31日 11:39:23   作者:微軟技術(shù)棧  
這篇文章主要來帶大家探索Web指紋識別:了解主流識別方式,從標(biāo)題到指紋讀取網(wǎng)站信息的簡單方法,揭秘Web指紋識別 關(guān)鍵字、哈希和URL的魔力

web主流的識別方式

在當(dāng)今的Web安全行業(yè)中,識別目標(biāo)網(wǎng)站的指紋是滲透測試的常見第一步。指紋識別的目的是了解目標(biāo)網(wǎng)站所使用的技術(shù)棧和框架,從而進(jìn)一步根據(jù)目標(biāo)框架進(jìn)行針對性的安全測試,指紋識別的原理其實(shí)很簡單,目前主流的識別方式有下面這幾種。

  • 識別特定網(wǎng)頁中的關(guān)鍵字,比對關(guān)鍵字識別框架:這種方式通過在目標(biāo)網(wǎng)頁的HTML、CSS、JavaScript代碼中搜索特定的關(guān)鍵字或標(biāo)識,比對這些關(guān)鍵字與已知框架的特征進(jìn)行識別。例如,如果在網(wǎng)頁中發(fā)現(xiàn)了特定的JavaScript函數(shù)、CSS類名或HTML標(biāo)簽,可以推斷目標(biāo)網(wǎng)站所使用的框架或庫,如jQuery、AngularJS等。
  • 通過計(jì)算特定的相對獨(dú)立頁面的哈希值,比對實(shí)現(xiàn)鑒別:這種方式將目標(biāo)網(wǎng)頁的內(nèi)容進(jìn)行哈希計(jì)算,生成一個唯一的哈希值,并與已知框架的頁面哈希值進(jìn)行比對。如果目標(biāo)網(wǎng)頁的哈希值與某個框架的哈希值匹配,則可以推斷目標(biāo)網(wǎng)站所使用的框架。這種方法適用于那些在不同頁面間保持相對穩(wěn)定的框架,例如單頁應(yīng)用(SPA)。
  • 通過指定URL的TAG模式,鑒別目標(biāo)容器類型:這種方式通過分析目標(biāo)網(wǎng)站的URL結(jié)構(gòu)或特定的URL參數(shù),來推斷目標(biāo)網(wǎng)站所使用的容器類型或框架。例如,如果URL中包含特定的路徑或參數(shù),可以推斷目標(biāo)網(wǎng)站可能是基于某個特定容器,如WordPress、Drupal等。這種方式常用于識別內(nèi)容管理系統(tǒng)(CMS)或其他特定的應(yīng)用程序。

這些指紋識別方式都是通過分析目標(biāo)網(wǎng)站的特定特征或行為,從中推斷所使用的框架或技術(shù)。它們可以幫助滲透測試人員了解目標(biāo)網(wǎng)站的技術(shù)棧和框架,從而進(jìn)行針對性的安全測試和漏洞掃描。本節(jié)內(nèi)容中我們將采用第二種方式通過哈希鑒定來確定目標(biāo)指紋信息,此種方法需要有完善的特征庫,這些庫我們可以自行尋找制作,也可以使用已有的庫經(jīng)過轉(zhuǎn)換后獲取。

讀取到該目標(biāo)網(wǎng)站的標(biāo)題信息

在實(shí)現(xiàn)指紋識別之前,我們先要嘗試讀取到該目標(biāo)網(wǎng)站的標(biāo)題信息,該功能實(shí)現(xiàn)非常簡單,只需要讀入頁面,并依次取出所需要的"Date","Server","X-Powered-By","title"字段即可,由于代碼較為簡單此處就直接放出代碼部分。

import re,socket,threading,requests
import argparse
header = {'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) LySharkTools'}
def GetIPAddress(domain):
    try:
        url = str(domain.split("http://")[1])
        sock = socket.getaddrinfo(url,None)
        result = re.findall("(?:[0-9]{1,3}\.){3}[0-9]{1,3}", str(sock[0][4]))
        return str(result[0])
    except Exception:
        pass
def GetServerTitle(url):
    try:
        address = GetIPAddress(url)
        Respon = requests.get(url=url,headers=header,timeout=5)
        print("--" * 80)
        print(url + "   ",end="")
        print(address + "   ", end="")
        if Respon.status_code == 200:
            RequestBody = [item for item in Respon.headers]
            for item in ["Date","Server","X-Powered-By"]:
                if item in RequestBody:
                    print(Respon.headers[item] + "   ",end="")
            title = re.findall("<title>.*</title>", Respon.content.decode("utf-8"))
            print(title)
    except Exception:
        pass
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-f","--file",dest="file",help="")
    args = parser.parse_args()
    # 使用方法: main.py -f url.log
    if args.file:
        fp = open(args.file,"r")
        for item in fp.readlines():
            url = item.replace("\n","")
            thread = threading.Thread(target=GetServerTitle,args=(url,))
            thread.start()
    else:
        parser.print_help()

這段代碼在運(yùn)行時(shí)讀者需要準(zhǔn)備好需要獲取的網(wǎng)站列表,并每行一列放入url.log文件中,通過運(yùn)行如下圖所示的命令即可依次讀取到這些網(wǎng)站的服務(wù)器信息;

調(diào)用MD5算法計(jì)算出該頁面的HASH值并比對

我們繼續(xù)實(shí)現(xiàn)指紋識別功能,首先利用Requests庫將目標(biāo)頁面讀入到字符串中,然后調(diào)用MD5算法計(jì)算出該頁面的HASH值并比對,由于特定框架中總是有些頁面不會變動,我們則去校驗(yàn)這些頁面的HASH值,即可實(shí)現(xiàn)對框架的識別,代碼很簡單這里就直接放出源代碼。

import requests
import os,sys,hashlib
import argparse
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) LySharkTools'}
def CheckFinger(url,flag,keyworld):
    if flag == 0:
        ret = requests.get(url=url,headers=headers,timeout=1)
        text = ret.text
        md5=hashlib.md5()
        md5.update(text.encode('utf-8'))
        print("目標(biāo)網(wǎng)頁Hash值:  {}".format(md5.hexdigest()))
    else:
        fp = open(keyworld,"r")
        for i in fp.readlines():
            path = url + eval(i.replace("\n", ""))["Path"]
            hash = eval(i.replace("\n", ""))["Hash"]
            web = eval(i.replace("\n", ""))["WebServer"]
            ret = requests.get(url=path, headers=headers, timeout=1)
            if ret.status_code == 200:
                text = ret.text
                md5 = hashlib.md5()
                md5.update(text.encode('utf-8'))
                if md5.hexdigest() == hash:
                    print("目標(biāo)Hash:{}  CMS頁面類型:{} ".format(hash,web))
                else:
                    continue
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--mode",dest="mode",help="設(shè)置檢查類型 [check/get]")
    parser.add_argument("-u","--url",dest="url",help="指定需要檢測的網(wǎng)站地址")
    parser.add_argument("-f","--file",dest="file",help="指定字典數(shù)據(jù)庫 data.json")
    args = parser.parse_args()
    if args.mode == "get" and args.url:
        CheckFinger(args.url,0,args.file)
    # 檢測目標(biāo)容器類型: main.py --mode=check -u https://www.xxx.com -f data.json
    elif args.mode == "check" and args.url and args.file:
        CheckFinger(args.url,1,args.file)
    else:
        parser.print_help()

這段代碼通過使用get方法可獲取到特定頁面的hash值,例如獲取www.lyshark.com網(wǎng)站特定路徑的hash值,則可以執(zhí)行如下命令;

當(dāng)獲取到這些特征后,我們就可以新建database.db文件,并將這些數(shù)據(jù)保存為特定的格式,如下所示;

{"Path":"/about/index.html","Hash": "9e69dd111c6cc873a1f915ca1a331b06","WebServer":"hexo"}
{"Path":"/index.php","Hash": "2457dd111c6cc32461f915ca17789b06","WebServer":"typecho"}
{"Path":"/index.html","Hash": "7530893af83150dc07461f4bc4cc0de6","WebServer":"oss"}

當(dāng)特征庫完整時(shí),即可使用-f指定特征文件,循環(huán)獲取是否匹配特征,從而判斷web容器使用了那種容器。

以上就是 Python 實(shí)現(xiàn)Web指紋識別的詳細(xì)內(nèi)容,更多關(guān)于 Python Web指紋識別的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Django項(xiàng)目單字段區(qū)間查詢的實(shí)現(xiàn)

    Django項(xiàng)目單字段區(qū)間查詢的實(shí)現(xiàn)

    在Django項(xiàng)目中會碰到一些需求就是查詢某個表中的一些字段從某日到某日的數(shù)據(jù),你可以像在SQL中那樣使用SELECT語句來查找指定字段,本文就來介紹兩種方法,感興趣的可以了解一下
    2023-10-10
  • Python抓取通過Ajax加載數(shù)據(jù)的示例

    Python抓取通過Ajax加載數(shù)據(jù)的示例

    在網(wǎng)頁上,有一些內(nèi)容是通過執(zhí)行Ajax請求動態(tài)加載數(shù)據(jù)渲染出來的,本文主要介紹了使用Python抓取通過Ajax加載數(shù)據(jù),感興趣的可以了解一下
    2023-05-05
  • Python區(qū)塊鏈客戶端類開發(fā)教程

    Python區(qū)塊鏈客戶端類開發(fā)教程

    這篇文章主要為大家介紹了Python區(qū)塊鏈客戶端類開發(fā)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python內(nèi)置函數(shù)property()如何使用

    Python內(nèi)置函數(shù)property()如何使用

    這篇文章主要介紹了Python內(nèi)置函數(shù)property()如何使用,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-09-09
  • Python 內(nèi)置函數(shù) oct詳解

    Python 內(nèi)置函數(shù) oct詳解

    Python 的內(nèi)置函數(shù) oct()用于將一個整數(shù)轉(zhuǎn)換為八進(jìn)制以8為基數(shù)字符串表示形式,本文給大家介紹Python 內(nèi)置函數(shù) oct的相關(guān)知識,感興趣的朋友一起看看吧
    2025-07-07
  • python?DataFrame的shift()方法的使用

    python?DataFrame的shift()方法的使用

    在python數(shù)據(jù)分析中,可以使用shift()方法對DataFrame對象的數(shù)據(jù)進(jìn)行位置的前滯、后滯移動,本文主要介紹了python?DataFrame的shift()方法的使用,感興趣的可以了解一下
    2022-03-03
  • 關(guān)于python中第三方庫交叉編譯的問題

    關(guān)于python中第三方庫交叉編譯的問題

    這篇文章主要介紹了python及第三方庫交叉編譯,通過交叉編譯工具,我們就可以在CPU能力很強(qiáng)、存儲控件足夠的主機(jī)平臺上(比如PC上)編譯出針對其他平臺的可執(zhí)行程序,需要的朋友可以參考下
    2022-09-09
  • Python?查找算法之二分查找線性查找與哈希查找實(shí)例探究

    Python?查找算法之二分查找線性查找與哈希查找實(shí)例探究

    這篇文章主要為大家介紹了Python查找算法探究之二分查找、線性查找與哈希查找的實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Python Django 封裝分頁成通用的模塊詳解

    Python Django 封裝分頁成通用的模塊詳解

    這篇文章主要介紹了Python Django 封裝分頁成通用的模塊詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python tkinter實(shí)現(xiàn)界面切換的示例代碼

    python tkinter實(shí)現(xiàn)界面切換的示例代碼

    今天小編就為大家分享一篇python tkinter實(shí)現(xiàn)界面切換的示例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06

最新評論

康定县| 永德县| 西宁市| 云霄县| 定西市| 遂宁市| 巫山县| 南雄市| 安丘市| 枣阳市| 泗洪县| 鄂托克旗| 湖州市| 介休市| 女性| 牟定县| 开远市| 宿松县| 大安市| 台中县| 嵩明县| 仁化县| 成安县| 韶关市| 高碑店市| 北碚区| 将乐县| 阜新| 仁化县| 高邑县| 公安县| 额敏县| 宣恩县| 布尔津县| 龙州县| 曲阳县| 临湘市| 平凉市| 寿光市| 田东县| 环江|