Web應用指紋識別,是web滲透信息收集最關鍵的一步,這方面開源的工具也非常多,像BlindElephant,whatweb 以及在非安全圈都很火的wappalyzer。本文主要描述如何使用wappalyzer的perl與php接口進行指紋識別。
Wappalyzer的功能是識別單個uri的指紋,其原理就是給指定URI發送HTTP請求,獲取響應頭與響應體并按指紋規則進行匹配。這也是web應用指紋識別最基礎的部分,除此之外,還有指紋置信度計算(如何去處偽造指紋,多種指紋特征如何綜合判斷,隱藏指紋信息如何提取),整個站點的指紋識別還涉及到有效爬蟲抓取,分布式計算等問題,這些都不在本文內容中。
一、perl版本
原理:
給指定uri發送HTTP請求,通過分析HTTP相應的以下部分來判斷指紋
(1) headers特征
響應頭key:value對,多個key:value用逗號隔開,例如
"headers": { "X-AMP-Version": "([\d.]+)\;version:\1", "Set-Cookie": "^AMP=" },
(2) html特征
響應體內容,多個規則用逗號隔開,例如
"html": [ "<div class="[^"]*parbase", "_jcr_content", "/etc/designs/", "/etc/clientlibs/" ]
特別注意:html全文匹配的規則一定要謹慎編寫
(3) url特征
url內容,例如
"url": "/cgi-bin/UCEditor\?(?:.*&)?merchantid=."
(4) meta特征
響應html 頁面中諸如<meta name="version" content="neblog-1.0"/>中的名字name:內容content對,多個規則用逗號隔開,例如
"meta": { "generator": "webEdition", "DC.title": "webEdition" }
(5) script特征
響應html頁面中諸如<script type="text/javascript" src="http://b1.bst.126.net/newpage/r/j/ec.js?v=1413881655525"></script> src中中url內容,多個規則用逗號隔開,例如
"script": [ "angular(?:\-|\.)([\d.]*\d)[^/]*\.js\;version:\1", "/([\d.]+(\-?rc[.\d]*)*)/angular(\.min)?\.js\;version:\1", "angular.*\.js" ]
局限性:
不支持規則文件中APP版本號與置信度的獲取
對非utf8的中文編碼可能會存在問題
優點:
較之PHP版本,使用qr正則預編譯處理,可以提前發現正則的問題,這是我選擇該語言版本的主要原因。
(接下來的php版本就能讓你知道正則不預編譯處理有多坑了!)
腳本的功能:
(1)指紋識別結果按JSON格式返回,以便后續指紋信息入庫等處理
(2)支持批量uri查詢
(3)支持指定自定義JSON格式的指紋規則文件
(默認的指紋文件放置在/usr/lib/perl5/WWW/apps.json ,具體的路徑會因cpan模塊的安裝路徑有區別
可以使用perl -V 察看@INC變量來確定路徑,或者更暴力的find吧)
安裝:
cpan -i WWW::Wappalyzer
clone https://github.com/tanjiti/FingerPrint.git
運行:
(1)獲取單個uri的指紋
perl FingerPrint.pl www.xxx.com<uri 必選> tanjiti.json[指紋規則文件,可選]
返回結果
{
"www.xxx.com": {
"blogs": [
"WordPress"
],
"web-servers": [
"Nginx"
],
"cdn": [
"CloudFlare"
],
"cms": [
"WordPress"
],
"font-scripts": [
"Google Font API"
],
"javascript-frameworks": [
"jQuery"
],
"javascript-graphics": [
"Javascript Infovis Toolkit"
]
}
}
(2) 從文件讀取url列表進行批量指紋識別,并將結果輸出到文件中
perl FingerPrint.pl url.txt<uri 文件路徑 必選> tanjiti.json[指紋規則文件,可選]
結果輸出到 url.txt__fingerprint 文件里
指紋規則文件編寫示例:
more tanjiti.json
"apps": {
"Discuz!":{
"website": "www.discuz.net/forum.php",
"cats": [ 1 ],
"meta": { "generator": "Discuz"},
"headers": {"Set-Cookie": "_lastact.*_sid|_sid.*_lastact|_sid.*smile|smile.*_sid"},
"url": "/uc_server[/$]|uc_client[/$]",
"html": "Powered by (?:Discuz!|<a href="http://www\.discuz\.net/"|UCenter)",
"implies": "php"
},
"PHP": {
"website": "php.net",
"cats": [ 27 ],
"headers": { "Server": "php/?([\d.]+)?\;confidence:40\;version:\1", "X-Powered-By": "php/?([\d.]+)?\;confidence:40\;version:\1", "Set-Cookie": "PHPSESSID" },
"url": "\.php(?:$|\?)"
}
}
二、php版本
原理
同perl版本,區別有兩點:
1. HTTP請求部分:較之perl使用LWP發送HTTP請求,php使用curl發送HTTP請求
2. 規則匹配部分:指紋規則的匹配部分使用javascript語法,然后通過php的v8js模塊來解析。(為什么要這樣做呢?當返回響應體內容很多,指紋正則寫的很爛的時候,會卡死在規則匹配這一過程中,現在的規則下sina,163等大站基本卡死!)
運行
PHP版的接口已經能直接使用了,只是需要替換規則文件,囧
第一步:安裝php、curl及v8js
apt-get install php5-dev php-pear build-essential libv8-dev php5-curl
pecl install channel://pecl.php.net/v8js-0.1.3
echo extension=v8js.so >> /etc/php5/cli/php.ini
驗證是否安裝成功
php -m | grep v8js
v8js ———–OK
第二步:下載Wappalyzer腳本
git clone https://github.com/ElbertF/Wappalyzer.git
cp -R Wappalyzer/drivers/php/* .
cp Wappalyzer/share/js/wappalyzer.js js/
cp Wappalyzer/share/apps.json . (指紋規則文件) 該規則文件的正則編寫的有問題,所以我使用的以前版本的規則文件cp /usr/lib/perl5/WWW/apps.json .
php版指紋識別程序結構如下:
index.php 主程序
Wappalyzer.php
WappalyzerException.php
js/driver.js js/wappalyzer.js
apps.json 指紋規則文件
第三步:驗證是否成功
php index.php www.tanjiti.com
輸出格式為
應用名,版本號,置信度,app類型 (比perl版本多了對版本號,置信度的獲取)
CloudFlare, , 100%, cdn
Javascript Infovis Toolkit, , 100%, javascript-graphics
jQuery, , 100%, javascript-frameworks
Nginx, , 100%, web-servers
PHP, 5.5.9, 100%, programming-languages
Ubuntu, , 100%, operating-systems
WordPress, 4.0, 100%, cms, blogs
接下來的優化輸出為json格式與批量處理uri同perl版本。
最后寄言,一定一定要寫好正則,NFA引擎正則優化TIPS、Perl正則技巧及正則性能評測方法