1.8指纹 Web 应用程序框架
概括
太阳底下没有新鲜事,人们可能想到要开发的几乎所有 Web 应用程序都已经开发出来了。随着世界各地积极开发和部署的大量免费和开源软件项目,应用程序安全测试很可能会面临一个完全或部分依赖于这些众所周知的应用程序或框架(例如 WordPress 、phpBB、Mediawiki 等)。了解正在测试的 Web 应用程序组件对测试过程有很大帮助,也将大大减少测试期间所需的工作量。这些众所周知的 Web 应用程序具有众所周知的 HTML 标头、cookie 和目录结构,可以通过枚举来识别这些应用程序。大多数 Web 框架在这些位置都有几个标记,可以帮助攻击者或测试者识别它们。这基本上是所有自动工具所做的,它们从预定义的位置寻找标记,然后将其与已知签名的数据库进行比较。为了获得更好的准确性,通常使用多个标记。
测试目标
- 对 Web 应用程序使用的组件进行指纹识别。
如何测试
黑盒测试
为了识别框架或组件,需要考虑几个常见的位置:
- HTTP 标头
- 饼干
- 网页源代码
- 特定文件和文件夹
- 文件扩展名
- 错误讯息
HTTP 标头
识别 Web 框架的最基本形式是查看X-Powered-By
HTTP 响应标头中的字段。许多工具都可以用来对目标进行指纹识别,最简单的是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
. 然而,虽然这种方法简单快捷,但这种方法并不是在 100% 的情况下都有效。X-Powered-By
可以通过适当的配置轻松禁用标头。还有几种技术可以让网站混淆 HTTP 标头(请参阅修复部分中的示例)。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
header 中包含 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
Cookie
确定当前 Web 框架的另一种类似且更可靠的方法是特定于框架的 cookie。
考虑以下 HTTP 请求:
图 4.1.8-7:Cakephp HTTP 请求
cookieCAKEPHP
已自动设置,它提供有关正在使用的框架的信息。Cookie部分列出了常见的 cookie 名称。依赖这种识别机制仍然存在局限性——可以更改 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 页面源代码中查找某些模式。人们通常可以找到很多信息来帮助测试人员识别特定组件。一种常见的标记是直接导致框架泄露的 HTML 注释。通常可以找到某些特定于框架的路径,即指向特定于框架的 CSS 或 JS 文件夹的链接。最后,特定的脚本变量也可能指向某个框架。
从下面的屏幕截图中,可以通过提到的标记轻松了解使用的框架及其版本。注释、具体路径和脚本变量都可以帮助攻击者快速确定ZK框架的实例。
图 4.1.8-2:ZK 框架 HTML 源代码示例
此类信息通常位于<head>
HTTP 响应部分、<meta>
标记中或页面末尾。然而,应该分析整个响应,因为它可以用于其他目的,例如检查其他有用的评论和隐藏字段。有时,Web 开发人员不太关心隐藏有关所用框架或组件的信息。仍然有可能在页面底部偶然发现类似这样的内容:
图 4.1.8-3:Banshee 底部页面
特定文件和文件夹
还有另一种方法可以极大地帮助攻击者或测试者高精度地识别应用程序或组件。每个 Web 组件在服务器上都有自己特定的文件和文件夹结构。已经注意到,可以从 HTML 页面源代码中看到特定路径,但有时它们并没有明确地显示在那里,而是仍然驻留在服务器上。
为了发现它们,使用了一种称为强制浏览或“dirbusting”的技术。Dirbusting 是暴力破解具有已知文件夹和文件名的目标,并监视 HTTP 响应以枚举服务器内容。此信息既可用于查找默认文件和攻击它们,也可用于对 Web 应用程序进行指纹识别。Dirbusting 可以通过多种方式完成,下面的示例显示了在 Burp Suite 的定义列表和入侵者功能的帮助下,对 WordPress 支持的目标进行成功的 dirbusting 攻击。
图 4.1.8-4:使用 Burp 进行分发
我们可以看到,对于某些特定于 WordPress 的文件夹(例如,/wp-includes/
和/wp-admin/
) , /wp-content/
HTTP 响应分别为 403(禁止访问)、302(找到,重定向到 wp-login.php
)和 200(确定)。这是一个很好的指标,表明目标是由 WordPress 驱动的。以同样的方式可以 dirbust 不同的应用程序插件文件夹及其版本。在下面的屏幕截图中,可以看到一个典型的 Drupal 插件的 CHANGELOG 文件,它提供了有关正在使用的应用程序的信息,并揭示了一个易受攻击的插件版本。
图 4.1.8-5:Drupal Botcha 披露
提示:在开始 dirbusting 之前,请先检查robots.txt
文件。有时也可以在那里找到特定于应用程序的文件夹和其他敏感信息。robots.txt
下面的屏幕截图显示了此类文件的示例。
图 4.1.8-6:机器人信息公开
每个特定应用程序的特定文件和文件夹都不同。如果确定的应用程序或组件是开源的,则在渗透测试期间设置临时安装可能有价值,以便更好地了解所提供的基础设施或功能,以及服务器上可能留下的文件。但是,已经存在几个不错的文件列表;一个很好的例子是可预测文件/文件夹的 FuzzDB 词表。
文件扩展名
URL 可能包含文件扩展名,这也有助于识别网络平台或技术。
例如,OWASP wiki 使用 PHP:
https://wiki.owasp.org/index.php?title=Fingerprint_Web_Application_Framework&action=edit§ion=4
以下是一些常见的 Web 文件扩展名和相关技术:
.php
– PHP.aspx
– 微软 ASP.NET.jsp
– Java 服务器页面
错误信息
如以下屏幕截图所示,列出的文件系统路径指向使用 WordPress ( wp-content
)。测试人员还应该知道 WordPress 是基于 PHP 的 ( functions.php
)。
图 4.1.8-7:WordPress 解析错误
通用标识符
Cookie
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
HTML 源代码
应用
关键词
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
特定标记
框架
关键词
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
目前市场上最好的指纹识别工具之一。包含在默认的Kali Linux构建中。语言:Ruby 用于指纹识别的匹配使用:
- 文本字符串(区分大小写)
- 常用表达
- Google Hack 数据库查询(有限的关键字集)
- MD5 哈希
- 网址识别
- HTML 标记模式
- 用于被动和主动操作的自定义 ruby 代码
示例输出显示在下面的屏幕截图中:
图 4.1.8-8:Whatweb 输出示例
Wappalyzer
网站:https ://www.wappalyzer.com/
Wappalyzer 有多种使用模式,其中最流行的可能是 Firefox/Chrome 扩展。它们仅适用于正则表达式匹配,除了要在浏览器中加载的页面外,不需要任何其他内容。它完全在浏览器级别工作,并以图标的形式给出结果。虽然有时它会出现误报,但在浏览页面后立即了解使用了哪些技术来构建目标网站非常方便。
下面的屏幕截图显示了插件的示例输出。
图 4.1.8-9:OWASP 网站的 Wappalyzer 输出