手工檢測Web應用指紋(分析網站技巧)
http://www.freebuf.com/news/137497.html?utm_source=tuicool&utm_medium=referral
0×01 Web 應用技術概覽
1.1 架構
大多數 web 應用可以粗略劃分為三個元件(component)。
1、客戶端, 大多數情況下是瀏覽器。
2、服務端, Web 伺服器接收客戶端的HTTP請求並進行響應。另外,有時候 Web伺服器只轉發請求到應用伺服器(Application Server),由應用伺服器來處理請求。
3、後端儲存, 後端儲存一般是DBMS,用於查詢和儲存資料。
所有元件都有不同行為,這些不同行為將影響漏洞的存在性和可利用性。所有元件(無論是客戶端還是服務端)都有可能產生漏洞或者其他安全問題。
1.2 客戶端技術
主流的客戶端技術每天都在被大量網際網路使用者使用,包括 HTML, JavaScript, Flash … 他們常用的瀏覽器則是 Chrome, Firefox, Opera, IE/Edge, Safari 等。另外,包括Android應用的 webview 以及部分PC客戶端應用(比如QQ或者某些遊戲登陸器),也會引入一部分 web 客戶端技術。
1.3 服務端技術
在服務端,儘管使用任何技術的任何Web應用都有或多或少的潛在漏洞,但對於某些特定技術(如PHP, Struts2等)的網站,則相對更容易產生漏洞。簡單劃分的話服務端技術大概有以下幾類。
1、Web伺服器(Web Server), 包括 Apache, lighttpd, Nginx, IIS.
2、應用伺服器(Application Server), 包括 Tomcat, Jboss, Oracle Application server .
3、程式語言, 包括 PHP, Java, Ruby, Python, C#. 對於後三種語言,一些常見的框架包括 Ruby-on-Rails, .Net MVC, Django 等。
1.4 後端儲存技術
對於大多數中小型網站,資料庫和Web伺服器是在同一臺主機的。常見的後端儲存技術包括:
1、關係型資料庫, 包括 MySQL, Oracle, DB2, SQL Server, PostgreSQL, SQLite 等。
2、NoSQL, 包括 MongoDB, CouchDB, Redis 等。
3、目錄訪問, 包括 openLDAP, Active Directory。
0×02 Web 伺服器指紋分析
2.1 Web 伺服器指紋內容
我們想要尋找哪些資訊。
1、Web伺服器名稱,版本
2、Web伺服器後端是否有應用伺服器
3、資料庫(DBMS)是否部署在同一主機(host),資料庫型別
4、是否使用反向代理(reverse proxy)
5、是否使用負載均衡(load balancing)
6、Web應用使用的程式語言
2.2 手工檢測技巧
2.2.1 HTTP分析
使用chrome開發者工具或者burpsuite互動式抓包分析HTTP資料。
1、重點觀察 響應頭(Response Header)的 Server, X-Powered-By, Set-Cookie 欄位。
2、使用畸形 Host欄位的 HTTP請求試探,觀察響應頭。
比如 Struts2 的特徵之一就是會設定特殊的JSESSIONID
的cookie欄位。
Set-Cookie: JSESSIONID=C09CBBF************7CF6D25D4F0
又或者以freebuf為例,你可以觀察到兩個有趣的欄位,Server欄位以及WP-Super-Cache。
Server欄位說明 freebuf 的伺服器版本是 Apache 2.2.21
WP-Super-Cache 欄位則表明 freebuf 使用名為 WP Super Cache 的 WordPress 外掛。
2.2.2 瀏覽網站
2.2.2.1 關注HTML原始碼
重點關注以下幾處
1、上傳與下載功能
2、認證表單與URL(login,logout, reset password)
3、後臺管理頁面(administration section)
4、資料輸入點,例如”留言板,聯絡我們,個人資料,商品評論,搜尋,編輯器”等
觀察這些位置的HTML原始碼(特殊的class名稱)及其註釋(comment)部分,可能暴露有價值資訊。
2.2.2.2 根據網站頁面字尾判斷
通常而言
1、存在
.php
結尾的檔案說明該web應用是用PHP寫的。2、存在
.jsp
或者.do
的檔案,說明該web應用是由Java寫的。3、存在
.asp
或者.aspx
結尾的檔案,說明該web應用可能是由VB或者C#寫的。
需要注意的是(低概率事件),某些腦洞奇特的管理員/開發者/運維可能會將Java編寫的程式用.php
的結尾,或者讓某些PHP應用使用.do
結尾。
如果網站路徑存在 RESTful URL 的特徵,例如
/objects/ # will give you a list of all the objects;
/objects/new # will give you the page to create a new object;
/objects/12 # will give you the object with the id 12;
/objects/12/edit # will give you the page to modify the object with the id 12;
則很有可能是由 Ruby On Rails 或者 Python 開發的。
2.2.2.3 favicon.ico
可以通過預設 favicon.ico 來判斷CMS,比如 Drupal 的預設icon是一個水滴狀的物體。在HTML原始碼處搜尋關鍵詞icon
或者shortcut
。
幾個例子
<link href="/images/branding/product/ico/googleg_lodp.ico" rel="shortcut icon">
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
<link rel="shortcut icon" href="//res.wx.qq.com/a/wx_fed/webwx/res/static/img/3wOU-7F.ico" type="image/x-icon">
2.2.2.4 robots.txt
有些cms會有預設robots.txt,所以我們可以通過robots.txt來幫助判斷CMS。下面的是舉了一個Joomla的robots.txt例子。由於robots.txt只是君子協議,所以你懂的,在滲透測試時它完全在說明你應該檢查哪些目錄。
# If the Joomla site is installed within a folder
# eg www.example.com/joomla/ then the robots.txt file
# MUST be moved to the site root
# eg www.example.com/robots.txt
# AND the joomla folder name MUST be prefixed to all of the
# paths.
# eg the Disallow rule for the /administrator/ folder MUST
# be changed to read
# Disallow: /joomla/administrator/
#
# For more information about the robots.txt standard, see:
# http://www.robotstxt.org/orig.html
#
# For syntax checking, see:
# http://tool.motoricerca.info/robots-checker.phtml
User-agent: *
Disallow: /administrator/
Disallow: /bin/
Disallow: /cache/
Disallow: /cli/
Disallow: /components/
Disallow: /includes/
Disallow: /installation/
Disallow: /language/
Disallow: /layouts/
Disallow: /libraries/
Disallow: /logs/
Disallow: /modules/
Disallow: /plugins/
Disallow: /tmp/
2.2.2.5 目錄掃描(directory/pages busting)
可以使用wfuzz進行目錄掃描。
python wfuzz.py -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ
詳細的使用方法請參考
另外也可以參考 OWASP的目錄掃描工具 OpenDoor,開發比較活躍。
無論用什麼具體的目錄掃描工具,最終是為了發現某些404頁面, SQL錯誤頁面或者其他異常頁面,這些頁面暴露的資訊可能可以反映伺服器型別與版本。除此以外,對於多數網站的後臺管理頁面通常都屬於某些常用的路徑(即包含在字典中),因此我們在大多數情況可以通過目錄掃描來獲得。如果已知CMS型別,可以直接參考文件來判斷後臺預設管理頁面的路徑。
2.2.2.6 刻意構造錯誤
錯誤頁面可以給你提供關於伺服器的大量資訊。可以通過構造含有隨機字串的URL,並訪問它來嘗試得到404頁面。
Tomcat的預設404頁面
Ruby on Rails的預設404頁面
還有幾種方法可以構造錯誤。比如在URL中新增特殊字元%00
(NULL),%27
(Single
Quote),%22
(Double Quote)。或者在URL中刪除部分引數,刪除部分cookie中的引數(chrome 外掛 edit this cookie)。
不熟練的Django開發者可能會開啟除錯模式
Tomcat 5XX的錯誤時可能丟擲異常會顯示呼叫棧
對於PHP的應用,還有一個很常用的技巧來構造錯誤。比如將 /index.php?name=hacker
替代為 /index.php?name[]=hacker
。
關鍵是要仔細閱讀這些錯誤資訊。雖然這聽起來有點蠢,但是你肯定會驚訝於會有多少開發者認為兩個錯誤頁面是一樣的,即使是錯誤訊息的內容完全不同。The evil is in the detail.
0×03 Web應用指紋特徵總結
3.1 HTTP響應頭(HTTP response header) 特徵
正則匹配HTTP響應頭中的特殊欄位。
"headers": { "X-AMP-Version": "([\\d.]+)\\;version:\\1", "Set-Cookie": "^AMP=" },
3.2 HTML 特徵
重點關注 body, title 等標籤的內容和屬性。
3.2.1 特殊的文字
比如在 HTML title 標籤中的Powered by EmpireCMS
之類。
3.2.2 特殊的class
HTML 中存在特定 class 屬性的某些 div 標籤。
<body class="ke-content">
在上面的程式碼中,ke-content 這個 class 通常是在 kindeditor 中出現的。
3.2.3 meta標籤特徵
舉個例子
<meta name="version" content="neblog-1.0"/>
3.2.4 script標籤特徵
<script src="http://www.freebuf.com/buf/themes/freebuf/js/bootstrap.min.js"></script>
主要用於判斷是否使用jQuery,Bootstrap等
3.3 URL 特徵
3.3.1 URL路徑特徵
比如 wordpress,有一些常見路徑。
readme.html
wp-content/uploads/
wp-admin
...
3.3.2 預設錯誤頁面
通過爬蟲嘗試尋找網站中的錯誤頁面。例如 Apache 預設404,Oracle的預設SQL錯誤頁面等。
3.3.3 robots.txt
某些CMS會有預設的robots.txt。在robots.txt的文字中直接說明CMS名稱和版本。(Discuz, Joomla)
3.3.4 favicon.ico 等特殊檔案匹配
下載 favicon.ico 影象進行md5摘要,對比icon庫是否存在相同md5的icon。計算量更大但檢索效果更好的方法就是做相似影象檢索(基於SIFT,或者其他影象特徵)。
除了 favicon.ico 以外,還有其他logo檔案可以考慮,比如Dedecms的/img/buttom_logo.gif
。
3.4 主機埠特徵
3.4.1 預設埠特徵
對於後端DBMS的識別,如果主機對外開放DBMS的話,可以通過埠特徵判斷。尤其是在開放預設埠比如3306,1443,27017等。
3.4.2 埠互動特徵
Socket互動過程中的一些特殊字串。具體看參考資料2-0×03-5.Socket。
3.4.3 Nmap OS指紋
通過 Nmap OS指紋可以初步判斷作業系統。
3.4.4 SSL證書
SSL證書資訊。
0×04 其他用於輔助的自動化Web應用指紋分析工具
0×05 參考資料