web指紋識別技術

目前網絡上開源的web指紋識別程序不少,如Wapplyzer,BlindElephant,plecost,w3af,whatweb, wpscan, joomscan等等,基本都是國外的,使用的時候因各方面因素會有一些限制,在某些特定環境下須要本身定製指紋識別工具,本文會淺析這些指紋識別程序的 原理以及如何編寫一個web應用指紋識別程序,徹底沒有技術含量,有不妥的地方還望各類SM。javascript

0×01:識別的幾種方式php

目前常見的web應用指紋識別主要有如下幾種方式,澤總已經總結的很明確了。css

1:網頁中發現關鍵字html

2:特定文件的MD5(主要是靜態文件、不必定要是MD5)java

3:指定URL的關鍵字python

4:指定URL的TAG模式web

以上4種模式結合起來識別的話正確率通常在95%以上,除非個別BT的站點修改的體無完膚,如meta、文件路徑、css等都刪除了或故意修改爲其餘的webapp等,那我只能說你屌爆了。正則表達式

0×02:識別方式詳解數據庫

一 般應用程序在html、js、css等文件中多多少少會包含一些特徵碼,這跟ips、waf等產品的特性有點相似,有特徵碼匹配模式。好比 wordpress若是沒有特細隱藏的話,在robots.txt中會包含wp-admin之類,首頁index.php中會包含 generator=wordpress 3.xx,後面爲版本號,頁面中會包含wp-content路徑等等。 
這幾條都是存在網頁中的關鍵字。 其餘的應用也有相似的例子,如discuz、dedecms、phpwind等在頁面中都會發現一些固定的特徵碼。特徵碼如何查找這裏不詳細說明了,下期 會有文章詳細說明如何批量查找特徵碼,接下來先介紹一下幾款常見的web應用指紋識別程序。ruby

1:Wapplyzer

Wapplyzer是基於正則表達式來識別web應用的,以下圖:

點擊在新窗口中瀏覽此圖片

仔細看看Wapplyzer的規則其實很簡單,挑一條看看,以下:

