4.1.8- Web 应用程序使用的组件进行指纹识别

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.0HTTP/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&section=4

以下是一些常见的 Web 文件扩展名和相关技术:

  • .php – PHP
  • .aspx – Microsoft ASP.NET
  • .jsp – Java 服务器页面

错误消息

如以下屏幕截图所示,列出的文件系统路径指向WordPress的使用(wp-content)。另外,测试人员应该知道WordPress是基于PHP的(functions.php)。

在这里插入图片描述

图 4.1.8-7:WordPress 解析错误

通用标识符

Cookies

FrameworkCookie name
Zopezope3
CakePHPcakephp
Kohanakohanasession
Laravellaravel_session
phpBBphpbb3_
WordPresswp-settings
1C-BitrixBITRIX_
AMPcmsAMP
Django CMSdjango
DotNetNukeDotNetNukeAnonymous
e107e107_tz
EPiServerEPiTrace, EPiServer
Graffiti CMSgraffitibot
Hotaru CMShotaru_mobile
ImpressCMSICMSession
IndicoMAKACSESSION
InstantCMSInstantCMS[logdate]
Kentico CMSCMSPreferredCulture
MODxSN4[12symb]
TYPO3fe_typo_user
DynamicwebDynamicweb
LEPTONlep[some_numeric_value]+sessionid
WixDomain=.wix.com
VIVVOVivvoSessionId

网页源代码

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)" />
DotNetNukeDNN 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 -->
Indexhibitndxz-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”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/108191.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[uniapp]踩坑日记 unexpected character > 1或‘=’>1 报错

在红色报错文档里下滑&#xff0c;找到Show more 根据提示看是缺少标签&#xff0c;如果不是缺少标签&#xff0c;看看view标签内容是否含有<、>、>、<号,把以上符合都进行以<号为例做{{“<”}}处理

Java多线程并发面试题

文章目录 Java并发基础并行和并发有什么区别&#xff1f;说说什么是进程和线程&#xff1f;Java线程创建方式&#xff1f;Runnable和Callable接口的区别&#xff1f;为什么调用start()方法时会执行run()方法&#xff0c;不直接调用run()方法&#xff1f;sleep()和wait()的区别&…

5.11.Webrtc接口的设计原理

在上节课中呢&#xff0c;我向你介绍了web rtc的接口宏&#xff0c;那有很多同学会产生疑问啊&#xff0c;那觉得web rtc为什么要把接口设计的这么复杂&#xff1f;还非要通过宏来实现一个代理类&#xff0c;再通过代理类来调用到web rtc内部。 那为什么要这么设计呢&#xf…

【计算机视觉 | 目标检测】干货:目标检测常见算法介绍合集(四)

文章目录 四十六、Parallel Feature Pyramid Network四十七、ScanSSD四十七、RetinaMask四十八、CornerNet-Saccade四十九、CentripetalNet五十、Fast Focal Detection Network五十一、CornerNet-Squeeze五十二、Paddle Anchor Free Network五十三、Human Robot Interaction Pi…

王道数据结构C语言顺序表基本操作实现

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdbool.h> #define MaxSize 50 typedef struct {//顺序表(静态实现)int data[MaxSize];//顺序表元素int length;//顺序表当前长度 }SqList;//类型定义#define InitSize 100; typedef struct {//动态实…

Python爬虫有哪些库,分别怎么用

目录 Python常用爬虫库 代码示例 requests BeautifulSoup Scrapy Selenium PyQuery Axios requests-html pyppeteer 总结 Python是一种非常流行的编程语言&#xff0c;因其易学易用和广泛的应用而受到开发者的喜爱。在Python中&#xff0c;有许多库可以用于爬虫程序…

langchain主要模块(四):Memory

langchain2之Memory langchain1.概念2.主要模块模型输入/输出 (Model I/O)数据连接 (Data connection)链式组装 (Chains)代理 (Agents)内存 (Memory)回调 (Callbacks) 3.MemoryConversationBufferMemoryConversationBufferWindowMemoryConversationTokenBufferMemoryConversati…

【物联网】简要解释RTK(Real-Time Kinematic)>>实时动态差分定位

引言&#xff1a; RTK&#xff08;Real-Time Kinematic&#xff09;技术是一种基于差分GPS的高精度定位技术&#xff0c;它通过实时通信和数据处理&#xff0c;能够提供厘米级甚至亚米级的定位精度。RTK技术在许多领域都得到了广泛应用&#xff0c;如测绘、航空航天、农业等。本…

GPT 内部 — I : 了解文本生成

年轻的陀思妥耶夫斯基被介绍给生成AI&#xff0c;通过Midjourney创建 一、说明 我经常与不同领域的同事互动&#xff0c;我喜欢向几乎没有数据科学背景的人传达机器学习概念的挑战。在这里&#xff0c;我试图用简单的术语解释 GPT 是如何连接的&#xff0c;只是这次是书面形式。…

LeetCode(力扣)53. 最大子数组和Python

LeetCode53. 最大子数组和 题目链接代码 题目链接 https://leetcode.cn/problems/maximum-subarray/ 代码 class Solution:def maxSubArray(self, nums: List[int]) -> int:result float(-inf)count 0for i in range(len(nums)):count nums[i]if count > result:res…

CSS:屏幕正中间有个元素A,元素A中有文字A,随着屏幕宽度的增加

始终需要满足以下条件&#xff1a; A元素垂直居中于屏幕***&#xff1b;A元素距离屏幕左右边距各10px&#xff1b;A元素里面的文字”A”的font-size:20px&#xff1b;水平垂直居中;A元素的高度始终是A元素宽度的50%; (如果搞不定可以实现为A元素的高度固定为200px;)请用 html及…

Spring系列文章:Spring中的设计模式

一、简单⼯⼚模式 BeanFactory的getBean()⽅法&#xff0c;通过唯⼀标识来获取Bean对象。是典型的简单⼯⼚模式&#xff08;静态⼯⼚模 式&#xff09;&#xff1b; 二、⼯⼚⽅法模式 FactoryBean是典型的⼯⼚⽅法模式。在配置⽂件中通过factory-method属性来指定⼯⼚⽅法&a…