Web 应用程序使用的组件进行指纹识别
ID |
---|
WSTG-INFO-08 |
总结
毫不夸张地说,几乎所有可以想象的Web应用程序的想法都已经投入开发。随着全球大量自由和开源软件项目的积极开发和部署,应用程序安全测试很可能会遇到完全或部分依赖于这些知名应用程序或框架(例如WordPress,phpBB,Mediawiki等)的目标。了解正在测试的 Web 应用程序组件有助于测试过程,并且还将大大减少测试期间所需的工作量。这些众所周知的 Web 应用程序具有特定的 HTML 标头、Cookie 和目录结构,可以枚举这些标头、cookie 和目录结构来标识应用程序。大多数 Web 框架在这些位置都有几个标记,可以帮助攻击者或测试人员识别它们。这基本上是所有自动工具所做的,它们从预定义的位置查找标记,然后将其与已知签名的数据库进行比较。为了获得更好的准确性,通常使用几个标记。
测试目标
- 对 Web 应用程序使用的组件进行指纹识别。
如何测试
黑盒测试
为了确定框架或组件,需要考虑几个常见位置:
- HTTP 标头
- Cookies
- 网页源代码
- 特定文件和文件夹
- 文件扩展名
- 错误消息
HTTP 标头
识别 Web 框架的最基本形式是查看 HTTP 响应标头中的X-Powered-By
字段。许多工具可用于对目标进行指纹识别,最简单的工具是netcat。
请考虑以下 HTTP 请求-响应:
$ nc 127.0.0.1 80
HEAD / HTTP/1.0
HTTP/1.1 200 OK
Server: nginx/1.0.14
[...]
X-Powered-By: Mono
从 X-Powered-By
,我们了解到Web应用程序框架很可能是Mono
。但是,尽管这种方法简单快捷,但这种方法并非在所有情况下都有效。可以通过正确的配置轻松禁用 X-Powered-By
标头。还有几种技术允许站点对 HTTP 标头进行模糊处理(请参阅修正Remediation 部分中的示例)。在上面的示例中,我们还可以注意到正在使用特定版本的 nginx
来提供内容。
在同一示例中,测试人员可能会错过 X-Powered-By
标头或获得如下所示的答案:
HTTP/1.1 200 OK
Server: nginx/1.0.14
Date: Sat, 07 Sep 2013 08:19:15 GMT
Content-Type: text/html;charset=ISO-8859-1
Connection: close
Vary: Accept-Encoding
X-Powered-By: Blood, sweat and tears
有时有更多的 HTTP 标头指向某个框架。在下面的示例中,根据来自 HTTP 请求的信息,可以看到X-Powered-By
标头包含 PHP 版本。但是,X-Generator
标题指出使用的框架实际上是 Swiftlet
,这有助于渗透测试人员扩展其攻击媒介。执行指纹识别时,请仔细检查每个 HTTP 标头是否存在此类泄漏。
HTTP/1.1 200 OK
Server: nginx/1.4.1
Date: Sat, 07 Sep 2013 09:22:52 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.16-1~dotdeb.1
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-Generator: Swiftlet
确定当前 Web 框架的另一种类似且更可靠的方法是特定于框架的 cookie。
请考虑以下 HTTP 请求:
图 4.1.8-7:Cakephp HTTP 请求
cookieCAKEPHP
已自动设置,提供有关正在使用的框架的信息。常见 Cookie 名称的列表显示在 Cookies 部分。依赖这种识别机制仍然存在局限性 - 可以更改 cookie 的名称。例如,对于选定的CakePHP
框架,这可以通过以下配置来完成(摘自core.php
):
/**
* The name of CakePHP's session cookie.
*
* Note the guidelines for Session names states: "The session name references
* the session id in cookies and URLs. It should contain only alphanumeric
* characters."
* @link http://php.net/session_name
*/
Configure::write('Session.cookie', 'CAKEPHP');
但是,与对标头的更改相比,进行这些更改 X-Powered-By
的可能性较小,从而使这种标识方法更加可靠。
网页源代码
此技术基于在 HTML 页面源代码中查找某些模式。通常可以找到很多信息,这些信息可以帮助测试人员识别特定组件。常见的标记之一是直接导致框架泄露的 HTML 注释。更常见的是,可以找到某些特定于框架的路径,即指向特定于框架的CSS或JS文件夹的链接。最后,特定的脚本变量也可能指向某个框架。
从下面的屏幕截图中,可以通过上述标记轻松确定正在使用的框架及其版本。注释、特定路径和脚本变量都可以帮助攻击者快速确定 ZK 框架的实例。
图 4.1.8-2:ZK 框架 HTML 源代码示例
通常, <head>
此类信息位于 HTTP 响应部分、 <meta>
标记或页面末尾。但是,应分析整个响应,因为它可用于其他目的,例如检查其他有用的注释和隐藏字段。有时,Web开发人员可能无法充分掩盖有关所用框架或组件的信息。仍然有可能在页面底部偶然发现这样的东西:
Built upon the Banshee.PHP framwork v3.1
特定文件和文件夹
还有另一种方法可以极大地帮助攻击者或测试人员以高精度识别应用程序或组件。每个 Web 应用程序组件在服务器上都有其特定的文件和文件夹结构。已经注意到,人们可以从HTML页面源代码中看到特定的路径,但有时它们没有明确显示在那里,并且可能仍然驻留在服务器上。
为了发现它们,使用了一种称为强制浏览或“dirbusting”的技术。目录破坏是暴力强制使用已知文件夹和文件名的目标,并监视 HTTP 响应以枚举服务器内容。此信息既可用于查找默认文件并对其进行攻击,也可用于对 Web 应用程序进行指纹识别。目录破坏可以通过多种方式完成,下面的示例显示了在Burp Suite的定义列表和入侵者功能的帮助下,针对WordPress驱动的目标的成功删除攻击。
Figure 4.1.8-4: Dir busting with Burp
我们可以看到,对于一些特定于WordPress的文件夹(例如 /wp-admin/
,/wp-includes/
和 /wp-content/
),HTTP响应分别为403(禁止访问),302(找到,重定向到wp-login.php
)和200(确定)。这是一个很好的指标,表明目标由WordPress提供支持。以同样的方式,可以处理不同的应用程序插件文件夹及其版本。在下面的屏幕截图中,可以看到Drupal插件的典型CHANGELOG文件,该文件提供了有关正在使用的应用程序的信息,并公开了一个易受攻击的插件版本。
图 4.1.8-5:Drupal Botcha 披露
提示:在开始目录之前,请先检查 robots.txt
文件。有时也可以在那里找到特定于应用程序的文件夹和其他敏感信息。下面的屏幕截图中提供了此类 robots.txt
文件的示例。
Figure 4.1.8-6: Robots 信息披露
每个特定应用程序的特定文件和文件夹都不同。如果确定的应用程序或组件是开源的,则在渗透测试期间设置临时安装可能是有价值的,以便更好地了解呈现的基础结构或功能,以及服务器上可能保留的文件。但是,已经存在几个有用的文件列表;一个值得注意的例子是可预测文件/文件夹的FuzzDB词表。
文件扩展名
URL 可能包含文件扩展名,这些文件扩展名也有助于识别 Web 平台或技术。
例如,OWASP wiki 使用 PHP:
https://wiki.owasp.org/index.php?title=Fingerprint_Web_Application_Framework&action=edit§ion=4
以下是一些常见的 Web 文件扩展名和相关技术:
.php
– PHP.aspx
– Microsoft ASP.NET.jsp
– Java 服务器页面
错误消息
如以下屏幕截图所示,列出的文件系统路径指向WordPress的使用(wp-content
)。另外,测试人员应该知道WordPress是基于PHP的(functions.php
)。
图 4.1.8-7:WordPress 解析错误
通用标识符
Cookies
Framework | Cookie name |
---|---|
Zope | zope3 |
CakePHP | cakephp |
Kohana | kohanasession |
Laravel | laravel_session |
phpBB | phpbb3_ |
WordPress | wp-settings |
1C-Bitrix | BITRIX_ |
AMPcms | AMP |
Django CMS | django |
DotNetNuke | DotNetNukeAnonymous |
e107 | e107_tz |
EPiServer | EPiTrace, EPiServer |
Graffiti CMS | graffitibot |
Hotaru CMS | hotaru_mobile |
ImpressCMS | ICMSession |
Indico | MAKACSESSION |
InstantCMS | InstantCMS[logdate] |
Kentico CMS | CMSPreferredCulture |
MODx | SN4[12symb] |
TYPO3 | fe_typo_user |
Dynamicweb | Dynamicweb |
LEPTON | lep[some_numeric_value]+sessionid |
Wix | Domain=.wix.com |
VIVVO | VivvoSessionId |
网页源代码
Application 应用 | Keyword 关键词 |
---|---|
WordPress | <meta name="generator" content="WordPress 3.9.2" /> |
phpBB | <body id="phpbb" |
Mediawiki | <meta name="generator" content="MediaWiki 1.21.9" /> |
Joomla | <meta name="generator" content="Joomla! - Open Source Content Management" /> |
Drupal | <meta name="Generator" content="Drupal 7 (http://drupal.org)" /> |
DotNetNuke | DNN Platform - [http://www.dnnsoftware.com](http://www.dnnsoftware.com) |
一般标记
%framework_name%
powered by
built upon
running
特定标记
Framework 框架 | Keyword关键词 |
---|---|
Adobe ColdFusion | <!-- START headerTags.cfm |
Microsoft ASP.NET | __VIEWSTATE |
ZK | <!-- ZK |
Business Catalyst | <!-- BC_OBNW --> |
Indexhibit | ndxz-studio |
修复
虽然可以努力使用不同的cookie名称(通过更改配置),隐藏或更改文件/目录路径(通过重写或源代码更改),删除已知标头等,但这些努力归结为“通过隐蔽性实现安全性”。系统所有者/管理员应该认识到,这种努力只会减慢最基本的对手的速度。时间和精力可能更好地用于提高利益相关者的认识和维护解决方案。
工具
下面列出了通用和众所周知的工具。还有很多其他实用程序,以及基于框架的指纹识别工具。
WhatWeb 什么网络
网站:https://github.com/urbanadventurer/WhatWeb
WhatWeb是目前市场上最好的开源指纹识别工具之一,包含在默认的Kali Linux 版本中。语言: Ruby 指纹匹配由以下方法进行:
- 文本字符串(区分大小写)
- 正则表达式
- 谷歌黑客数据库查询(有限的关键字集)
- MD5 哈希
- 网址识别
- HTML 标记模式
- 用于被动和激进操作的自定义 ruby 代码
示例输出显示在下面的屏幕截图中:
图 4.1.8-8:输出示例
Wappalyzer
网站:https://www.wappalyzer.com/
Wappalyzer有多种使用模式,其中最受欢迎的可能是Firefox / Chrome扩展。它们主要在正则表达式匹配上工作,除了在浏览器中加载页面之外,不需要任何内容。它完全在浏览器级别工作,并以图标的形式给出结果。尽管有时它有误报,但了解在浏览页面后立即使用哪些技术构建目标站点非常方便。
插件的示例输出显示在下面的屏幕截图中。
图 4.1.8-9: OWASP 站点的Wappalyzer 输出
引用
白皮书
- Saumil Shah: “HTTP 指纹识别简介”
- Anant Shrivastava : “Web Application Finger Printing”