‘WordPress’:             { cats: { 1:  1, 2: 11 }, meta: { ‘generator’: /WordPress/i }, html: /

2:plecost

plecost是基於python架構,利用了Beautiful Soup 來解析html、xml文件識別網站使用的插件及版本。要了解plecost的原理,必須先知道Beautiful Soup是幹啥用的,簡單科普下Beautiful Soup:

Beautiful Soup 是一個 Python HTML/XML 處理器,設計用來快速地轉換網頁抓取。如下的特性支撐着 Beautiful Soup:

Beautiful Soup 不會選擇 即便你給他一個損壞的標籤。 他產生一個轉換DOM樹,儘量和你原文檔內容含義一致 。這種措施一般可以你搜集數據的需求。 
Beautiful Soup 提供一些簡單的方法以及類Python語法 來查找、查找、修改一顆轉換樹:一個工具集幫助你解析一棵樹並釋出你須要的內容。你不須要爲每個應用建立本身的解析工具。 
Beautiful Soup 自動將送進來的文檔轉換爲 Unicode 編碼 並且在輸出的時候轉換爲 UTF-8,。 除非這個文檔沒有指定編碼方式或者Beautiful Soup 沒能自動檢測編碼,你須要手動指定編碼方式,不然你不須要考慮編碼的問題。

再看看plecost代碼,以下圖:

點擊在新窗口中瀏覽此圖片

加載並讀取wp_plugin_list.txt,利用urlopen探測目標url是否存在該插件。Plecos編寫插件也很是方便,在wp_plugin_list.txt裏面寫上插件名稱、最新版本號和cve便可。

3:whatweb

whatweb 是一個web應用程序指紋識別工具,能夠鑑別出內容管理系統(CMS)、博客平臺、統計分析軟件、javascript庫、服務器和其餘更多Web程序。 whatweb擁有超過900個插件,插件是用來鑑別Web應用系統的。所以,開發者呼籲更多的人幫助開發插件,不用擔憂做者聲稱插件是十分容易編寫的。 
能夠說whatweb是目前網絡上比較強大的一款應用識別程序了。它支持正則表達式、md5 hash匹配、url識別、HTML標記模式、蜘蛛爬行等等。

Whatweb插件編寫須要理解一些變量的定義,經過下面的例子就能夠看出個大概,以下:

Plugin.define 「Plone」 do 
author 「Andrew Horton」 
version 「0.2″ 
description 「CMS http://plone.org」 
examples %w| www.norden.org www.trolltech.com www.plone.net www.smeal.psu.edu|dorks [ 
'"powered by plone"' 
]matches [ 
{:name=>"meta generator tag", 
:regexp=>//},

{:name=>"plone css", 
:regexp=>/(@import url|text/css)[^>]*portal_css/.*plone.*css()|」)/}, #」

{:name=>」plone javascript」, 
:regexp=>/src=」[^"]*ploneScripts[0-9]+.js」/}, #」

{:text=>’‘}, {:name=>」div tag, visual-portal-wrapper」, :certainty=>75, :text=>’

‘}, ] def passive m=[] #X-Caching-Rule-Id: plone-content-types #X-Cache-Rule: plone-content-types m << {:name=>」X-Caching-Rule-Id: plone-content-types」 } if @meta["x-caching-rule-id"] =~ /plone-content-types/i m << {:name=>」X-Cache-Rule: plone-content-types」 } if @meta["x-cache-rule"] =~ /plone-content-types/i m end end

:name=>」meta generator tag」,  : 包含匹配的文件名稱,這個文件必須是網站中惟一存在的文件。

:regexp=>是包含的要匹配的模式,它是一個正則表達式,能夠有如下選項:

:regexp 標準的ruby正則表達式

:text  字符

:ghdb google hack數據庫,包含如下幾個模式

inurl: 包含的字符串在url

intitle: 包含的字符串在title

filetype: 包含的文件名,如PDF, JPG, RB等

:md5 請求頁面的md5 hash值

:tagpattern html標籤

:version 能夠設置正則表達式或直接字符串匹配

:string    能夠設置正則表達式或直接字符串匹配

:filepath能夠設置正則表達式或直接字符串匹配,一般顯示系統錯誤或配置文件等

:account 常常用在登錄頁面或用戶列表等

:module 能夠設置正則表達式或直接字符串匹配,如網絡設備可能使用了一個ruby模塊等

:model 能夠設置正則表達式或直接字符串匹配

:firmware 能夠設置正則表達式或直接字符串匹配,設備的固件版本

瞭解了以上選項咱們能夠寫出一個簡單的識別discuz的插件,以下:

Plugin.define 「discuz」 do 
author 「freebuf@gmail.com」 # 2012-05-28 
version 「0.1″ 
description 「discuz – homepage: http://www.discuz.net/」# Examples # 
examples %w| 
www.discuz.net|matches [

# Version detection # Powered by text 
{ :version=>// }, 
{ :version=>/

Powered by <strong>.*Discuz!.*<em>([Xxd.]+)s*/ }, # HTML Comment { :text=>’discuz_uid’ }, ] end </em></strong>

運行以下圖:

點擊在新窗口中瀏覽此圖片

更多whatweb插件開發參考: whatweb

0×03:如何編寫web指紋識別程序

如今網絡上作指紋識別用的最多的是BeautifulSoup,這個插件上面已經介紹過了,而且不少web應用指紋識別程序使用了該插件,這裏就很少介紹了,今天主要介紹下另一個框架:scrapy

Scrapy,Python開發的一個快速,高層次的屏幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結  Scrapy Pthyon爬蟲框架 logo[1]構化的數據。Scrapy用途普遍,能夠用於數據挖掘、監測和自動化測試。

Scrapy吸引人的地方在於它是一個框架,任何人均可以根據需求方便的修改。它也提供了多種類型爬蟲的基類,如BaseSpider、sitemap爬蟲等,最新版本又提供了web2.0爬蟲的支持。

Scrapy 使用 Twisted 這個異步網絡庫來處理網絡通信,架構清晰,而且包含了各類中間件接口,能夠靈活的完成各類需求。總體架構以下圖所示:

點擊在新窗口中瀏覽此圖片

綠 線是數據流向,首先從初始 URL 開始,Scheduler 會將其交給 Downloader 進行下載,下載以後會交給 Spider 進行分析,Spider 分析出來的結果有兩種:一種是須要進一步抓取的連接,例如以前分析的「下一頁」的連接,這些東西會被傳回 Scheduler ;另外一種是須要保存的數據,它們則被送到 Item Pipeline 那裏,那是對數據進行後期處理(詳細分析、過濾、存儲等)的地方。另外,在數據流動的通道里還能夠安裝各類中間件,進行必要的處理。

若是想作一個好的準確的,很是牛逼的web指紋識別,天然少不了爬蟲機制,而作一個爬蟲主要分兩部分:

一:下載 Web 頁面,有許多問題須要考慮,如何最大程度地利用本地帶寬,如何調度針對不一樣站點的 Web 請求以減輕對方服務器的負擔等。一個高性能的 Web Crawler 系統裏,DNS 查詢也會成爲急需優化的瓶頸。

二: 一些「行規」須要遵循(例如 robots.txt)。而獲取了網頁以後的分析過程也是很是複雜的,Internet 上的東西千奇百怪,各類錯誤百出的 HTML 頁面都有,要想所有分析清楚幾乎是不可能的事;另外,隨着 AJAX 的流行,如何獲取由 Javascript 動態生成的內容成了一大難題;除此以外,Internet 上還有有各類有意或無心出現的Spider Trap ,若是盲目的跟蹤超連接的話,就會陷入 Trap 中萬劫不復了

不過,其實並無多少人須要作像 Google 那樣通用的 Crawler ,咱們作一個 Crawler 就是爲了去爬特定的某個網站來進行指紋識別,所謂知己知彼,百戰不殆,咱們能夠事先對須要爬的網站結構作一些分析,事情就變得容易多了。經過分析,選出有 價值的連接進行跟蹤,而後再進行指紋識別。這樣就能夠避免不少沒必要要的連接或者 Spider Trap。

舉個例子,咱們添加一個discuz的識別程序, 
Discuz我簡單例了2個特徵碼以下: 
頁面中meta標籤的generator屬性爲Discuz 
robots.txt 裏面也會有版本信息

OK, 以上2個特徵碼已經能簡單識別該應用了,咱們利用scrapy來提取數據並識別應用。scrapy提取數據主要用到了XPath,它有提供兩個XPath 選擇器,HtmlXPathSelector和XmlXPathSelector,一個用於HTML,一個用於XML,XPath選擇器有三個方法:

select(xpath): 返回一個相對於當前選中節點的選擇器列表(一個XPath可能選到多個節點) 
extract(): 返回選擇器(列表)對應的節點的字符串(列表) 
re(regex): 返回正則表達式匹配的字符串(分組匹配)列表

瞭解了以上方法,寫起來就比較簡單了,下面舉個很是簡單的例子:

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from scrapy.utils.url import urljoin_rfc,urllib,reclass XSSSpider(BaseSpider): 
name=」freebuf」 
allowed_domains=["freebuf.com"] 
start_urls=["http://forum.freebuf.com"]def parse(self, response): 
hxs = HtmlXPathSelector(response) 
c = hxs.select(‘//meta[@name="generator"]/@content’).extract() 
urls = urljoin_rfc(response.url,」robots.txt」) 
t = urllib.urlopen(urls) 
#print a 
a = re.findall(「[Dd]iscuz.*」,t.read()) 
if (a or c): 
print 「Web application details : Discuz」 
else: 
print 「Web application version not found!」

到主項目目錄運行:scrapy crawl freebuf

點擊在新窗口中瀏覽此圖片

以上只是個簡單的例子,固然你也能夠多種條件結合到一塊兒寫成插件的方式調用,以下:

FreebuF["WordPress"] = { 
‘//meta[ () name="generator" and starts-with(@content,"WordPress")]‘, 
‘//head/link[ () rel="stylesheet" and @type="text/css" and contains( @href, "/wp-content/")]‘, 
‘//div[ () id="content"]/div[ () and starts-with(@id, "post-") and div[ ()] and div[ 
()] and div[ ()] and div[ ()]]’, 
}

0×04:後續的一些思考

簡 單的web應用識別不會涉及到爬蟲機制,可是若是需其餘更詳盡的信息以及更準確的識別web應用,以及後期擴展其餘功能,不可缺乏的是爬蟲機制,而爬蟲也 直接影響到程序的執行效率、速度是否夠快,識別是否準確等。這裏就涉及到大規模遞歸抓取了,若是使用scrapy來作爬蟲的話,可能要修改scrapy來 處理如下幾個問題:

1:快速的link extractor

python的SGMLParser實在是太慢了,使用 SgmlLinkExtractor會讓爬蟲把大部分的時間都浪費在解析網頁上,最好本身寫一個link extractor,也能夠用正則表達式來寫link extractor,速度快,問題是不理解html語義,會把註釋裏的連接也包含進來。另外基於javascript重定向url也要在這裏提取出來。

2:Spider Trap

由於spider trap通常是由動態網頁實現的,最簡單的方案就是先經過url是否包含」?」來判斷一個網頁是不是動態網頁,而後取得不包含參數的url地址,對這個地址進行計數,設置一個閾值,超過閾值以後再也不抓取。

3:增量抓取

一個針對多個網站的爬蟲很難一次性把全部網頁爬取下來,而且網頁也處於不斷更新的狀態中,爬取是一個動態的過程,爬蟲支持增量的抓取是很必要的。

4:快速識別 爬蟲抓取數據的時候咱們能夠定位抓取的數據爲js、css、html等,也可指定特定的文件夾文件名稱,如gif、jpg、 png之類。

相關文章
相關標籤/搜索