Kali Linux Web 渗透测试第三版(一)

原文:annas-archive.org/md5/D70608E075A2D7C8935F4D63EA6A10A3

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

Web 应用程序,最近还有 Web 服务,现在已经成为我们日常生活的一部分——从政府程序到社交媒体再到银行应用程序;甚至在通过 Web 服务发送和接收信息的移动应用程序中也有它们的身影。公司和人们普遍大量使用 Web 应用程序。仅仅这个事实就使得 Web 应用程序成为信息窃贼和其他犯罪分子的有吸引力的目标。因此,保护这些应用程序及其基础设施免受攻击对于开发人员和所有者来说至关重要。

最近几个月,全球范围内都有关于大规模数据泄露、滥用应用功能生成虚假信息或收集用户信息并出售给广告公司的新闻。人们开始更关注他们的信息如何被信任的公司使用和保护。因此,公司需要采取积极的措施来防止此类泄漏或攻击的发生。这可以从开发过程中更严格的质量控制到公关和管理媒体存在感等多个方面来实现。

由于当前的方法论使得开发周期更短且更加动态,因此需要在众多技术中增加复杂性以创建现代 Web 应用程序。此外,一些继承的不良实践使得开发人员无法从安全角度全面测试他们的 Web 应用程序,因为他们的优先任务是按时交付一个可工作的产品。Web 应用程序的复杂性以及开发过程本身的复杂性导致了对安全测试专业人员的需求,他们参与到过程中,并负责从安全角度测试应用程序,更具体地说,从攻击者的角度。这个专业人员就是渗透测试人员。

在这本书中,我们从 Web 应用程序和渗透测试的基本概念开始,涵盖了方法论中的每个阶段;从获取信息到识别可能的弱点再到利用漏洞。渗透测试人员的一个关键任务是:一旦他们发现并验证了一个漏洞,他们需要向开发人员提供建议,告诉他们如何修复这些缺陷并防止它们再次发生。因此,本书中所有专门用于识别和利用漏洞的章节还包括一个简要介绍如何预防和减轻每种攻击的部分。

本书适合对象

我们在编写本书时考虑了多种读者。首先是计算机科学学生、开发人员和系统管理员,他们希望在信息安全方面的知识上更进一步,或者希望在这个领域追求职业生涯的人;他们将找到一些基本概念和易于理解的指导,这将使他们能够在自己的测试实验室中进行第一次渗透测试,并获得继续实践和学习的基础和工具。

应用程序开发人员和系统管理员也将了解攻击者在现实世界中的行为,应该考虑哪些方面来构建更安全的应用程序和系统,以及如何检测恶意行为。

最后,经验丰富的安全专业人员将找到一些中级和高级的利用技术和思路,以及如何结合两个或多个漏洞来执行更复杂的攻击的想法。

本书内容

第一章,渗透测试和 Web 应用程序简介,涵盖了渗透测试、Kali Linux 和 Web 应用程序的基本概念。首先定义了渗透测试本身和其他关键概念,然后介绍了在进行专业渗透测试之前需要考虑的事项,如定义范围和规则。然后我们深入了解 Kali Linux,并了解 Web 应用程序的工作原理,重点关注对渗透测试人员更为重要的方面。

第二章,使用 Kali Linux 设置实验室,是对将在后续章节中使用的测试环境的技术回顾。我们首先解释了 Kali Linux 是什么以及它包含的用于测试 Web 应用程序安全性的工具;接下来,我们看一下将在未来章节中使用的易受攻击的 Web 应用程序,以演示漏洞和攻击。

第三章,侦察和分析 Web 服务器,展示了渗透测试人员和攻击者用于获取有关开发、托管和支持目标应用程序所使用的技术的信息,并识别可能进一步利用的第一个弱点的技术和工具,因为按照渗透测试的标准方法,第一步是尽可能收集有关目标的信息。

第四章,认证和会话管理漏洞,顾名思义,专门讲解与用户身份识别和应用程序内职责分离相关的漏洞的检测、利用和缓解方法,从不同的认证和会话管理机制的解释开始,接着介绍这些机制可能存在的设计或实现缺陷以及这些缺陷如何被恶意行为者或渗透测试人员利用。

第五章,检测和利用注入漏洞,解释了最常见的注入漏洞的检测、利用和缓解方法,因为在安全方面,开发人员最关注的问题之一就是应用程序容易受到各种注入攻击的威胁,无论是 SQL 注入、命令注入还是其他任何攻击方式,这些都可能对 Web 应用程序构成重大风险。

第六章,发现和利用跨站脚本(XSS)漏洞,从解释什么是跨站脚本漏洞开始,到它为什么以及如何构成安全风险,再到如何识别 Web 应用程序的漏洞,以及攻击者如何利用它来获取用户的敏感信息或让他们无意中执行操作。

第七章,跨站请求伪造、识别和利用,解释了什么是跨站请求伪造攻击以及它是如何工作的。然后我们讨论了检测使其成为可能的缺陷的关键因素,接着介绍了利用技术,并最后给出了预防和缓解建议。

第八章,攻击密码实现中的缺陷,首先介绍了密码学概念,这些概念对于渗透测试人员来说非常有用,例如 SSL/TLS 的一般工作原理,加密、编码和哈希的概念和算法的回顾;然后我们描述了用于识别弱 SSL/TLS 实现的工具,以及对已知漏洞的利用。接下来,我们介绍了检测和利用自定义密码算法和实现中的缺陷。本章最后给出了在使用加密通信或存储敏感信息时如何预防漏洞的建议。

第九章,AJAX、HTML5 和客户端攻击,介绍了渗透测试 Web 应用程序的客户端部分,从 AJAX 应用程序的爬行过程开始,解释了现代 Web 浏览器中包含的开发者工具。我们还将介绍 HTML5 带来的创新以及它对攻击者和渗透测试人员带来的新挑战和机会。接下来,本章将描述使用开发者工具绕过客户端实施的安全控制的方法,并以预防和缓解 AJAX、HTML5 和客户端漏洞的建议结束。

第十章,Web 应用程序中的其他常见安全缺陷,讨论了不安全的直接对象引用、文件包含、HTTP 参数污染和信息泄露漏洞及其利用。最后,我们提供了如何预防和修复这些缺陷的建议。

第十一章,在 Web 应用程序上使用自动化扫描工具,解释了在使用自动化扫描工具和模糊测试工具时需要考虑的因素。我们还解释了这些扫描工具的工作原理以及模糊测试是什么,然后介绍了 Kali Linux 中包含的扫描和模糊测试工具的使用示例。最后,我们介绍了渗透测试人员在对 Web 应用程序进行自动化扫描后应采取的措施,以向应用程序开发人员提供有价值的结果。

为了充分利用本书

为了成功利用本书,读者建议具备以下基本知识:

  • Linux 操作系统安装

  • Unix/Linux 命令行使用

  • HTML 语言

  • PHP Web 应用程序编程

  • Python 编程

唯一必需的硬件是一台个人电脑,具备运行 VirtualBox 或其他虚拟化软件的操作系统。至于规格,推荐的设置如下:

  • Intel i5、i7 或类似的 CPU

  • 500GB 的硬盘

  • 8GB 的 RAM

  • 互联网连接

下载示例代码文件

您可以从您在www.packtpub.com的账户中下载本书的示例代码文件。如果您在其他地方购买了本书,您可以访问www.packtpub.com/support并注册以直接通过电子邮件接收文件。

您可以按照以下步骤下载代码文件:

  1. 登录或注册www.packtpub.com

  2. 选择“支持”选项卡。

  3. 点击“代码下载和勘误”。

  4. 在搜索框中输入书名,然后按照屏幕上的说明进行操作。

下载文件后,请确保使用以下最新版本的软件解压或提取文件夹:

  • Windows 的 WinRAR/7-Zip

  • Mac 的 Zipeg/iZip/UnRarX

  • Linux 的 7-Zip/PeaZip

本书的代码包也托管在 GitHub 上,网址为github.com/PacktPublishing/Web-Penetration-Testing-with-Kali-Linux-Third-Edition。如果代码有更新,将在现有的 GitHub 存储库上进行更新。

我们还有其他代码包,来自我们丰富的图书和视频目录,可在**github.com/PacktPublishing/**上找到。请查看!

下载彩色图像

我们还提供了一个包含本书中使用的屏幕截图/图表的彩色图像的 PDF 文件。您可以在这里下载:www.packtpub.com/sites/default/files/downloads/WebPenetrationTestingwithKaliLinuxThirdEdition_ColorImages.pdf

使用的约定

本书中使用了许多文本约定。

CodeInText:表示文本中的代码词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 用户名。以下是一个例子:“许多组织可能有应用程序会监听一个不在nmap-services文件中的端口。”

代码块设置如下:

<?php 
  if(!empty($_GET['k'])) { 
    $file = fopen('keys.txt', 'a'); 
    fwrite($file, $_GET['k']); 
    fclose($file); 
  } 
?> 

当我们希望引起您对代码块的特定部分的注意时,相关的行或项目会以粗体显示:

<?php 
  if(!empty($_GET['k'])) { 
    $file = fopen('keys.txt', 'a'); 
    fwrite($file, $_GET['k']); 
    fclose($file); 
  } 
?> 

任何命令行输入或输出都以以下方式编写:

python -m SimpleHttpServer 8000  

粗体:表示一个新术语、一个重要单词或您在屏幕上看到的单词。例如,菜单或对话框中的单词会以这种方式显示在文本中。以下是一个例子:“如果您进入当前浏览器的日志选项卡,您将看到钩子会记录用户在浏览器中的所有操作,从点击和按键到窗口或标签的更改。”

警告或重要提示会以这种方式显示。

提示和技巧会以这种方式显示。

第一章:渗透测试和 Web 应用程序简介

Web 应用程序使用 HTTP 协议进行客户端和服务器之间的通信,并需要 Web 浏览器作为客户端界面。它可能是现代公司中最普遍的应用程序类型,从人力资源的组织气候调查到公司网站的 IT 技术服务。甚至厚客户端应用程序、移动应用程序和许多物联网IoT)设备也通过 Web 服务和嵌入到其中的 Web 界面使用 Web 组件。

不久前,人们认为安全只在组织的边界和网络层面上是必要的,因此公司在物理和网络安全上花费了大量资金。然而,由于他们对组织内外的 Web 技术的依赖,这也带来了一种有些虚假的安全感。近年来,我们看到了关于数百万条记录的惊人数据泄露和违规事件的新闻,其中包括信用卡号码、健康历史、家庭地址以及来自世界各地的人们的社会安全号码(SSN)。其中许多攻击都是通过利用 Web 漏洞或设计失误开始的。

现代组织承认他们依赖于 Web 应用程序和 Web 技术,并且它们与网络和操作系统一样容易受到攻击,甚至更容易。这导致提供防护或防御 Web 攻击服务的公司数量增加,以及Web 应用程序防火墙WAF)、运行时应用程序自我保护RASP)、Web 漏洞扫描器和源代码扫描器等技术的出现或增长。此外,越来越多的组织发现在向最终用户发布应用程序之前测试其安全性非常有价值,这为有才华的黑客和安全专业人员提供了机会,他们可以利用自己的技能发现漏洞并提供修复建议,从而帮助公司、医院、学校和政府拥有更安全的应用程序和日益改进的软件开发实践。

主动安全测试

渗透测试道德黑客是通过执行类似于任何一天可能发生的真实攻击的攻击方式来主动测试 Web 应用程序的方法。它们以受控的方式执行,目的是尽可能发现多个安全漏洞,并提供有关如何减轻这些漏洞带来的风险的反馈。

在向最终用户发布应用程序之前,对应用程序进行安全测试对公司非常有益。事实上,有一些安全意识很强的公司几乎已经将渗透测试、漏洞评估和源代码审查完全整合到了软件开发周期中。因此,当他们发布新的应用程序时,它已经经历了各个测试和修复阶段。

不同的测试方法论

人们经常对以下术语感到困惑,他们互换使用,但并不理解这些术语的某些方面虽然有重叠,但也存在细微的差异,需要您注意:

  • 道德黑客

  • 渗透测试

  • 漏洞评估

  • 安全审计

道德黑客

很少有人意识到黑客是一个被误解的术语;它对不同的人有不同的含义,而且往往黑客被认为是一个坐在黑暗的地方没有社交生活且有恶意意图的人。因此,在术语“黑客”前面加上了“道德”一词。术语“道德黑客”用来指称那些致力于发现系统漏洞和脆弱性、向系统的供应商或所有者报告,并有时帮助他们修复系统的专业人士。道德黑客使用的工具和技术与黑客或黑帽黑客使用的工具和技术类似,但目的不同,因为它以更专业的方式使用。道德黑客也被称为“安全研究员”。

渗透测试

渗透测试是本书中我们经常使用的一个术语,它是道德黑客的一个子集。它是一个更专业的术语,用来描述道德黑客的工作内容。如果你计划从事道德黑客或安全测试的职业,那么你经常会看到职位为渗透测试员的招聘信息。尽管渗透测试是道德黑客的一个子集,但它在很多方面有所不同。它是一种更简化的方式,用于识别系统中的漏洞,并确定漏洞是否可利用。渗透测试受到测试人员和被测试系统的所有者之间的合同的约束。为了确定要测试的系统,您需要定义测试的范围。需要定义“参与规则”,确定测试的方式。

漏洞评估

有时,组织可能只想识别其系统中存在的漏洞,而不实际利用它们并获取访问权限。漏洞评估比渗透测试更广泛。漏洞评估的最终结果是一个报告,按照发现的漏洞进行优先排序,最严重的漏洞排在前面,风险较低的漏洞排在报告的较低位置。这份报告对于知道自己存在安全问题并需要确定和优先处理最关键问题的客户非常有帮助。

安全审计

审计是一种系统性的程序,用于根据预先确定的一组标准来衡量系统的状态。这些标准可以是行业最佳实践或内部清单。审计的主要目标是衡量和报告符合情况。如果你正在审计一个 Web 服务器,一些最初需要注意的事项包括服务器上的开放端口、启用的有害 HTTP 方法(如 TRACE)、使用的加密标准和密钥长度。

进行渗透测试时需要考虑的因素

在计划执行渗透测试项目时,无论是作为专业渗透测试员为客户工作,还是作为公司内部安全团队的一部分,都需要在开始参与之前考虑一些方面。

参与规则

参与规则(RoE)是一份文件,涉及渗透测试的进行方式。在开始渗透测试之前,应明确规定 RoE 中的一些指令,例如:

  • 测试的类型和范围

  • 客户联系方式

  • 客户 IT 团队通知

  • 敏感数据处理

  • 状态会议和报告

测试的类型和范围

测试的类型可以是黑盒测试、白盒测试或中间的灰盒测试,这取决于参与方式和与测试团队共享的信息量。

在每种类型的测试中,都有可以做和不可以做的事情。在黑盒测试中,测试团队从组织外部的攻击者的视角出发,渗透测试人员从零开始,试图识别网络地图、实施的防御机制、面向互联网的网站和服务等。尽管这种方法在模拟外部攻击者方面可能更加真实,但需要考虑到这些信息可能很容易从公共来源获取,或者攻击者可能是一个已经拥有这些信息的不满意的员工或前员工。因此,如果目标是仅供员工使用的内部应用程序,采用黑盒方法可能是浪费时间和金钱。

白盒测试是指测试团队获得有关目标的所有可用信息,有时甚至包括应用程序的源代码,以便在侦察和扫描上花费很少或没有时间。然后,灰盒测试是指向测试团队提供部分信息,例如应用程序的 URL、用户级文档和/或用户帐户。

灰盒测试在测试 Web 应用程序时特别有用,因为主要目标是在应用程序本身中发现漏洞,而不是在托管服务器或网络中。渗透测试人员可以使用用户帐户来采用恶意用户或通过社交工程获得访问权限的攻击者的视角。

在确定测试范围时,客户与测试团队需要评估哪些信息是有价值且需要保护的,并基于此确定需要测试哪些应用程序/网络以及对信息的访问程度。

客户联系方式

我们可以认同,即使在进行测试时采取了所有必要的预防措施,有时测试也可能出错,因为它涉及让计算机执行恶意操作。在客户端拥有正确的联系信息确实非常有帮助。渗透测试经常会变成拒绝服务DoS)攻击。客户端的技术团队应该全天候可用,以防计算机崩溃,需要硬重启才能恢复在线状态。

渗透测试 Web 应用程序的优势在于可以在专门为此目的构建的环境中进行,从而使测试人员降低对客户生产资产的负面影响的风险。

客户 IT 团队通知

渗透测试还用作检查支持人员对事件和入侵尝试的响应准备情况的手段。您应该与客户讨论此事,无论是宣布还是未宣布的测试。如果是宣布的测试,请确保通知客户测试(攻击)将在何时何地进行,并提供测试的源 IP 地址,以避免其 IT 安全团队错过任何真正的入侵尝试。如果是未宣布的测试,请与客户讨论如果测试被自动系统或网络管理员阻止会发生什么。测试是否在那里结束,还是继续进行?这完全取决于测试的目的,是为了测试基础设施的安全性还是检查网络安全和事件处理团队的响应。即使进行未宣布的测试,也要确保升级矩阵中的某人知道测试的时间和日期。Web 应用程序渗透测试通常是宣布的。

敏感数据处理

在测试准备和执行过程中,测试团队将获得并可能发现有关公司、系统和/或其用户的敏感信息。敏感数据处理在 RoE 中需要特别注意,并且应采取适当的存储和通信措施(例如,对测试人员计算机进行全盘加密,如果通过电子邮件发送报告,则对报告进行加密等)。如果您的客户受到各种监管法律的覆盖,例如《健康保险可携带性和责任法》(HIPAA)、《格拉姆-利奇-布莱利法》(GLBA)或欧洲数据隐私法,只有授权人员才能查看个人用户数据。

状态会议和报告

沟通是成功的渗透测试的关键。测试团队和客户组织之间应定期安排会议,并由测试团队发布例行状态报告。测试团队应介绍他们已经达到的进展以及到目前为止发现的漏洞。客户组织还应确认他们的检测系统是否触发了由渗透尝试引起的任何警报。如果正在测试 Web 服务器并且部署了 WAF,则应记录和阻止攻击尝试。作为最佳实践,测试团队还应记录测试进行的时间。这将帮助安全团队将日志与渗透测试相关联。

WAF 通过分析客户端和服务器之间的 HTTP/HTTPS 流量工作,并且能够检测和阻止对 Web 应用程序的最常见攻击。

渗透测试的限制

尽管渗透测试被推荐并应定期进行,但渗透测试存在一定的限制。测试的质量和结果将直接取决于测试团队的技能。由于范围的限制、渗透测试人员对测试环境的访问限制以及测试人员使用的工具的限制,渗透测试无法找到所有的漏洞。以下是渗透测试的一些限制:

  • 技能限制:如前所述,测试的成功和质量将直接取决于渗透测试团队的技能和经验。渗透测试可以分为三个广泛的类别:网络、系统和 Web 应用程序渗透测试。如果让一个擅长网络渗透测试的人参与测试 Web 应用程序的项目,将无法获得正确的结果。由于当今互联网上部署了大量的技术,很难找到一个精通这三个领域的人。一个测试人员可能对 Apache Web 服务器有深入的了解,但可能是第一次遇到 IIS 服务器。过去的经验也在测试的成功中起着重要作用;将一个低风险漏洞映射到具有高威胁级别的系统是一种只能通过经验获得的技能。

  • 时间限制:渗透测试通常是一个短期项目,必须在预定的时间段内完成。测试团队需要在该期限内产生结果并确定漏洞。另一方面,攻击者有更多的时间来进行攻击,并可以仔细计划。渗透测试人员还必须在测试结束时提交报告,描述方法论、确定的漏洞和执行摘要。必须定期拍摄屏幕截图,然后将其添加到报告中。显然,攻击者不会编写任何报告,因此可以将更多时间用于实际攻击。

  • 自定义利用的限制:在某些高度安全的环境中,常规的渗透测试框架和工具几乎没有用处,团队需要跳出常规思维,例如创建自定义利用和手动编写脚本以达到目标。创建利用非常耗时,它会影响测试的总预算和时间。无论如何,编写自定义利用应该是任何自重的渗透测试人员的技能组合的一部分。

  • 避免 DoS 攻击:黑客和渗透测试是一种让计算机或应用程序执行其设计之外功能的艺术。因此,有时候测试可能导致 DoS 攻击,而不是获取系统访问权限。许多测试人员为了避免意外造成系统停机而不进行此类测试。由于系统未经过 DoS 攻击测试,它们更容易受到脚本小子的攻击,这些脚本小子只是在寻找此类可通过互联网访问的系统,以便通过将其下线来获得声誉。脚本小子是指那些利用计算机系统中易于发现和众所周知的弱点来获取声誉,而不理解或关心潜在的有害后果的技术水平低下的个人。应该向客户介绍 DoS 测试的利弊,以帮助他们做出正确的决策。

  • 访问限制:网络被划分为不同的段,测试团队通常只能访问和测试那些具有服务器并可从互联网访问的段,以模拟真实世界的攻击。然而,这样的测试无法检测到客户所在的内部网络上的配置问题和漏洞。

  • 使用工具的限制:有时,渗透测试团队只被允许使用客户批准的工具和利用框架清单。无论是免费版本还是商业版本,没有一种工具是完整的。测试团队需要了解这些工具,并在它们缺少功能时寻找替代品。

为了克服这些限制,大型组织设有专门的渗透测试团队,负责研究新的漏洞并定期进行测试。其他组织除了进行渗透测试外,还进行定期的配置审查。

测试 Web 应用程序的需求

随着互联网面向的网站数量的增加以及进行在线业务的组织数量的增加,Web 应用程序和 Web 服务器成为攻击者的有吸引力的目标。Web 应用程序无处不在,遍布公共和私有网络,因此攻击者不需要担心目标的缺乏。只需要一个 Web 浏览器就可以与 Web 应用程序进行交互。一些 Web 应用程序的缺陷,如逻辑错误,甚至可以被一个外行人利用。例如,由于逻辑实现不当,如果一家公司拥有一个电子商务网站,在结账过程之后允许用户将商品添加到购物车,那么一个恶意用户通过试错发现这一点后,就可以轻松地利用这个漏洞,而无需任何特殊工具。

Web 应用程序的漏洞也为恶意软件和病毒的传播提供了手段,这些恶意软件和病毒可以在几分钟内传播到全球。黑客通过利用 Web 应用程序和安装恶意软件获得可观的经济利益,然后将其传播给应用程序的用户。

边缘防火墙对流向 Web 服务器的入站 HTTP 流量更加宽松,因此攻击者不需要打开任何特殊端口。HTTP 协议是多年前设计的,没有提供任何内置的安全功能;它是一个明文协议,需要使用 HTTPS 协议进行额外的层次保护通信。它也没有提供个别会话标识,而是由开发人员自行设计。许多开发人员直接从大学毕业后被雇佣,他们只具备编程语言的理论知识,没有 Web 应用程序编程的安全方面的实际经验。即使漏洞被报告给开发人员,他们也需要很长时间来修复,因为他们忙于 Web 应用程序的功能创建和增强部分。

安全编码从 Web 应用程序的架构和设计阶段开始,因此需要早期集成到开发周期中。后期集成安全将证明困难,并且需要大量的重做工作。在开发阶段早期使用威胁建模来识别风险和威胁,对于减少生产就绪的 Web 应用程序代码中的漏洞非常有帮助。

投入资源编写安全代码是减少 Web 应用程序漏洞的有效方法。然而,编写安全代码很容易说,但很难实施。

防范对 Web 应用的攻击的原因

防范对 Web 应用的攻击的一些最有说服力的原因如下:

  • 保护客户数据

  • 遵守法律法规

  • 声誉损失

  • 收入损失

  • 保护免受业务中断的影响。

如果 Web 应用程序与信用卡信息进行交互和存储,则需要符合支付卡行业PCI)制定的规则和法规。PCI 有具体的指南,例如审查 Web 应用程序中的所有代码以查找漏洞,或安装 WAF 以减轻风险。

当 Web 应用程序未经漏洞测试,攻击者获得访问客户数据的权限时,如果客户对公司提起诉讼,这可能严重影响公司的品牌。这也可能导致收入损失,因为许多客户将转移到可能提供更好安全性的竞争对手那里。

对 Web 应用的攻击也可能导致严重的服务中断,如果是 DoS 攻击,服务器可能会被关闭以清理暴露的数据,或进行取证调查。这可能会在财务报表中产生负面影响。

这些原因足以说服您组织的高级管理层投入资源(包括资金、人力和技能)来提高 Web 应用程序的安全性。

Kali Linux

在本书中,我们将使用 Kali Linux 提供的工具来完成我们的测试。Kali Linux 是一个基于 Debian 的 GNU/Linux 发行版。Kali Linux 被安全专业人员用于执行攻击性安全任务,并由一家名为 Offensive Security 的公司维护。Kali Linux 的前身是 BackTrack,它是渗透测试人员使用的主要工具之一,使用了超过六年,直到 2013 年被 Kali Linux 取代。2015 年 8 月,Kali Linux 的第二个版本以代号 Kali Sana 发布,2016 年 1 月,它转换为“滚动发布”。

这意味着软件会持续更新,而无需更改操作系统版本。Kali Linux 附带了一套大量的流行黑客工具,这些工具已经安装了所有的先决条件,可以直接使用。我们将深入研究这些工具,并使用它们来测试那些存在于现实世界 Web 应用程序中的重大缺陷的 Web 应用程序。

渗透测试人员的 Web 应用程序概述

Web 应用程序涉及的远不止 HTML 代码和 Web 服务器。如果您不是积极参与 Web 应用程序开发的程序员,那么您可能对 HTTP 协议的内部工作原理、Web 应用程序与数据库的交互方式以及用户单击链接或在 Web 浏览器中输入网站 URL 时发生的情况一无所知。

作为渗透测试人员,了解信息如何从客户端流向服务器和数据库,然后再返回客户端非常重要。本节将包括一些信息,帮助没有 Web 应用程序渗透测试先验知识的个人利用 Kali Linux 提供的工具进行端到端的 Web 渗透测试。您将对以下内容有一个广泛的概述:

  • HTTP 协议

  • HTTP 中的头部

  • 使用 cookie 进行会话跟踪

  • HTML

  • Web 应用程序的架构

HTTP 协议

在 Web 服务器和客户端之间传输 Web 应用程序流量的底层协议称为超文本传输协议HTTP)。协议的最常见实现是 HTTP/1.1,定义在 RFC 7230-7237 中,取代了在 RFC 2616 中定义的旧版本。最新版本称为 HTTP/2,于 2015 年 5 月发布,并在 RFC 7540 中定义。第一个版本 HTTP/1.0 现在被认为已过时,不推荐使用。

随着互联网的发展,HTTP 协议的后续版本添加了新功能。在 HTTP/1.1 中,添加了持久连接、OPTIONS方法以及 HTTP 支持缓存的几项改进功能。

RFC 是由互联网工程任务组IETF)创建的详细技术文档,描述了互联网标准和协议。RFC 文档的最终版本成为实现协议时可以遵循的标准。

HTTP 是一种客户端-服务器协议,其中客户端(Web 浏览器)向服务器发出请求,服务器则响应请求。服务器的响应主要以 HTML 格式的页面形式呈现。默认情况下,HTTP 协议使用端口80,但可以配置 Web 服务器和客户端以使用不同的端口。

HTTP 是一种明文协议,这意味着客户端和服务器之间的所有信息都是未加密的,任何中间人都可以看到并理解它。为了解决 HTTP 设计中的这个缺陷,发布了一种新的实现,它通过安全套接字层SSL)协议建立了一个加密的通信通道,然后通过该通道发送 HTTP 数据包。这被称为 HTTPS 或 HTTP over SSL。近年来,SSL 越来越多地被一种名为传输层安全TLS)的新协议取代,目前版本为 1.2。

了解 HTTP 请求和响应

HTTP 请求是客户端向服务器发送的消息,以获取一些信息或执行某些操作。它由一个空行分隔的两个部分组成:头部和正文。头部包含与请求本身、预期的响应、cookie 和其他相关控制信息相关的所有信息,正文包含交换的数据。HTTP 响应具有相同的结构,只是内容和所包含信息的使用有所不同。

请求头

以下是在浏览www.bing.com时使用 Web 应用程序代理捕获的 HTTP 请求:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此标头中的第一行指示请求的方法:GET,请求的资源:/(即根目录)和协议版本:HTTP 1.1。HTTP 标头中还可以有其他几个字段。我们将讨论最相关的字段:

  • 主机:这指定了被请求资源的主机和端口号。一个 web 服务器可能包含多个站点,或者可能包含共享托管或负载均衡等技术。该参数用于区分由同一基础设施提供的不同站点/应用程序。

  • 用户代理:该字段用于服务器识别将接收信息的客户端类型(即 Web 浏览器)。对于开发人员来说,它很有用,因为响应可以根据用户的配置进行适应,因为并非所有 HTTP 协议和 Web 开发语言中的所有功能都与所有浏览器兼容。

  • Cookie:Cookie 是客户端和服务器之间交换的临时值,用于保持会话信息等其他原因。

  • 内容类型:这指示服务器请求体中包含的媒体类型。

  • 授权:HTTP 允许通过此参数进行每个请求的客户端身份验证。有多种身份验证模式,最常见的是BasicDigestNTLMBearer

响应标头

在接收到请求并处理其内容后,服务器可能会以如下所示的消息作出响应:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

响应标头的第一行包含状态码(200),这是一个三位数的代码。这有助于浏览器理解操作的状态。以下是一些重要字段的详细信息:

  • 状态码:没有名为状态码的字段,但该值通过标头传递。2xx系列状态码用于向 Web 浏览器传达成功的操作。3xx系列用于指示重定向,当服务器希望客户端连接到另一个 URL 时,当网页被移动时。4xx系列用于指示客户端请求中的错误,并要求用户在重新发送之前修改请求。5xx系列表示服务器端错误,因为服务器无法完成操作。在前面的标头中,状态码为200,表示操作成功。完整的 HTTP 状态码列表可以在developer.mozilla.org/en-US/docs/Web/HTTP/Status找到。

  • 设置 Cookie:如果定义了此字段,将在客户端中建立一个 Cookie 值,服务器可以使用该值来识别客户端并存储临时数据。

  • 缓存控制:这指示是否将响应的内容(图像、脚本代码或 HTML)存储在浏览器缓存中以减少页面加载时间,以及如何进行存储。

  • 服务器:该字段指示服务器类型和版本。由于这些信息可能对潜在攻击者有兴趣,因此最好将服务器配置为省略其响应,就像前面截图中显示的标头一样。

  • 内容长度:该字段将包含一个值,指示响应体中的字节数。它用于使另一方知道当前请求/响应何时完成。

可以在以下 URL 找到所有标头字段及其用法的详尽列表:www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

HTTP 方法

当客户端向服务器发送请求时,还应通知服务器对所需资源执行何种操作。例如,如果用户只想查看网页的内容,它将调用GET方法,该方法通知服务器将网页的内容发送给客户端的 Web 浏览器。

本节描述了几种方法。对于渗透测试人员来说,它们很有趣,因为它们指示两个端点之间正在发生的数据交换类型。

GET 方法

GET 方法用于检索由 URL 标识或由其标识的过程生成的任何信息。GET 请求可以从客户端获取参数,然后通过 URL 本身将这些参数的名称和值附加到 Web 应用程序中。如下所示的标头中,当您在 Bing 搜索引擎中发送“网络渗透测试”的搜索查询时,它是通过 URL 发送的:

POST 方法

POST 方法与 GET 方法类似。它用于从服务器检索数据,但是它通过请求的正文传递内容。由于数据现在通过请求的正文传递,攻击者更难检测和攻击底层操作。如下所示的 POST 请求中,用户名(login)和密码(pwd)不是通过 URL 发送的,而是通过与标头之间的空行分隔的正文发送的:

HEAD 方法

HEAD 方法与 GET 方法相同,只是服务器在响应中不包含消息体;也就是说,HEAD 请求的响应只是 GET 请求的响应头。

TRACE 方法

当使用 TRACE 方法时,接收服务器会将 TRACE 响应与响应体中的原始请求消息一起返回。TRACE 方法用于识别中间设备(如代理服务器和防火墙)对请求所做的任何更改。某些代理服务器在数据包通过时会编辑 HTTP 标头,可以使用 TRACE 方法来识别这一点。它用于测试目的,因为它可以让您跟踪对方接收到了什么。

PUT 和 DELETE 方法

PUT 和 DELETE 方法是 WebDAV 的一部分,它是 HTTP 协议的扩展,允许在 Web 服务器上管理文档和文件。开发人员使用它将生产就绪的网页上传到 Web 服务器上。PUT 用于将数据上传到服务器,而 DELETE 用于删除数据。在现代应用程序中,PUT 和 DELETE 也用于 Web 服务以执行数据库上的特定操作。PUT 用于插入或修改记录,而 DELETE 用于删除、禁用或防止将来读取某些信息。

OPTIONS 方法

OPTIONS 方法用于查询服务器以获取请求的 URL 可用的通信选项。在下面的标头中,我们可以看到对 OPTIONS 请求的响应:

了解 HTTP 数据包的布局非常重要,因为它包含有用的信息,并且用户可以控制其中的几个字段,从而给攻击者注入恶意数据或操纵应用程序的某些行为提供了机会。

在 HTTP 中保持会话

HTTP 是一种无状态的客户端-服务器协议,客户端发出请求,服务器以数据作为响应。下一个请求被视为完全独立的新请求,与之前的请求无关。HTTP 请求的设计使得它们彼此独立。当您在网上购物时将商品添加到购物车中时,应用程序需要一种机制将商品与您的账户关联起来。每个应用程序可能使用不同的方式来标识每个会话。

追踪会话最常用的技术是通过服务器设置的会话 ID(标识符)。一旦用户使用有效的用户名和密码进行身份验证,就会为该用户分配一个唯一的随机会话 ID。在客户端发送的每个请求中,都会包含唯一的会话 ID,以将请求与经过身份验证的用户关联起来。会话 ID 可以使用GETPOST方法共享。使用GET方法时,会话 ID 将成为 URL 的一部分;使用POST方法时,ID 将在 HTTP 消息的正文中共享。服务器维护一个将用户名映射到分配的会话 ID 的表。分配会话 ID 的最大优势是,即使 HTTP 是无状态的,用户也不需要在每个请求中进行身份验证;浏览器会提供会话 ID,服务器会接受它。

会话 ID 也有一个缺点:任何获得会话 ID 的人都可以冒充用户,而无需用户名和密码。此外,会话 ID 的强度取决于用于生成它的随机程度,这可能有助于防止暴力破解攻击。

Cookie

在 HTTP 通信中,Cookie是由服务器存储在客户端文件系统或 Web 浏览器内存中的具有名称、值和一些行为参数的单个信息。Cookie 是客户端和 Web 服务器之间传递会话 ID 的事实上的标准机制。使用 Cookie 时,服务器通过在 HTTP 响应头中设置Set-Cookie字段为客户端分配一个唯一的 ID。当客户端接收到头部时,它将存储 Cookie 的值,即会话 ID,存储在本地文件或浏览器的内存中,并将其与发送它的网站 URL 关联起来。当用户重新访问原始网站时,浏览器将发送 Cookie 值,以识别用户。

除了会话跟踪,Cookie 还可以用于存储终端客户端的偏好信息,例如语言和其他配置选项,这些信息将在会话之间持久存在。

服务器和客户端之间的 Cookie 流程

Cookie 始终由服务器设置和控制。Web 浏览器只负责在每个请求中将其发送到服务器。在下图中,您可以看到向服务器发出了一个GET请求,并且服务器上的 Web 应用程序选择设置一些 Cookie 来识别用户和用户在先前请求中选择的语言。在客户端发出的后续请求中,Cookie 成为请求的一部分:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

持久性和非持久性 Cookie

Cookie 被分为两个主要类别。持久性 Cookie 以文本文件的形式存储在客户端设备的内部存储中。由于 Cookie 存储在硬盘上,它可以在浏览器崩溃或不同会话之间持久存在。不同的浏览器会以不同的方式存储持久性 Cookie。例如,Internet Explorer 将 Cookie 保存在用户文件夹内的文本文件中,路径为AppData\Roaming\Microsoft\Windows\Cookie,而 Google Chrome 使用一个 SQLite3 数据库,也存储在用户文件夹内,路径为AppData\Local\Google\Chrome\User Data\Default\cookies。正如前面提到的,Cookie 可以用于传递会话 ID、偏好设置和购物数据等敏感信息。如果存储在硬盘上,它无法防止恶意用户对其进行修改。

为了解决持久性 Cookie 面临的安全问题,程序员提出了另一种更常用的 Cookie 类型,称为非持久性 Cookie,它存储在 Web 浏览器的内存中,在硬盘上不留痕迹,并通过请求和响应头在 Web 浏览器和服务器之间传递。非持久性 Cookie 仅在服务器指定的预定义时间内有效。

Cookie 参数

除了 cookie 的名称和值之外,Web 服务器还设置了其他几个参数,用于定义 cookie 的范围和可用性,如下所示的响应头:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下是一些参数的详细信息:

  • :指定将发送 cookie 的域。

  • 路径:为了进一步锁定 cookie,可以指定路径参数。如果指定的域是email.com,路径设置为/mail,那么 cookie 只会发送到email.com/mail内的页面。

  • HttpOnly:这是一个参数,用于减轻跨站脚本攻击XSS)带来的风险,因为 JavaScript 无法访问 cookie。

  • 安全:如果设置了此参数,cookie 只能通过安全通信渠道发送,即 SSL 和 TLS。

  • 过期时间:cookie 将存储到此参数指定的时间。

HTTP 响应中的 HTML 数据

响应体中的数据是对最终用户有用的信息。它通常包含 HTML 格式的数据,但也可以是JavaScript 对象表示法JSON)或可扩展标记语言XML)数据、脚本代码或二进制文件,如图像和视频。最初在 Web 上存储的只有纯文本信息,以一种更适合阅读的方式进行格式化,同时能够包含表格、图像和链接到其他文档的内容。这被称为超文本标记语言HTML),Web 浏览器是用来解释它的工具。HTML 文本使用标签进行格式化。

HTML 不是一种编程语言。

服务器端代码

脚本代码和 HTML 格式化由 Web 浏览器解释和呈现。这被称为客户端代码。涉及到通过服务器检索客户端请求的信息、会话跟踪以及大部分应用程序逻辑的过程是通过服务器端代码在服务器上执行的,使用的语言有 PHP、ASP.NET、Java、Python、Ruby 和 JSP 等。该代码生成一个输出,然后可以使用 HTML 进行格式化。当您看到以.php扩展名结尾的 URL 时,表示该页面可能包含 PHP 代码。然后必须通过服务器的 PHP 引擎运行,以便在加载 Web 页面时生成动态内容。

多层 Web 应用程序

随着今天使用的 Web 应用程序变得越来越复杂,将 Web 应用程序部署在单个系统上的传统方式已经成为过去的故事。将所有的鸡蛋放在一个篮子里并不是部署关键业务应用程序的明智方式,因为它严重影响应用程序的性能、安全性和可用性。单个服务器托管应用程序和数据的简单设计仅适用于流量不大的小型 Web 应用程序。设计 Web 应用程序的三层方法是未来的发展方向。

三层 Web 应用程序设计

在三层 Web 应用程序中,表示层、应用程序层和数据层之间存在物理分离,具体描述如下:

  • 表示层:这是接收客户端连接并将响应发送回客户端的服务器。它是应用程序的前端。表示层对于 Web 应用程序至关重要,因为它是用户与应用程序的其余部分之间的接口。在表示层接收到的数据会传递给应用程序层的组件进行处理。接收到的输出使用 HTML 格式化,并显示在用户的 Web 客户端上。Apache 和 nginx 是开源软件程序,而 Microsoft IIS 是商业软件,部署在表示层。

  • 应用层:处理密集型处理和主要应用程序逻辑在应用层中完成。一旦演示层从客户端收集所需数据并将其传递给应用层,工作在该层的组件可以对数据应用业务逻辑。然后将输出返回到演示层,以发送回客户端。如果客户端请求数据,则从数据层提取数据,将其处理成对客户端有用的形式,并传递给演示层。Java、Python、PHP 和 ASP.NET 是在应用层工作的编程语言。

  • 数据访问层:实际存储和数据存储库工作在数据访问层。当客户端需要数据或发送数据进行存储时,它会被应用层传递到数据访问层进行持久存储。在该层工作的组件负责维护数据并保持其完整性和可用性。它们还负责管理应用层的并发连接。MySQL 和 Microsoft SQL 是两种最常用的在该层工作的技术。结构化查询语言SQL)关系数据库是当今 Web 应用程序中最常用的,尽管 NoSQL 数据库(如 MongoDB、CouchDB 和其他 NoSQL 数据库)也被广泛使用,特别是在大数据分析应用程序中,它们以与关系数据库传统的行列表格格式不同的形式存储信息。SQL 是一种数据定义和查询语言,许多数据库产品都支持它作为检索和更新数据的标准。

下图显示了演示层、应用层和数据访问层如何协同工作:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Web 服务

Web 服务可以被视为不包含演示层的 Web 应用程序。面向服务的架构允许 Web 服务提供者与该服务的消费者轻松集成。Web 服务使不同的应用程序可以共享数据和功能。它们允许消费者在不知道数据的格式或位置的情况下通过互联网访问数据。

当您不想公开数据模型或用于访问数据的逻辑,但仍希望数据对其消费者随时可用时,这变得非常关键。一个例子是由股票交易所提供的 Web 服务。在线经纪人可以使用此 Web 服务获取有关股票的实时信息,并在其自己的网站上显示,具有自己的演示风格和品牌,以供最终用户购买。经纪人的网站只需要调用服务并请求公司的数据。当服务回复数据时,Web 应用程序可以解析信息并显示它。

Web 服务是平台无关的。股票交易应用程序可以用任何语言编写,而服务仍然可以被调用,而不管用于构建应用程序的底层技术是什么。服务提供者和消费者需要达成一致的只有数据交换的规则。

目前有两种不同的开发 Web 服务的方式:

  • 简单对象访问协议SOAP

  • 表述性状态转移REST),也称为 RESTful Web 服务。

介绍 SOAP 和 REST Web 服务

SOAP 一直是开发 Web 服务的传统方法,但它有许多缺点,现在应用程序正在转向 REST 或 RESTful Web 服务。在使用 SOAP Web 服务时,XML 是唯一可用的数据交换格式,而 REST Web 服务可以使用 JSON 和其他数据格式。尽管基于 SOAP 的 Web 服务在某些情况下仍然被推荐使用,因为它具有额外的安全规范,但由于其简单性,轻量级的 REST Web 服务是许多 Web 服务开发人员首选的方法。SOAP 是一种协议,而 REST 是一种架构风格。亚马逊、Facebook、谷歌和雅虎已经转向 REST Web 服务。

REST Web 服务的一些特点如下:

  • 它们与 CRUD 操作非常配合

  • 它们具有更好的性能和可扩展性

  • 它们可以处理多种输入和输出格式

  • 对于连接到 Web 服务的开发人员来说,学习曲线较小

  • REST 设计理念与 Web 应用程序类似

CRUD 代表创建、读取、更新和删除;它描述了持久存储的四个基本功能。

SOAP 相对于 REST 的主要优势在于 SOAP 是独立于传输的,而 REST 仅在 HTTP 上工作。REST 基于 HTTP,因此影响标准 Web 应用程序的相同漏洞也可以用于攻击它。幸运的是,相同的安全最佳实践可以应用于保护 REST Web 服务。

在开发 SOAP 服务时,将 XML 数据包装在 SOAP 请求中,然后使用 HTTP 发送的复杂性迫使许多组织转向 REST 服务。它还需要一个 Web 服务定义语言(WSDL)文件,该文件提供与服务相关的信息。必须维护一个 UDDI 目录,其中发布了 WSDL 文件。

REST 服务的基本思想是,与使用 SOAP 等复杂机制不同,它直接通过 HTTP 与服务提供者进行通信,无需任何额外的协议。它使用 HTTP 来创建、读取、更新和删除数据。

SOAP 基于 Web 服务的消费者发送的请求如下所示:

<?xml version="1.0"?> 
<soap:Envelope 
 soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
  <soap:body sp="http://www.stockexchange.com/stockprice"> 
    <sp:GetStockPrice> 
      <sp:Stockname>xyz</sp:Stockname> 
    </sp:GetStockPrice> 
  </soap:Body> 
</soap:Envelope> 

另一方面,发送到 REST Web 服务的请求可能如下所示:

http://www.stockexchange.com/stockprice/Stockname/xyz 

应用程序使用GET请求从 Web 服务中读取数据,这种方法开销较低,与冗长复杂的 SOAP 请求不同,开发人员编码起来更容易。虽然 REST Web 服务也可以使用 XML 返回数据,但很少使用的 JSON 是首选的返回数据的方法。

Web 服务中的 HTTP 方法

REST Web 服务可能会以与标准 Web 应用程序不同的方式处理 HTTP 方法。这种行为取决于开发人员的偏好,但将POSTGETPUTDELETE方法与 CRUD 操作相关联的做法越来越流行。最常见的方法如下:

  • 创建:POST

  • 读取:GET

  • 更新:PUT

  • 删除:DELETE

一些 API 实现交换了PUTPOST的功能。

XML 和 JSON

Web 服务使用 XML 和 JSON 来表示结构化的数据集或对象。

如前面的章节所讨论的,XML 使用基于标签、属性和标签的值的语法;例如,应用程序的文件菜单可以表示如下:

<menu id="m_file" value="File"> 
  <popup> 
    <item value="New" onclick="CreateDocument()" /> 
    <item value="Open" onclick="OpenDocument()" /> 
    <item value="Close" onclick="CloseDocument()" /> 
  </popup> 
</menu> 

相反,JSON 使用一种更经济的语法,类似于 C 和 Java 编程语言。JSON 格式的相同菜单如下所示:

{"menu": { 
  "id": "m_file", 
  "value": "File", 
  "popup": { 
    "item": [ 
      {"value": "New", "onclick": "NewDocument()"}, 
      {"value": "Open", "onclick": "OpenDocument()"}, 
      {"value": "Close", "onclick": "CloseDocument()"} 
    ] 
  } 
}} 

AJAX

异步 JavaScript 和 XML(AJAX)是多个现有 Web 技术的组合,它允许客户端在没有用户直接干预的情况下发送请求和处理响应。它还可以减轻服务器对应用程序逻辑处理任务的负担。AJAX 允许您与 Web 服务器进行通信,而无需用户在 Web 浏览器中明确发出新请求。这导致服务器的响应更快,因为 Web 页面的部分可以单独更新,从而改善用户体验。AJAX 利用 JavaScript 连接并从服务器检索信息,而无需重新加载整个 Web 页面。

以下是使用 AJAX 的一些好处:

  • 提高速度:使用 AJAX 的目标是提高 Web 应用程序的性能。通过更新单个表单元素,服务器上只需要进行最少的处理,从而提高性能。客户端的响应速度也得到了显著提高。

  • 用户友好:在基于 AJAX 的应用程序中,用户无需重新加载整个页面以刷新网站的特定部分。这使应用程序更具交互性和用户友好性。它还可以用于实时验证和自动完成。

  • 异步调用:基于 AJAX 的应用程序设计为对 Web 服务器进行异步调用,因此称为异步 JavaScript 和 XML。这使用户可以在幕后更新部分网页时与网页进行交互。

  • 减少网络利用率:通过不进行完整页面刷新,减少网络利用率。在加载大型图像、视频或动态内容(如 Java 小程序或 Adobe Flash 程序)的 Web 应用程序中,使用 AJAX 可以优化网络利用率。

AJAX 的构建块

如前所述,AJAX 是使用常见 Web 技术构建 Web 应用程序的混合体。使用这些 Web 技术设计应用程序会产生基于 AJAX 的应用程序。以下是 AJAX 的组成部分:

  • JavaScript:基于 AJAX 的应用程序最重要的组成部分是客户端的 JavaScript 代码。JavaScript 在后台与 Web 服务器进行交互,并在显示给用户之前处理信息。它使用XMLHttpRequest(XHR)API 在服务器和客户端之间传输数据。XHR 存在于后台,用户对其存在毫无察觉。

  • 动态 HTML(DHTML):一旦从服务器检索到数据并由 JavaScript 处理,Web 页面的元素需要更新以反映来自服务器的响应。一个完美的例子是在填写在线表单时输入用户名。表单会动态更新,以反映并告知用户用户名是否已在网站上注册。使用 DHTML 和 JavaScript,您可以实时更新页面内容。DHTML 在 AJAX 出现之前就已存在。仅使用 DHTML 的主要缺点是它严重依赖于客户端代码来更新页面。大多数情况下,您没有在客户端加载所有内容,需要与服务器端代码进行交互。这就是 AJAX 通过创建客户端代码和服务器端代码之间的连接来发挥作用的地方,通过 XHR 对象实现。在 AJAX 之前,您必须使用 JavaScript 小程序。

  • 文档对象模型(DOM):DOM 是一种用于组织 HTML 或 XML 文档中的元素的框架。它是一种表示和与 HTML 对象交互的约定。从逻辑上讲,可以将 HTML 文档解析为一棵树,其中每个元素被视为树节点,树的每个节点都有自己的属性和事件。例如,HTML 文档的 body 对象将具有一组特定的属性,如textlinkbgcolor等。每个对象还具有事件。这个模型允许 JavaScript 通过 DHTML 访问和动态更新页面内容。DHTML 是一个浏览器功能,DOM 充当实现它的接口。

AJAX 工作流程

下图说明了基于 AJAX 的应用程序各个组件之间的交互。与传统的 Web 应用程序相比,AJAX 引擎是主要的新增内容。AJAX 引擎的额外层作为所有通过 AJAX 进行的请求和响应的中间人。AJAX 引擎是 JavaScript 解释器:

以下是用户与基于 AJAX 的应用程序交互的工作流程。用户界面和 AJAX 引擎是客户端 Web 浏览器上的组件:

  1. 用户在浏览器中输入网页的 URL,浏览器向服务器发送一个 HTTP 请求。服务器处理请求并返回 HTML 内容,浏览器通过 Web 渲染引擎显示该内容。在 HTML 中,网页嵌入在 JavaScript 代码中,当遇到事件时由 JavaScript 解释器执行。

  2. 当与网页交互时,用户遇到一个使用嵌入的 JavaScript 代码并触发事件的元素。一个例子是谷歌搜索页面。当用户开始输入搜索查询时,底层的 AJAX 引擎拦截用户的请求。AJAX 引擎通过 HTTP 请求将请求转发给服务器。这个请求对用户来说是透明的,用户不需要显式地点击提交按钮或刷新整个页面。

  3. 在服务器端,应用程序层处理请求并将数据以 JSON、HTML 或 XML 形式返回给 AJAX 引擎。AJAX 引擎将此数据转发给 Web 渲染引擎,以便由浏览器显示。Web 浏览器使用 DHTML 仅更新 Web 页面的选定部分,以反映新数据。

当你遇到一个基于 AJAX 的应用程序时,请记住以下额外的要点:

  • XMLHttpRequest API 在幕后完成了这个魔术。由于其名称过长,它通常被称为 XHR。首先实例化一个名为xmlhttp的 JavaScript 对象,并用它来发送和捕获来自服务器的响应。要使 AJAX 工作,需要浏览器支持 XHR。所有最新版本的主流 Web 浏览器都支持此 API。

  • AJAX 的 XML 部分有点误导人。应用程序可以使用除 XML 之外的任何格式,例如 JSON、纯文本、HTTP,甚至是在 AJAX 引擎和 Web 服务器之间交换数据时使用的图像。JSON 是首选的格式,因为它是轻量级的,并且可以转换为 JavaScript 对象,进一步允许脚本轻松访问和操作数据。

  • 多个异步请求可以同时进行,而不需要等待一个请求完成。

  • 许多开发人员使用简化应用程序设计任务的 AJAX 框架。JQuery、Dojo Toolkit、Google Web Toolkit(GWT)和 Microsoft AJAX 库(.NET 应用程序)是众所周知的框架。

一个 AJAX 请求的示例如下:

function loadfile() 
{ 
  //initiating the XMLHttpRequest object 
  var xmlhttp; 
  xmlhttp = new XMLHttpRequest();   
  xmlhttp.onreadystatechange=function() 
  { 
    if (xmlHttp.readyState==4) 
    { 
      showContents(xmlhttp.ResponseText); 
    } 
  //GET method to get the links.txt file   
  xmlHttp.open("GET", "links.txt", true); 

函数loadfile()首先实例化xmlhttp对象。然后使用该对象从服务器获取一个文本文件。当服务器返回文本文件时,它显示文件的内容。文件及其内容是在没有用户参与的情况下加载的,如上面的代码片段所示。

HTML5

HTML 规范的第五个版本于 2014 年 10 月首次发布。这个新版本指定了用于媒体播放、拖放、Web 存储、可编辑内容、地理位置、本地 SQL 数据库、加密、Web 套接字等的 API,这些 API 可能从安全测试的角度来看很有趣,因为它们为攻击打开了新的路径或试图解决以前 HTML 版本中的一些安全问题。

WebSockets

正如之前所述,HTTP 是一种无状态协议。这意味着每个请求都会建立一个新的连接,并在每个响应后关闭。HTML5 的 WebSocket 是一种通信接口,允许客户端和服务器之间建立永久的双向连接。

客户端通过以下GET请求打开 WebSocket 连接:

GET /chat HTTP/1.1 
Host: server.example.com 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== 
Sec-WebSocket-Protocol: chat, superchat 
Sec-WebSocket-Version: 13 
Origin: http://example.com 

如果服务器理解请求并接受连接,其响应将如下所示:

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= 
Sec-WebSocket-Protocol: chat 

然后,HTTP 连接被 WebSocket 连接取代,并且它变成了一个双向的二进制协议,不一定与 HTTP 兼容。

概述

本章作为对 Web 应用程序的道德黑客和渗透测试的介绍。我们首先确定了测试 Web 应用程序的不同方法。我们还讨论了在开始测试之前需要定义的重要规则。接下来,我们研究了在今天的世界中测试 Web 应用程序的重要性以及不进行定期测试的风险。然后,我们简要介绍了 Kali Linux 作为测试平台,并快速回顾了现代 Web 应用程序中使用的概念和技术。

第二章:使用 Kali Linux 设置您的实验室

准备是一切的关键;当您在渗透测试项目上工作时,它变得更加重要,因为您只有有限的时间进行侦察、扫描和利用。最终,您可以获得访问权限并向客户提交详细报告。您进行的每次渗透测试的性质都会不同,并且可能需要与之前进行的测试不同的方法。工具在渗透测试中起着重要的作用。因此,您需要事先准备好您的工具包,并对您将需要执行测试的所有工具进行实践操作。

在本章中,我们将涵盖以下主题:

  • Kali Linux 的概述和与之前版本的变化

  • 安装 Kali Linux 的不同方法

  • 虚拟化与在物理硬件上安装

  • 在 Kali Linux 中重要工具的演示和配置

  • 易受攻击的 Web 应用程序和虚拟机以建立测试实验室

Kali Linux

Kali Linux 是一个基于 Debian 的以安全为重点的 Linux 发行版。它是著名的 Linux 发行版 BackTrack 的重新品牌版本,BackTrack 带有一个巨大的开源黑客工具库,用于网络、无线和 Web 应用程序渗透测试。尽管 Kali Linux 包含了 BackTrack 的大部分工具,但 Kali Linux 的主要目标是使其可移植,可以安装在基于 ARM 架构的设备上,如平板电脑和 Chromebook,这使得工具很容易地随时可用。

使用开源黑客工具有一个主要的缺点-当它们在 Linux 上安装时,它们包含了大量的依赖项,并且需要按照预定的顺序安装。此外,一些工具的作者没有发布准确的文档,这使得我们的生活变得困难。

Kali Linux 简化了这个过程;它预装了许多工具及其所有依赖项,并且处于可立即使用的状态,这样您就可以更多地关注实际攻击,而不仅仅是安装工具。Kali Linux 中安装的工具经常发布更新,这有助于保持工具的最新状态。一个非商业工具包,预装了所有主要的黑客工具,用于测试真实世界的网络和应用程序,这是每个道德黑客的梦想,Kali Linux 的作者们为了让我们的生活更轻松而做出了一切努力,这让我们可以花更多时间发现实际的漏洞,而不是构建工具包。

Kali Linux 的最新改进

在 2015 年的 Black Hat USA 上,Kali 2.0 发布了一个新的 4.0 内核。它基于 Debian Jessie,代号为 Kali Sana。之前的主要版本是 Kali 1.0,随后发布了版本 1.1 的定期更新。Kali 2.0 中的一些变化包括为了更好的可访问性而进行的界面改变以及添加了更新和更稳定的工具。

以下是 Kali 2.0 的一些主要改进:

  • 持续滚动更新:在 2016 年 1 月,Kali Linux 的更新周期得到了改进,转向了滚动发布,并在 2017 年 4 月进行了重大升级。滚动发布发行版是一种不断更新的发行版,以便在可用时向用户提供最新的更新和软件包。现在用户不必等待主要版本发布来获取错误修复。在 Kali 2.0 中,软件包会定期从 Debian 测试发行版中提取。这有助于保持 Kali 的核心操作系统更新。

  • 频繁的工具更新:维护 Kali Linux 发行版的组织 Offensive Security 已经设计了一种不同的方法来检查更新的工具。他们现在使用一个新的上游版本检查系统,当工具的新版本发布时,它会定期发送更新。通过这种方法,Kali Linux 中的工具会在开发人员发布它们时立即更新。

  • 重新设计的桌面环境: Kali Linux 现在支持完整的 GNOME 3 会话。GNOME 3 是最广泛使用的桌面环境之一,也是开发人员的最爱。运行完整 GNOME 3 会话所需的最低 RAM 为 768 MB。虽然考虑到今天计算机的硬件标准,这不是一个问题;如果您有一台旧机器,您可以下载使用 Xfce 桌面环境和较小一组有用工具的轻量级 Kali Linux 版本。Kali Linux 还原生支持其他桌面环境,如 KDE、MATE、E17、i3wm 和 LXDE。Kali 2.0 带有新的壁纸、可自定义的侧边栏、改进的菜单布局和许多其他视觉调整。

  • 支持各种硬件平台: Kali Linux 现在适用于所有主要版本的 Google Chromebook 和 Raspberry Pi。构建在 Kali Linux 之上的面向移动设备的黑客发行版 NetHunter 已更新至 Kali 2.0。官方的 VMware 和 VirtualBox 镜像也已更新。

  • 主要工具更改: Metasploit Community 和 Pro 版本已从 Kali 2.0 中删除。如果您需要这些版本,您需要直接从 Rapid7 的网站(www.rapid7.com/)下载。现在,只有 Metasploit Framework - 开源版本 - 随 Kali Linux 一起提供。

安装 Kali Linux

Kali Linux 的成功也归功于其安装的灵活性。如果您想快速测试一个系统,您可以在几分钟内在 Amazon 云平台上运行 Kali Linux,或者如果您想使用彩虹表破解密码,您可以将其安装在具有快速处理器的高速 SSD 驱动器上。作为其基础的 Linux,操作系统的每个部分都可以定制,这使得 Kali Linux 成为任何测试环境中的有用工具包。您可以从其官方下载页面获取 Kali Linux:www.kali.org/downloads/

Kali Linux 可以在多种平台上以多种方式安装:

  • USB 模式: 使用诸如 Rufus、Windows 中的 Universal USB Installer 或 Linux 中的dd等工具,您可以从 ISO 映像创建可引导的 USB 驱动器。

  • 预装的虚拟机: 可以从官方 Kali Linux 网站下载 VirtualBox、VMware 和 Hyper-V 镜像。只需下载并导入其中之一到您的虚拟化软件中即可。

  • Docker 容器: 近年来,Docker 容器在许多场景中证明了其有用和方便,并在某些领域中受到了青睐,超过了虚拟化。Docker 的官方 Kali Linux 镜像可在以下位置找到:hub.docker.com/r/kalilinux/kali-linux-docker/

  • Amazon EC2 上的 Kali Linux 最小镜像: Kali Linux 在 AWS 市场上有一个可用于使用的Amazon Machine Image(AMI):aws.amazon.com/marketplace/pp/B01M26MMTT

  • Kali NetHunter: 这是一个 Android ROM 叠加层。这意味着 Kali NetHunter 在 Android ROM(无论是原始还是自定义)之上运行。它目前仅适用于有限数量的设备,并且其安装可能不像其他 Kali 版本那样直接。有关 Kali NetHunter 的更多信息,请参阅:github.com/offensive-security/kali-nethunter/wiki

  • 在物理计算机上安装: 这可能是专业渗透测试人员的最佳选择,他们有一台专用于测试的笔记本电脑,并且需要充分利用 GPU、处理器和内存等硬件。这可以通过下载 ISO 映像并将其记录到 CD、DVD 或 USB 驱动器上,然后使用它来引导计算机并启动安装程序来完成。

根据个人偏好,并且为了节省内存和处理能力,同时拥有完全功能和轻量级桌面环境,本书将使用一个由 VirtualBox 虚拟机和安装了 Xfce4 Kali Linux ISO 的设置。

虚拟化 Kali Linux 与在物理硬件上安装它

虚拟化软件的流行使其成为在虚拟化平台上安装测试机的一个有吸引力的选择。虚拟化软件以低成本提供了丰富的功能,并消除了双启动机器的麻烦。大多数虚拟化软件包提供的另一个有用的功能是克隆虚拟机,您可以使用它来创建多个相同机器的副本。在真实的渗透测试中,您可能需要克隆和复制您的测试机器,以安装额外的黑客工具并在 Kali Linux 中进行配置更改,保留早期镜像的副本以用作虚拟化环境中的基础镜像。这可以非常容易地实现。

一些虚拟化软件具有还原到快照功能,如果您搞砸了测试机器,您可以回到过去并恢复一个干净的状态,在上面可以进行工作。

修改虚拟机的 RAM 数量、虚拟磁盘大小和虚拟处理器数量是虚拟化软件的另一个众所周知的特性。

虚拟化平台具有吸引人的功能,但也有一个主要缺点。如果渗透测试涉及测试网络上使用的密码的强度或其他处理器密集型任务,您将需要一台性能出色的处理器和专用于该任务的 GPU。在虚拟平台上破解密码是不明智的,因为它会减慢进程,并且由于虚拟化开销,您将无法充分利用处理器的容量。

虚拟化平台的另一个让很多人困惑的特性是网络选项。桥接、主机模式和 NAT 是虚拟化软件提供的三种主要网络选项。桥接网络是进行渗透测试的推荐选项,因为虚拟机会表现得好像连接到物理交换机上一样,数据包会不经修改地从主机机器传出。

在 VirtualBox 上安装

可以从www.virtualbox.org/wiki/Downloads获取适用于多个平台的 Oracle VirtualBox。建议您还下载并安装相应的扩展包,因为它提供 USB 2.0 和 3.0 支持、RDP、磁盘加密和其他一些有趣的功能。

从 Kali 下载页面选择您喜欢的版本。如前所述,我们将使用 Xfce4 64 位 ISO(www.kali.org/downloads/)。根据您的硬件或偏好,您可以选择任何其他版本,因为安装的工具或对它们的访问在不同版本中不会有所不同,除非您选择了仅包含操作系统和一小组工具的Light版本。

创建虚拟机

首先打开 VirtualBox 并创建一个新的虚拟机。为其选择一个名称(我们将使用Kali-Linux),并将类型设置为 Linux,版本设置为 Debian(64 位)。如果您选择了 32 位 ISO,请将版本更改为 Debian(32 位)。然后,点击下一步:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在接下来出现的屏幕上,选择为虚拟机保留的内存量。Kali Linux 可以运行在至少 1GB 的 RAM 上,但是虚拟机的推荐设置是 2-4GB。我们将为我们的机器设置 2GB。请记住,您的主机计算机需要内存来运行其他程序,可能还需要运行其他虚拟机:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,我们将为虚拟机创建一个硬盘。选择“立即创建虚拟硬盘”,然后点击“创建”。在下一个屏幕上,让类型保持为 VDI(VirtualBox 磁盘映像)和动态分配。然后,选择文件名和路径;您可以将其保持不变。最后,选择磁盘大小。我们将使用 40GB。新安装的 Kali Linux 使用 25GB。选择磁盘大小,然后点击“创建”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安装系统

现在虚拟机已创建,请在 VirtualBox 列表中选择它,然后点击顶部栏中的“设置”。然后,转到“存储”并选择具有 CD 图标的空驱动器。接下来,我们将配置虚拟机使用刚刚下载的 Kali Linux ISO 作为可引导驱动器(或者是光盘)。点击右侧的 CD 图标,然后点击“选择虚拟光盘文件…”,并导航到下载 Kali ISO 的文件夹:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接受设置更改。现在,所有设置都已完成,启动虚拟机,您将能够看到 Kali 的 GRUB 加载程序。选择“图形化安装”并按Enter

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在接下来的几个屏幕中,您需要选择语言、位置和键盘布局:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,安装程序将尝试进行网络配置。由于 VirtualBox 默认为所有新虚拟机设置了 NAT 网络适配器,所以这里不应该有任何问题。然后,您将被要求输入主机名和域名。如果您的网络不需要特定的值,请保持这些值不变,然后点击“继续”。

接下来,您将被要求为 root 用户设置密码。这是您系统中权限最高的用户,所以即使虚拟机只用于练习和测试目的,也要选择一个强密码。选择您的时区并点击“继续”。

现在,您需要选择安装系统和硬盘分区的位置。如果您没有特定的偏好,选择第一个选项“引导分区”。选择使用整个磁盘的选项,然后点击“继续”。在下一个屏幕上,或者在完成磁盘分区配置后,选择“完成分区并将更改写入磁盘”,然后点击“继续”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在下一个屏幕中点击“继续”以将更改写入磁盘,安装将开始。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安装完成后,安装程序将尝试配置更新机制。确保您的主机计算机已连接到互联网,保持代理配置不变,并在询问是否要使用网络镜像时选择“是”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安装程序将生成 APT(Debian 软件包管理器)的配置文件。下一步是配置 GRUB 引导加载程序。当被询问时选择“是”,并将其安装在/dev/sda上:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,您应该会看到“安装完成”消息。点击“继续”以重新启动虚拟机。此时,您可以从存储配置中删除 ISO 文件,因为您将不再需要它。

虚拟机重新启动后,您将被要求输入用户名和密码。使用root用户和安装过程中设置的密码:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Kali Linux 中的重要工具

一旦你成功安装并运行了 Kali Linux,你就可以开始使用工具了。由于本书是关于网络应用程序的黑客攻击,我们将花费大部分时间使用的主要工具都可以从“应用程序 | 网络应用程序分析”中访问。下面的截图显示了“网络应用程序分析”中的工具:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Kali Linux 中,Web 应用程序分析工具进一步分为四个类别,如下所示:

  • CMS 和框架识别

  • 网络应用程序代理

  • 网络爬虫和目录暴力破解

  • Web 漏洞扫描器

CMS 和框架识别

内容管理系统(CMS)在互联网上非常流行,数百个网站已经使用其中之一——WordPress 进行部署。插件和主题是 WordPress 网站的重要组成部分。然而,这些附加组件存在大量的安全问题。WordPress 网站通常由普通用户管理,他们对安全问题不太关注,并且很少更新他们的 WordPress 软件、插件和主题,使得这些网站成为一个有吸引力的目标。

WPScan

WPScan 是一个用 Ruby 编程语言编写的非常快速的 WordPress 漏洞扫描器,预装在 Kali Linux 中。

可以使用 WPScan 提取以下信息:

  • 插件列表

  • 主题的名称

  • 使用暴力破解技术的弱密码和用户名

  • 版本的详细信息

  • 可能的漏洞

Kali Linux 中还提供了一些其他 CMS 工具,详见以下小节。

JoomScan

JoomScan 可以检测 Joomla CMS 中已知的漏洞,如文件包含、命令执行和注入漏洞。它会探测应用程序并提取目标正在运行的确切版本。

CMSmap

CMSmap 没有包含在 Kali Linux 中,但可以从 GitHub 上轻松安装。这是一个针对最常用的 CMS(WordPress、Joomla 和 Drupal)的漏洞扫描器。它使用 Exploit Database 来查找 CMS 的启用插件中的漏洞。要下载它,请在 Kali Linux 终端中输入以下命令:

git clone https://github.com/Dionach/CMSmap.git  

Web 应用程序代理

HTTP 代理是 Web 应用程序黑客工具包中最重要的工具之一,Kali Linux 包含了几个这样的工具。你可能会在一个代理中错过的功能肯定会在另一个代理中找到。这凸显了 Kali Linux 及其庞大的工具库的真正优势。

HTTP 代理是一种位于浏览器和网站之间的软件,拦截它们之间流动的所有流量。Web 应用程序黑客的主要目标是深入了解应用程序的内部工作原理,而通过充当中间人并拦截每个请求和响应来实现这一目标是最好的。

Burp Proxy

Burp Suite 已成为 Web 应用程序测试的事实标准。它的许多功能几乎提供了 Web 渗透测试人员所需的所有工具。专业版包括一个可以进行主动和被动扫描的自动化扫描器,并在 Intruder(Burp 的模糊测试工具)中增加了配置选项。Kali Linux 包含免费版本,该版本没有扫描功能,也没有保存项目的可能性;此外,它在模糊测试工具 Intruder 上有一些限制。可以从应用程序 | Web 应用程序分析 | Web 应用程序代理访问它。Burp Suite 是一个功能丰富的工具,包括 Web 爬虫、Intruder 和重复器,用于自动化对 Web 应用程序的定制攻击。我将在后面的章节中更深入地介绍几个 Burp Suite 的功能。

Burp Proxy 是一个非透明代理,你需要采取的第一步是将代理绑定到特定的端口和 IP 地址,并配置 Web 浏览器使用该代理。默认情况下,Burp 监听127.0.0.1回环地址和8080端口号:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

确保选择一个没有被其他应用程序使用的端口,以避免任何冲突。注意端口和绑定地址,并将其添加到浏览器的代理设置中。

默认情况下,Burp Proxy 只拦截来自客户端的请求,不拦截服务器的响应。如果需要,可以在 Proxy 的 Options 选项卡中手动打开它,进一步在 Intercept Server Responses 部分。

自定义客户端拦截

如果您想缩小拦截的 Web 流量量,还可以设置特定规则。如下图所示,您可以匹配特定域、HTTP 方法、cookie 名称等的请求。一旦拦截到流量,您可以编辑值,将其转发到 Web 服务器并分析响应:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

即时修改请求

在匹配和替换部分,您可以配置规则,以在请求中查找特定值并即时编辑它,而无需任何手动干预。Burp Proxy 包含了几个这样的规则。其中最值得注意的是用 Internet Explorer、iOS 或 Android 设备的用户代理值替换的规则:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Burp Proxy 与 HTTPS 网站

Burp Proxy 也可以与 HTTPS 网站一起使用。为了解密通信并能够分析它,Burp Proxy 拦截连接,将自己呈现为 Web 服务器,并发出由其自己的 SSL/TLS 证书颁发机构CA)签名的证书。然后,代理将自己呈现给实际的 HTTPS 网站作为用户,并使用 Web 服务器提供的证书对请求进行加密。来自 Web 服务器的连接然后在代理处终止,代理解密数据并使用自签名的 CA 证书重新加密,该证书将显示在用户的 Web 浏览器上。以下图表解释了这个过程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于证书是自签名的,不被浏览器信任,因此浏览器会显示警告。您可以安全地向浏览器添加一个例外,因为您知道 Burp Proxy 正在拦截请求,而不是恶意用户。或者,您可以通过在代理监听器中单击相应按钮,将 Burp 的证书导出到文件中,然后将证书导入浏览器并将其设置为受信任的证书:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Zed Attack Proxy

Zed Attack ProxyZAP)是一个功能齐全的开源 Web 应用程序测试套件,由Open Web Application Security ProjectOWASP)维护,这是一个致力于 Web 应用程序安全的非营利社区。与 Burp Suite 一样,它也有一个代理,可以拦截和修改 HTTP/HTTPS 请求和响应,尽管使用起来可能没有 Burp 那么容易。您偶尔会发现一个代理中缺少的小功能在另一个代理中可用。例如,ZAP 包括一个强制浏览工具,可用于识别服务器中的目录和文件。

ProxyStrike

Kali Linux 中还包含一个名为ProxyStrike的主动代理。该代理不仅拦截请求和响应,还主动查找漏洞。它具有用于查找 SQL 注入和 XSS 漏洞的模块。与之前讨论过的其他代理类似,您需要配置浏览器以使用 ProxyStrike 作为代理。它在后台执行应用程序的自动爬行,并且结果可以导出为 HTML 和 XML 格式。

网络爬虫和目录暴力破解

一些应用程序具有普通用户与 Web 应用程序交互时看不到的隐藏 Web 目录。Web 爬虫尝试探索 Web 页面中的所有链接和引用,并查找隐藏目录。除了一些代理的蜘蛛和爬行功能外,Kali Linux 还包含一些非常有用的工具。

DIRB

DIRB 是一个命令行工具,可以帮助您使用字典文件(例如可能的文件名列表)发现 Web 服务器中的隐藏文件和目录。它可以执行基本身份验证,并使用会话 cookie 和自定义用户代理名称来模拟 Web 浏览器。我们将在后面的章节中使用 DIRB。

DirBuster

DirBuster是一个 Java 应用程序,用于对 Web 应用程序的目录和文件名进行暴力攻击。它可以使用包含可能的文件和目录名称的文件,或生成所有可能的组合。DirBuster 使用通过浏览互联网并收集开发人员在实际 Web 应用程序中使用的目录和文件生成的列表。DirBuster 是由 OWASP 开发的,目前是一个不活跃的项目,现在作为 ZAP 攻击工具而不是独立工具提供。

Uniscan

Uniscan-gui是一个综合性工具,可以检查现有目录和文件,执行基本端口扫描、路由跟踪、服务器指纹识别、静态测试、动态测试和对目标进行压力测试。

Web 漏洞扫描器

漏洞扫描器是一种工具,当针对目标运行时,能够向目标发送请求或数据包,并解释响应以识别可能的安全漏洞,如配置错误、过时版本、缺乏安全补丁和其他常见问题。Kali Linux 还包括几个漏洞扫描器,其中一些专门用于 Web 应用程序。

Nikto

Nikto是网络渗透测试人员长期以来的最爱。最近它增加了一些功能,但其开发仍在继续。它是一个功能丰富的漏洞扫描器,您可以用它来测试不同的 Web 服务器上的漏洞。它声称可以检查流行的 Web 服务器上过时的软件版本和配置问题。

Nikto 的一些著名功能如下:

  • 它生成多种形式的输出报告,如 HTML、CSV、XML 和文本

  • 它使用多种技术进行误报降低,以测试漏洞

  • 它可以直接登录到 Metasploit

  • 它可以进行 Apache 用户名枚举

  • 它通过暴力攻击找到子域名

  • 它可以自定义每个目标的最大执行时间,然后再转到下一个目标

w3af

Web 应用攻击和审计框架w3af)是一个 Web 应用漏洞扫描器。它可能是 Kali Linux 中包含的最完整的漏洞扫描器。

Skipfish

Skipfish是一个漏洞扫描器,它通过创建目标网站的交互式站点地图开始,使用递归爬行和预先构建的字典。然后对结果地图中的每个节点进行漏洞测试。扫描速度是它与其他 Web 漏洞扫描器的主要区别之一。它以其自适应扫描功能而闻名,可以根据前一步骤中收到的响应进行更智能的决策。它在相对较短的时间内提供了对 Web 应用程序的全面覆盖。Skipfish 的输出格式为 HTML。

其他工具

以下工具虽然不完全专注于 Web 的漏洞扫描器,但它们是包含在 Kali Linux 中的有用工具,可以帮助您识别目标应用程序中的弱点。

OpenVAS

开放漏洞评估扫描器OpenVAS)是 Kali Linux 中的网络漏洞扫描器。渗透测试应始终包括对目标系统的漏洞评估,而 OpenVAS 在识别网络方面的漏洞方面做得很好。OpenVAS 是 Nessus 的一个分支,Nessus 是市场上领先的漏洞扫描器之一,但其订阅完全免费,并在 GPL 下获得许可。最新版本的 Kali Linux 不包括 OpenVAS,但可以通过 APT 轻松下载和安装,如下所示:

$ apt-get install openvas  

在 Kali Linux 中安装 OpenVAS 后,需要进行初始配置才能开始使用。转到应用程序|漏洞分析,选择 OpenVAS 初始设置。Kali Linux 需要连接到互联网才能完成此步骤,因为该工具会下载所有最新的订阅和其他文件。设置结束时,会生成一个密码,在 GUI 界面登录时使用:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您现在可以通过将浏览器指向https://127.0.0.1:9392来打开图形界面。接受自签名证书错误,然后使用在初始配置期间生成的admin用户名和密码登录。

OpenVAS 现在已准备好对任何目标运行漏洞扫描。您可以在登录后通过导航到“管理|用户”并选择用户名旁边的编辑用户选项(标有扳手)来更改密码。

GUI 界面分为多个菜单,如下所述:

  • 仪表板:一个可定制的仪表板,显示与漏洞管理、扫描主机、最近发布的漏洞披露和其他有用信息相关的信息。

  • 扫描:您可以从这里开始新的网络 VA 扫描。您还可以在此菜单下找到所有报告和发现。

  • 资产:在这里,您将找到来自扫描的所有累积主机。

  • SecInfo:存储所有漏洞及其 CVE ID 的详细信息。

  • 配置:在这里,您可以配置各种选项,如警报、调度和报告格式。使用此菜单还可以自定义主机和开放端口发现的扫描选项。

  • 附加功能:与 OpenVAS GUI 相关的设置,如时间和语言,可以从此菜单中完成。

  • 管理:通过管理菜单可以添加和删除用户以及进行订阅同步。

现在让我们来看一下 OpenVAS 的扫描结果。我扫描了三个主机,并在其中两个主机中发现了一些高风险漏洞。您可以进一步点击单个扫描并查看有关已识别漏洞的详细信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据库利用

没有网络渗透测试是完整的,而没有测试后端数据库的安全性。SQL 服务器始终是攻击者的目标列表,它们在渗透测试中需要特别关注以关闭可能从数据库泄露信息的漏洞。SQLNinja是一个用 Perl 编写的工具,它可以用来攻击 Microsoft SQL 服务器的漏洞并获得 shell 访问权限。类似地,sqlmap工具用于利用易受 SQL 注入攻击的 SQL 服务器,并获取用户和数据库信息、枚举用户等等。SQL 注入攻击将在第五章中进一步讨论,即“检测和利用基于注入的漏洞”。

Web 应用程序模糊测试器

模糊测试器是一种旨在向 Web 应用程序注入随机数据的工具。Web 应用程序模糊测试器可用于测试缓冲区溢出条件、错误处理问题、边界检查和参数格式检查。模糊测试的结果是揭示无法通过 Web 应用程序漏洞扫描器识别的漏洞。模糊测试器采用试错方法,在识别缺陷时需要耐心。

Burp Suite 和 WebScarab 都有内置的模糊测试器。Wfuzz 是 Kali Linux 中的一个一键模糊测试器。我们将使用所有这些工具来测试第十章中的 Web 应用程序,即“Web 应用程序中的其他常见安全漏洞”。

使用 Tor 进行渗透测试

有时,Web 渗透测试可能包括绕过某些保护措施,从服务器端进行过滤或阻止,或者避免被检测或识别,以便以类似于真实恶意黑客的方式进行测试。洋葱路由器Tor)提供了一个有趣的选项,可以模拟黑帽黑客用于保护其身份和位置的步骤。尽管试图改善 Web 应用程序安全的道德黑客不应该担心隐藏自己的位置,但使用 Tor 可以为您提供额外的选项,以测试边缘安全系统,如网络防火墙、Web 应用程序防火墙和 IPS 设备。

黑帽黑客采用各种方法来保护他们的位置和真实身份;他们不使用固定的 IP 地址,并不断更改 IP 地址以欺骗网络犯罪调查人员。如果受到黑帽黑客的攻击,您将发现来自不同范围 IP 地址的端口扫描请求,并且实际的攻击将具有您的边缘安全系统首次登录的源 IP 地址。在获得客户的必要书面批准后,您可以使用 Tor 通过从系统通常不会看到连接的未知 IP 地址连接到 Web 应用程序来模拟攻击者。使用 Tor 使得追踪入侵尝试到实际攻击者变得更加困难。

Tor 使用一组相互连接的网络中继来反弹加密数据包。加密是多层的,将数据释放到公共互联网的最终网络中继无法识别通信的源头,因为整个数据包都被加密,每个节点只解密其中的一部分。目标计算机将数据包的最终退出点视为通信的源头,从而保护用户的真实身份和位置。来自 Electronic Frontier Foundation (www.eff.org)的以下图表解释了这个过程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Kali Linux 预装了 Tor。有关如何使用 Tor 和安全注意事项的更多信息,请参考 Tor 项目的网站:www.torproject.org/

可能有一些工具和应用程序不支持 socks 代理,但可以配置为使用 HTTP 代理。Privoxy 是一个充当 HTTP 代理的工具,可以与 Tor 链接。它也包含在 Kali Linux 中。

可供练习的易受攻击的应用程序和服务器

如果您没有这些资产的所有者明确书面授权,那么在大多数国家,扫描、测试或利用互联网上的服务器和应用程序的漏洞是非法的。因此,您需要拥有和控制自己的实验室,在那里您可以练习和发展您的测试技能。

在本节中,我们将回顾一些在学习 Web 应用程序渗透测试时的选项。

OWASP Broken Web Applications

OWASP 的Broken Web Applications(BWA)项目是一组易受攻击的 Web 应用程序,它们以虚拟机的形式分发,旨在为学生、安全爱好者和渗透测试专业人员提供一个学习和开发 Web 应用程序测试技能、测试自动化工具以及测试Web 应用程序防火墙(WAF)和其他防御措施的平台:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在撰写本文时,BWA 的最新版本是 1.2,于 2015 年 8 月发布。尽管它已经有几年的历史了,但对于有意成为渗透测试人员的人来说,它是一个很好的资源。它包含了一些最完整的有意易受攻击的 Web 应用程序,用于测试目的,并涵盖了许多不同的平台;请考虑以下示例:

  • WebGoat:这是一个以教育为重点的基于 Java 的 Web 应用程序。它包含了最常见的 Web 漏洞的示例和挑战。

  • WebGoat.NET 和 RailsGoat:分别是 WebGoat 的.NET 和 Ruby on Rails 版本。

  • Damn Vulnerable Web Application (DVWA):这可能是最受欢迎的有意漏洞的 Web 应用程序。它基于 PHP,并包含了常见漏洞的培训部分。

OWASP BWA 还包括真实的易受攻击的 Web 应用程序,即模拟真实世界应用程序的有意易受攻击的 Web 应用程序,在这些应用程序中,您可以寻找比之前列出的应用程序中更不明显的漏洞。以下是一些示例:

  • WackoPicko: 这是一个应用程序,你可以在其中发布图片并购买其他用户的照片。

  • The BodgeIt Store:这是一个模拟的在线商店,需要找到漏洞并完成一系列挑战。

  • Peruggia: 这是一个模拟社交网络的应用,你可以上传图片,接收评论,并评论其他用户的图片。

此外,还有一些已知漏洞的真实网络应用程序,可以补充这个集合,你可以测试和利用它们;请考虑以下示例:

  • WordPress

  • Joomla

  • WebCalendar

  • AWStats

关于 Broken Web Applications Project 的更多信息和下载链接可以在其网站上找到:www.owasp.org/index.php/OWASP_Broken_Web_Applications_Project

警告

在安装 OWASP BWA 时,请记住它包含严重的安全问题的应用程序。不要在具有互联网访问权限的物理服务器上安装易受攻击的应用程序。使用虚拟机,并将其网络适配器设置为 NAT、NAT 网络或仅主机。

Hackazon

Hackazon是 Rapid7 的一个项目,Rapid7 是 Metasploit 的制造商。它最初旨在展示他们的 Web 漏洞扫描器的有效性,然后作为开源软件发布。这是一个现代的 Web 应用程序(即,它使用 AJAX、Web 服务和其他你在今天的网站和应用程序中找到的功能)。Hackazon 模拟了一个在线商店,但内置了几个安全问题。你可以在以下网址上进行在线练习:hackazon.webscantest.com/。或者,如果你想要设置一个虚拟服务器并在那里安装和配置它,可以访问:github.com/rapid7/hackazon

Web Security Dojo

Maven Security 的Web Security Dojo项目是一个自包含的虚拟机,其中包含易受攻击的应用程序、培训材料和测试工具。该项目正在积极开发和更新。本文撰写时的最新版本是 3.0,于 2017 年 5 月发布。可以从以下网址获取:www.mavensecurity.com/resources/web-security-dojo

其他资源

有很多用于学习和实践渗透测试的优秀应用程序和虚拟机,这个列表可以延续很多页。在这里,我将列出一些额外的工具,除了已经提到的工具:

  • ZeroBank: 这是一个存在漏洞的银行应用程序:zero.webappsecurity.com/login.html

  • Acunetix’s SecurityTweets: 这是一个类似 Twitter 的应用程序,专注于 HTML5 安全:testhtml5.vulnweb.com/#/popular

  • OWASP 的易受攻击的 Web 应用程序目录:这是一个经过策划的公开可用的易受攻击的 Web 应用程序列表,用于安全测试:github.com/OWASP/OWASP-VWAD

  • VulnHub: 一个包含易受攻击的虚拟机和Capture The FlagCTF)挑战的存储库。它包含一些带有 Web 应用程序的虚拟机:www.vulnhub.com

总结

本章主要介绍了 Kali Linux 的安装、配置和使用。我们首先解释了 Kali Linux 的不同安装方式以及可以使用它的场景。虚拟化 Kali Linux 是一个有吸引力的选择,我们讨论了这样做的优缺点。一旦 Kali Linux 安装并运行起来,我们介绍了一些主要的黑客工具,这些工具将用于测试 Web 应用程序。Burp Suite 是一个非常有趣且功能丰富的工具,我们将在整本书中使用它。然后,我们讨论了 Web 漏洞扫描器,这些扫描器在识别知名 Web 服务器中的缺陷和配置问题方面非常有用。我们还谈到了使用 Tor 和 Privoxy 来模拟一个隐藏真实身份和位置的现实世界攻击者。最后,我们回顾了一些构建测试实验室和易受攻击的 Web 应用程序的替代方案,以测试和发展您的技能。

在下一章中,我们将进行侦察,扫描 Web 应用程序,并识别所使用的基础技术,这将作为进一步利用的基础。

第三章:侦察和分析 Web 服务器

多年来,恶意攻击者找到了各种渗透系统的方法。他们收集有关目标的信息,识别漏洞,然后发动攻击。一旦进入目标,他们试图隐藏自己的踪迹并保持隐藏。攻击者可能不一定按照我们的顺序进行,但作为渗透测试人员,遵循这里建议的方法将帮助您以结构化的方式进行评估;此外,每个阶段收集的数据将有助于准备一份对客户有价值的报告。攻击者的目标最终是拥有您的系统;因此,他们可能不遵循任何顺序的方法来实现这一目标。作为渗透测试人员,您的目标是尽可能多地识别漏洞;因此,遵循一个逻辑的方法非常有用。此外,您需要有创造力并且要有开阔的思维。

以下是渗透测试的不同阶段:

  • 侦察:这涉及调查公开可用的信息,了解目标的基础技术和组件之间的关系

  • 扫描:这涉及通过手动测试或自动扫描找到目标中可能的漏洞或弱点

  • 利用:这涉及利用漏洞,入侵目标并获取访问权限

  • 维持访问(后期利用):建立升级特权的手段或以其他方式访问被利用的资产;安装后门、利用本地漏洞、创建用户和其他方法

  • 销毁痕迹:这涉及删除攻击的证据;通常,专业的渗透测试不涉及这个最后阶段,因为能够重建测试人员所遵循的路径为防御团队提供了有价值的信息,并有助于提高目标的安全水平

侦察和扫描是渗透测试的初始阶段。渗透测试的成功在很大程度上取决于在这些阶段收集到的信息的质量。在本章中,您将作为渗透测试人员,并使用被动和主动侦察技术提取信息。然后,您将使用 Kali Linux 提供的不同工具对目标进行探测,以进一步提取信息并使用自动化工具找到一些漏洞。

侦察

侦察是国防部队使用的一个术语,它意味着以不引起敌人警觉的方式获取有关敌人的信息。攻击者和渗透测试人员也采用相同的概念来获取与目标相关的信息。信息收集是侦察的主要目标。在这个初始阶段收集到的任何信息都被认为是重要的。攻击者在恶意内容的基础上构建侦察阶段中学到的信息,并逐渐进行利用。一个看似无害的小信息可能会帮助你在测试的后期阶段突出显示一个严重的缺陷。渗透测试人员的一个有价值的技能是能够将可能是低风险的漏洞链接在一起,但如果组合起来则具有高影响力。

侦察测试的目标包括以下任务:

  • 使用 Whois 记录、搜索引擎和 DNS 服务器识别 IP 地址、域名、子域名和相关信息。

  • 从 Google、Bing、Yahoo!和 Shodan 等公开可用资源中积累有关目标网站的信息。互联网档案馆(archive.org/)是一个作为互联网上所有网页的数字档案的网站,在侦察阶段可以揭示一些非常有用的信息。该网站自 1996 年以来一直在存档缓存页面。然而,如果目标网站是最近创建的,互联网档案馆将需要一些时间来缓存它。

  • 通过社交网络网站(如 LinkedIn、Facebook、Flick、Instagram 或 Twitter)以及 Maltego 等工具来确定与目标相关的人员。

  • 使用 Geo IP 数据库、Google Maps 和 Bing Maps 的卫星图像来确定目标的物理位置。

  • 通过手动浏览 Web 应用程序并创建站点地图来了解应用程序的流程,并使用 Burp Suite、HTTP Track 和 ZAP Proxy 等工具进行爬虫。

在 Web 应用程序渗透测试中,侦察可能不会那么广泛。例如,在灰盒方法中,大部分在此阶段可以收集到的信息由客户提供;此外,范围可能严格限制在测试环境中运行的目标应用程序上。为了完整起见,在本书中,我们将采取一种通用的方法。

被动侦察与主动侦察

真正意义上的侦察应始终是被动的。这意味着侦察不应直接与目标交互,并且应从第三方来源收集所有信息。然而,在实际实施中,在对 Web 应用程序进行侦察时,您通常会与目标交互以获取最新的更改。被动侦察依赖于缓存的信息,可能不包括目标上进行的最新更改。尽管您可以使用与目标相关的公开可用信息学到很多东西,但在此阶段的范围内应始终包括以不警报防火墙和入侵防御设备的方式与网站进行交互。

一些渗透测试人员认为被动侦察应包括浏览目标 URL 并浏览公开可用内容;然而,其他人可能会认为它不应涉及任何针对实际网站的网络数据包。

信息收集

如前所述,侦察的主要目标是收集信息,同时避免被入侵检测机制检测和警报。被动侦察用于从公开可用资源中提取与目标相关的信息。在 Web 应用程序渗透测试中,您将首先获得一个 URL。然后,您将确定整个网站的范围并尝试连接不同的部分。被动侦察也被称为开源情报(OSINT)收集。

在黑盒渗透测试中,您对目标没有任何先前的信息,并且必须像一个不知情的攻击者一样接近它,侦察起着重要的作用。网站的 URL 是您唯一拥有的东西,用于扩展您对目标的了解。

域名注册详细信息

每次注册域名时,您都必须提供有关您的公司或业务的详细信息,例如名称、电话号码、邮寄地址以及用于技术和计费目的的特定电子邮件地址。域名注册商还将存储您的权威 DNS 服务器的 IP 地址。

检索这些信息的攻击者可以将其用于恶意目的。在注册过程中提供的联系人姓名和电话号码可以用于社会工程攻击,例如通过电话欺骗用户。邮寄地址可以帮助攻击者进行 wardriving 并找到未加密的无线接入点。纽约时报在 2013 年遭到攻击,当时其 DNS 记录被恶意攻击者更改,该攻击者对管理该域名的注册商的域名转售商进行了网络钓鱼攻击。更改 DNS 记录对网站的功能有严重影响,因为攻击者可以使用它将 Web 流量重定向到不同的服务器,而修复的更改可能需要长达 72 小时才能到达全球范围内的所有公共 DNS 服务器。

Whois - 提取域名信息

Whois 记录用于检索域所有者向域名注册商提供的注册详细信息。它是一种用于提取有关域和相关联系信息的协议。您可以查看注册域名的人/实体的姓名、地址、电话号码和电子邮件地址。Whois 服务器由区域互联网注册机构RIR)运营,并且可以直接通过端口43进行查询。在互联网的早期,只有一个 Whois 服务器,但随着互联网的扩展,现有的 Whois 服务器数量也增加了。如果查询的服务器上没有请求域的信息,则将请求转发到域名注册商的 Whois 服务器,并将结果返回给最终客户端。Kali Linux 内置了一个 Whois 工具,可以从终端运行。工具检索到的信息只有域所有者更新的信息准确,如果注册商网站上的更新详细信息不正确,有时可能会误导。此外,域所有者可以通过订阅域名注册商提供的附加服务来阻止与您的域名相关的敏感信息,此后注册商将显示他们的详细信息而不是您的域名的联系方式。

使用whois命令后跟目标域名应该显示一些有价值的信息。输出将包含注册商名称和返回信息的 Whois 服务器。它还将显示域名注册日期和到期日期,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果域名管理员在到期日期之前未续订域名,域名注册商将释放该域名,然后任何人都可以购买。输出还指出了域名的 DNS 服务器,可以进一步查询以找到域中的其他主机:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 DNS 识别相关主机

一旦您获得了权威 DNS 服务器的名称,您可以使用它来识别域中的其他主机。DNS 区域可能不仅包含用于 Web 服务器的条目。在互联网上,每个需要主机名来标识服务的技术都使用 DNS。邮件服务器和 FTP 服务器使用 DNS 来将主机解析为 IP 地址。通过查询 DNS 服务器,您可以识别目标组织中的其他主机;它还将帮助您识别从互联网访问的其他应用程序。citrix.target-domain.comwebmail.target-domain.com的记录可以引导您访问从互联网访问的其他应用程序。

使用 dig 进行区域传输

DNS 服务器通常实现复制(即主服务器和辅助服务器)以提高可用性。为了将主机解析数据库从主服务器同步到辅助服务器,会进行一种称为区域传输的操作。辅助服务器从主服务器请求区域(该服务器负责的域的部分)数据,主服务器会响应并返回一个包含其可以解析的 IP 地址-主机名对的数据库副本。

DNS 服务器的配置错误允许任何人请求区域传输并获取这些服务器的已解析主机的完整列表。在 Linux 中使用域名互联网探测器dig)命令行工具,您可以尝试执行区域传输以识别域中的其他主机。区域传输是通过 TCP 端口53而不是标准的 DNS 端口 UDP 端口53进行的。

dig命令行工具主要用于查询 DNS 服务器的主机名。一个简单的命令,如dig google.com,会显示该域的 IP 地址和托管 DNS 区域的 DNS 服务器的名称(也称为名称服务器)。有许多类型的 DNS 记录,如邮件交换器MX)、SRV 记录和 PTR 记录。dig google.com mx命令显示 MX 记录的信息。

除了常规的 DNS 任务外,dig命令还可以用于执行 DNS 区域传输。

让我们向zonetransfer.me发出一个区域传输请求,这是由 Robin Wood(DigiNinja)为教育目的而创建的一个易受攻击的域。请求使用dig命令,将zonetransfer.me域的 AXFR(区域传输)记录发送到nsztm1.digi.ninja服务器:

$ dig axfr zonetransfer.me @nsztm1.digi.ninja

如下屏幕截图所示,如果启用了区域传输,dig工具会在终端中转储区域中的所有条目:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Shell 命令,如grepcut,非常适用于处理命令行工具的输出。在上面的示例中,cut|(管道)字符一起使用,只显示dig命令结果中每行的由-d " "(空格)字符分隔的前三个元素。在此屏幕截图中,列由制表符分隔,最后一列中的信息由空格分隔。

通常情况下,即使主 DNS 服务器阻止区域传输,该域的辅助服务器可能允许它。dig google.com NS +noall +answer命令将显示该域的所有名称服务器。

尝试从facebook.com的 DNS 服务器执行区域传输失败,因为该公司正确地锁定了他们的 DNS 服务器:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进行 DNS 查找以搜索 IP 地址是被动侦察。然而,一旦使用dignslookup等工具进行区域传输,它就变成了主动侦察。

DNS 枚举

在真实的渗透测试项目中,很少会发现允许匿名区域传输的配置错误的服务器。还有其他技术可以用来发现与域名相关的主机名或子域名,Kali Linux 包含了一些有用的工具来完成这个任务。

DNSEnum

DNSEnum是一个命令行工具,可以自动识别基本的 DNS 记录,如 MX 记录、邮件交换服务器、NS 记录、域名服务器或 A 记录(域的地址记录)。它还尝试在所有识别的服务器上进行区域传输,并具有尝试反向解析(即根据 IP 地址获取主机名)和暴力破解(查询子域和主机名的存在以获取其 IP 地址)的能力。以下是对zonetransfer.me的查询示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

区域传输的结果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fierce

Fierce 由mschwager提供,详见Fierce: A DNS reconnaissance tool for locating non-contiguous IP space (github.com/mschwager/fierce), GitHub © 2018,如下所示:

Fierce 是一个半轻量级的扫描器,用于定位非连续的 IP 空间和指定域的主机名。

Fierce 使用区域传输、字典攻击和反向解析来收集主机名和子域名以及域的 IP 地址,并且它可以搜索相关名称(例如domain company.comcorpcompany.comwebcompany.com)。在下面的示例中,我们将使用搜索来识别google.com的主机名:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

DNSRecon

DNSRecon是 Kali Linux 中的另一个有用工具。它可以通过区域传输、字典请求和 Google 搜索等多种技术来收集 DNS 信息。在下面的屏幕截图中,我们将通过区域传输(-a)、通过 Whois 获取的 IP 地址空间的反向分析(-w)和 Google 搜索(-g)对zonetransfer.me进行枚举:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Nmap 对 DNS 记录进行暴力破解

Nmap附带了一个脚本,使用暴力破解技术查询 DNS 服务器以获取其他主机。它使用了vhosts-defaults.lstvhosts-full.lst字典文件,这些文件包含了多年来由 Nmap 开发团队收集的常见主机名的大量列表。这些文件可以在/usr/share/nmap/nselib/data/目录下找到。Nmap 向 DNS 服务器发送查询,检查该文件中的每个条目是否有可用于该主机名的 A 记录。

如下所示的屏幕截图显示,暴力破解脚本返回了一个积极的结果。它通过查询 A 记录来识别 DNS 区域中的一些主机:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用搜索引擎和公共网站收集信息

现代搜索引擎是公共信息收集和被动侦察的宝贵资源。像 Google、Bing 和 DuckDuckGo 这样的综合搜索引擎允许我们使用高级搜索过滤器来查找特定域中的信息、特定文件类型、URL 中的内容和特定文本模式。还有一些专门的搜索引擎,比如 Shodan,可以让您在多种服务中搜索主机名、开放端口、服务器位置和特定的响应头。

Google dorks

Google dorks技术,也称为Google hacking,起初是滥用 Google 的高级搜索选项,后来扩展到其他也包含类似选项的搜索引擎。它搜索特定的字符串和参数,以从组织或目标中获取有价值的信息。以下是一些对渗透测试人员有用的示例:

  • 可以搜索特定站点或域中的 PDF 文档,如下所示:
      site:example.com filetype:pdf 
  • 可以搜索特定域的电子邮件地址引用,但排除该域的网站:
      "@example.com" -site:example.com 
  • 可以搜索标题或 URL 中包含example.com的管理站点:
      intitle:admin OR inurl:admin  site:example.com 
  • 您还可以搜索特定的错误消息,指示可能存在 SQL 注入漏洞:
      "SQL Server Driver][SQL Server]Line 1: Incorrect syntax near"  
      site:example.com 

Google 和其他搜索引擎中有成千上万种可能的有用搜索组合。Kali Linux 的创建者 Offensive Security 还维护了一个公共数据库,其中包含可能为渗透测试人员提供有用结果的搜索字符串,该数据库位于:www.exploit-db.com/google-hacking-database/

Shodan

Shodanshodan.io)是一种不同类型的搜索引擎;它帮助您查找连接到互联网的设备,而不是网页中的内容。与 Google 一样,它具有运算符和特定的语法来执行高级和特定的搜索。这个屏幕截图显示了搜索与google.com相关的所有主机名:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Shodan 进行主机名搜索的示例

要利用 Shodan 的高级搜索功能,首先需要创建一个帐户。免费帐户只能获得有限数量的结果,而且某些选项受限,但仍然非常有用。Shodan 可以用来查找以下内容:

  • 可以通过以下方式找到属于某个域的互联网上公开的服务器:
      hostname:example.com 
  • 可以通过指定Server参数来找到特定类型的设备,例如 CCTV 摄像头或工业控制系统(ICS):
      Server: SQ-WEBCAM 
  • 可以找到特定开放端口或服务,例如使用常见端口的 Web 服务器:
      port:80,443,8080 
  • 可以通过以下方式找到特定网络范围内的主机:
      net:192.168.1.1/24 

有关 Shodan 搜索选项和运算符的有用参考资料可以在以下网址找到:pen-testing.sans.org/blog/2015/12/08/effective-shodan-searches

theHarvester

theHarvester是 Kali Linux 中包含的命令行工具,它作为各种搜索引擎的包装器,用于从不同的公共来源(如搜索引擎和 PGP 密钥服务器)查找与域名相关的电子邮件账户、子域名、虚拟主机、开放端口/横幅和员工姓名。在最近的版本中,作者添加了进行 DNS 暴力破解、反向 IP 解析和顶级域TLD)扩展的功能。

在以下示例中,使用theharvester收集有关zonetransfer.me的信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Maltego

Maltego是广泛用于 OSINT 的专有软件。Kali Linux 包含了 Maltego 的社区版,完成在线注册后可以免费使用,但有一些限制。Maltego 对数据的各个部分(例如电子邮件地址和域名)执行转换以获取更多信息,并将所有结果显示为显示不同对象之间关系的图形。转换是对特定对象的公共信息搜索,例如搜索与域名相关的 IP 地址或与电子邮件地址或人名相关的社交媒体账户。以下截图显示了 Maltego 的主界面:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Maltego 界面

Recon-ng - 信息收集的框架

OSINT 收集是一个耗时且需要手动操作的过程。与目标组织相关的信息可能分散在多个公共资源中,积累和提取与目标相关的信息是一项困难且耗时的任务。大多数组织的 IT 预算不允许在此类活动上花费太多时间。

Recon-ng是渗透测试人员一直需要的工具。它是一个功能强大的信息收集工具。Recon-ng 是一个非常交互式的工具,类似于 Metasploit 框架。该框架使用许多不同的来源来收集数据,例如 Google、Twitter 和 Shodan。一些模块在查询网站之前需要 API 密钥。可以通过完成搜索引擎网站上的注册来生成密钥。其中一些模块使用付费 API 密钥。

要在 Kali Linux 中启动 Recon-ng,请导航到应用程序菜单,点击信息收集子菜单,或在终端中运行recon-ng命令。您将在右侧窗格中看到 Recon-ng 的列表。与 Metasploit 类似,当框架启动并运行时,您可以输入show modules来查看随附的不同模块。一些模块是被动的,而其他模块则主动探测目标以提取所需的信息。

尽管 Recon-ng 有一些利用模块,但该工具的主要任务是协助侦察活动,并且其中有大量的模块可用于此目的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Recon-ng 可以查询多个搜索引擎,其中一些通过 Web 请求查询;也就是说,该工具复制了普通用户在搜索框中输入文本并点击搜索按钮时所做的请求。另一个选项是使用引擎的 API。使用 API 时,搜索引擎可能需要 API 密钥来识别发送这些请求的人并应用配额。该工具比人类工作更快,并且通过分配 API 可以跟踪使用情况并防止滥用服务。因此,请确保不要过度使用搜索引擎,否则可能会拒绝您的查询。

所有主要搜索引擎都有一个注册用户持有 API 密钥的选项。例如,您可以在azure.microsoft.com/en-us/try/cognitive-services/?api=bing-web-search-api.上为 Bing 生成 API 密钥。

此免费订阅每月提供 5000 个查询。生成密钥后,需要使用以下命令将其添加到 Recon-ng 工具的密钥表中:

keys add bing_api <api key generated>  

要显示在 Recon-ng 中存储的所有 API 密钥,请输入以下命令:

keys list  

使用 Recon-ng 进行域枚举

收集有关目标网站的子域的信息将帮助您识别网站的不同内容和功能。目标组织提供的每个产品或服务可能都有一个专用的子域。这有助于以一致的方式组织各种内容。通过识别不同的子域,您可以创建一个站点地图和流程图,将各个部分相互连接起来,更好地了解网站的流程。

子级和顶级域名枚举

使用 Bing Web 主机名枚举模块,我们将尝试在www.facebook.com/网站上找到其他子域:

  1. 首先需要使用load recon/domains-hosts/bing_domain_web命令加载模块。接下来,输入show info命令,显示描述该模块的信息。

  2. 下一步是在SOURCE选项中设置目标域。我们将其设置为facebook.com,如截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 准备好后,使用run命令启动模块。该工具首先查询几个域,然后使用(-)指令删除已查询的域。然后再次搜索其他域。这里的最大优势是速度。除了速度外,输出还以明文形式存储在数据库中。这可以用作其他工具(如 Nmap、Metasploit 和 Nessus)的输入。输出如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

DNS 公共后缀暴力破解模块可用于识别顶级域名(TLD)和二级域名(SLD)。许多基于产品和服务的企业为每个地理区域都有单独的网站;您可以使用此暴力破解模块来识别它们。它使用来自/usr/share/recon-ng/data/suffixes.txt的字典文件来枚举附加域名。

报告模块

您运行的每个侦察模块都会将输出存储在单独的表中。您可以将这些表导出为多种格式,例如 CSV、HTML 和 XML 文件。要查看 Recon-ng 工具使用的不同表格,需要输入show并按两次Tab键列出自动完成功能的可用选项。

要将表导出为 CSV 文件,请通过输入use reporting/csv命令加载 CSV 报告模块。(load命令可以替代use命令,效果相同。)加载模块后,设置要导出的文件名和表,并输入run

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下是 Recon-ng 中的一些其他侦察模块,对渗透测试人员非常有帮助:

  • Netcraft 主机名枚举器:Recon-ng 将收集 Netcraft 网站并累积与目标相关的所有主机,并将它们存储在主机表中。

  • SSL SAN 查找:许多启用 SSL 的网站使用Subject Alternative Names(SAN)功能在多个域上使用单个证书。该模块使用ssltools.com/网站来检索证书的 SAN 属性中列出的域。

  • LinkedIn 身份验证联系人枚举器:将从 LinkedIn 个人资料中检索联系人并将其存储在联系人表中。

  • IPInfoDB GeoIP:使用 IPInfoDB 数据库显示主机的地理位置(需要 API)。

  • Yahoo!主机名枚举器:这使用 Yahoo!搜索引擎来定位域中的主机。拥有多个搜索引擎的模块可以帮助您定位其他搜索引擎未索引的主机和子域。

  • 地理编码器和反向地理编码器:这些模块使用提供的坐标使用 Google Map API 获取地址,并且如果提供了地址,则还会检索坐标。然后将信息存储在位置表中。

  • 推销模块:使用 Recon-ng 推销模块,您可以从流行的社交网络网站中提取数据,将其与地理位置坐标相关联,并创建地图。两个广泛使用的模块如下:

  • Twitter 地理位置搜索:这在 Twitter 上搜索从给定坐标的特定半径内上传的媒体(图片和推文)

  • Flickr 地理位置搜索:这试图找到从给定坐标附近上传的照片

这些推销模块可用于将人员映射到物理位置,并确定在特定时间给定坐标处的人员。通过 Recon-ng,您可以仅使用公开可用的资源创建一个庞大的主机、IP 地址、物理位置和人员数据库。

侦察应始终以从各种公共资源中提取信息并识别攻击者可以直接或间接利用的敏感数据为目标进行。

扫描-探测目标

渗透测试需要在有限的时间内进行,侦察阶段是最少时间的阶段。在真实的渗透测试中,您将在侦察阶段收集的信息与客户共享,并尝试就应包含在扫描阶段中的目标达成共识。

在这个阶段,客户还可以向您提供在侦察阶段未识别的其他目标和域,但它们将包含在实际的测试和利用阶段中。这样做是为了通过包括黑帽和白帽黑客的方法来获得测试的最大效益,您将测试开始时像恶意攻击者一样进行测试,并随着测试的进行,提供额外的信息,从而得到目标的准确视图。

确定托管网站的目标服务器后,下一步是收集其他信息,如操作系统和该特定服务器上可用的服务。除了托管网站外,一些组织还启用 FTP 服务,并根据需要打开其他端口。作为第一步,您需要确定除端口80和端口443之外的 Web 服务器上打开的其他端口。

扫描阶段包括以下几个阶段:

  • 端口扫描

  • 操作系统指纹识别

  • Web 服务器版本识别

  • 基础设施分析

  • 应用程序识别

使用 Nmap 进行端口扫描

网络映射器,通常称为 Nmap,是最广为人知的端口扫描器。它以极高的成功率找到 TCP 和 UDP 开放端口,并且是渗透测试人员工具包中的重要组成部分。Kali Linux 预装了 Nmap。Nmap 定期更新,并由一群积极贡献于这个开源工具的开发人员维护。

默认情况下,Nmap 不会向所有端口发送探测。 Nmap 仅检查在nmap-services文件中指定的前 1000 个常用端口。每个端口条目都有一个相应的数字,表示该端口开放的可能性。这大大提高了扫描的速度,因为扫描中省略了不太重要的端口。根据目标的响应,Nmap 确定端口是开放的、关闭的还是被过滤的。

端口扫描的不同选项

运行 Nmap 端口扫描的直接方法称为TCP 连接扫描。此选项用于扫描打开的 TCP 端口,并使用-sT选项调用。连接扫描执行完整的三次 TCP 握手(SYN-SYN / ACK-ACK)。它提供了更准确的端口状态,但更有可能在目标机器上被记录,并且比替代的 SYN 扫描更慢。使用-sS选项的 SYN 扫描不会与目标完成握手,因此不会在目标机器上记录。但是,SYN 扫描生成的数据包可能会引起防火墙和 IPS 设备的警报,并且有时会被这些设备默认阻止。

当使用-F标志调用 Nmap 时,将扫描前 100 个端口而不是前 1000 个端口。此外,它还提供了使用--top-ports [N]标志自定义扫描的选项,以从nmap-services文件中扫描N个最流行的端口。许多组织可能有应用程序将侦听不在nmap-services文件中的端口。对于这种情况,可以使用-p标志为 Nmap 定义要扫描的端口、端口列表或端口范围。

有 65535 个 TCP 和 UDP 端口,以及可以使用任何端口的应用程序。如果您愿意,可以使用-p 1-65535-p-选项测试所有端口。

以下屏幕截图显示了前面命令的输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在渗透测试中,非常重要的是保存结果并保留运行的所有工具的日志。您应该保存笔记和记录以更好地组织项目,并将日志保存为预防措施,以防目标出现问题。然后,您可以返回到日志中检索可能对重新建立服务或识别故障源至关重要的信息。 Nmap 具有各种-o选项,可将其结果保存为不同的文件格式:-oX用于 XML 格式,-oN用于 Nmap 输出格式,-oG用于可搜索的文本,-oA用于全部。

使用 Nmap 绕过防火墙和 IPS

除了用于 TCP 的不同扫描之外,Nmap 还提供了各种选项,可在从组织网络外部扫描目标时帮助规避防火墙。以下是这些选项的描述:

  • ACK 扫描:此选项用于规避某些路由器上的规则,这些规则仅允许来自内部网络的 SYN 数据包,从而阻止默认的连接扫描。这些路由器只允许内部客户端通过路由器建立连接,并阻止所有源自外部网络且带有 SYN 位设置的数据包。当使用-sA标志调用 ACK 扫描选项时,Nmap 生成仅带有 ACK 位设置的数据包,欺骗路由器认为该数据包是对内部客户端建立的连接的响应,并允许数据包通过。 ACK 扫描选项无法可靠地确定目标系统的端口是打开还是关闭,因为不同的系统以不同的方式响应未经请求的 ACK。但是,它可以用于识别路由器后面的在线系统。

  • 防火墙规则中的硬编码源端口:许多防火墙管理员使用规则配置防火墙,允许来自外部网络的入站流量,源自特定源端口(如532580)。默认情况下,Nmap 会随机选择源端口,但可以配置为使用特定源端口以规避此规则,使用--source-port选项。

  • 自定义数据包大小:Nmap 和其他端口扫描器以特定大小发送数据包,而防火墙现在已经定义了规则以丢弃此类数据包。为了规避此检测,可以使用--data-length选项配置 Nmap 以使用不同大小的数据包发送。

  • 自定义 MTU:Nmap 还可以配置为发送较小 MTU 的数据包。扫描将使用--mtu选项和 MTU 的值进行。这可以用于规避一些较旧的防火墙和入侵检测设备。新的防火墙在将流量发送到目标机器之前重新组装流量,因此很难规避它们。MTU 需要是 8 的倍数。以太网局域网的默认 MTU 为 1,500 字节。

  • 分段数据包:绕过 IDS 和 IPS 系统的常见而有效的方法是分段数据包,以便在被这些防御机制分析时,它们不匹配恶意模式。Nmap 可以使用-f选项来执行此操作,当执行完整的 TCP 扫描(-sT)时。

  • MAC 地址欺骗:如果目标环境中配置了仅允许来自特定 MAC 地址的网络数据包的规则,您可以配置 Nmap 设置特定的 MAC 地址来进行端口扫描。端口扫描数据包也可以使用--spoof-mac选项配置特定的 MAC 地址。

识别操作系统

在识别 Web 服务器上的开放端口后,您需要确定底层操作系统。Nmap 提供了几个选项来实现这一点。使用-O选项执行操作系统扫描;您可以添加-v以获取详细输出,以了解确定操作系统所进行的底层测试:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一位熟练的黑客不依赖于单一工具的结果。因此,Kali Linux 配备了多个指纹识别工具;除了使用 Nmap 运行版本扫描外,您还可以使用 Amap 等工具来获取第二个意见。

对服务器进行分析

确定了底层操作系统和开放端口后,您需要识别在开放端口上运行的确切应用程序。在扫描 Web 服务器时,您需要分析在操作系统之上运行的 Web 服务的类型和版本。Web 服务器基本上处理应用程序的 HTTP 请求并将其分发到 Web;Apache、IIS 和 nginx 是最常用的 Web 服务器。除了版本之外,您还需要在进行利用阶段之前识别 Web 服务器上启用的任何其他软件、功能和配置。

Web 应用程序开发严重依赖于诸如 PHP 和.NET 之类的框架,每个 Web 应用程序将根据用于设计它的框架而需要不同的技术。

除了对 Web 服务器进行版本扫描外,您还需要识别支持 Web 应用程序的其他组件,例如数据库应用程序、加密算法和负载均衡器。

同一台物理服务器上通常部署有多个网站。您只需要攻击渗透测试项目范围内的网站,并且需要对虚拟主机有适当的理解才能做到这一点。

识别虚拟主机

许多组织的网站是由使用共享资源的服务提供商托管的。共享 IP 地址是他们使用的最有用和经济有效的技术之一。当您对特定 IP 地址进行反向 DNS 查询时,通常会返回多个域名。这些网站使用基于名称的虚拟主机,它们通过主机头值与在同一 IP 地址上托管的其他网站进行唯一标识和区分。

这类似于多路复用系统。当服务器接收到请求时,通过查阅请求头中的Host字段来识别和路由请求到特定的主机。这在第一章中讨论过,即渗透测试和 Web 应用程序简介

在与网站交互和构建攻击时,识别托管类型非常重要。如果 IP 地址托管多个网站,则必须在攻击中包含正确的主机头值,否则将无法获得所需的结果。这也可能影响托管在该 IP 地址上的其他网站。直接使用 IP 地址进行攻击可能会产生不良结果,并且可能会击中超出范围的元素。如果这些元素不属于客户组织,则可能会产生法律影响。

使用搜索引擎查找虚拟主机

您可以通过分析 DNS 记录来确定一个 IP 地址上是否托管了多个网站。如果多个名称指向同一个 IP 地址,则主机头值用于唯一标识网站。可以使用dignslookup等 DNS 工具来识别返回相似 IP 地址的域名。

您可以使用ipneighbour.com/网站来确定其他网站是否托管在给定的 Web 服务器上。以下示例显示了几个与维基百科相关的网站托管在同一个 IP 地址上:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

识别负载均衡器

高需求的网站和应用程序使用某种形式的负载平衡来分发服务器负载并保持高可用性。网站的互动性使得用户在整个会话期间访问同一台服务器对于最佳用户体验至关重要。例如,在电子商务网站上,一旦用户将商品添加到购物车中,预期用户将在结账页面再次连接到同一台服务器以完成交易。引入中间件,如负载均衡器,使得负载均衡器将用户的后续请求发送到同一台服务器变得非常重要。

有几种技术可以用来在服务器之间平衡用户连接。DNS 是最容易配置的,但它不可靠,并且不能提供真正的负载平衡体验。硬件负载均衡器是今天用来将流量路由到维护多个 Web 服务器的网站的工具。

在渗透测试中,有必要识别使用的负载均衡技术,以便全面了解网络基础设施。一旦识别出来,现在必须测试负载均衡器后面的每个服务器的漏洞。还需要与客户团队合作,因为不同的硬件负载均衡器供应商使用不同的技术来维护会话亲和性。

基于 cookie 的负载均衡器

硬件负载均衡器常用的一种方法是在终端客户端的浏览器中插入一个 cookie,将用户与特定服务器绑定。这个 cookie 是在 IP 地址之外设置的,因为许多用户将位于代理或 NAT 配置后面,并且其中大多数将使用相同的源 IP 地址。

每个负载均衡器都有自己的 cookie 格式和名称。这些信息可以用来确定是否正在使用负载均衡器以及其提供者是谁。负载均衡器设置的 cookie 还可以揭示与目标相关的敏感信息,这对渗透测试人员可能有用。

可以配置 Burp Proxy 来拦截连接,并通过分析头部查找 cookie。如下图所示,目标正在使用 F5 负载均衡器。长数字值实际上是包含池名称、Web 服务器 IP 地址和端口的编码值。因此,在这里,负载均衡器 cookie 揭示了不应该揭示的关键服务器详细信息。可以配置负载均衡器以设置不揭示此类详细信息的自定义 cookie:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

F5 负载均衡器的默认 cookie 格式如下:

BIGipServer<pool name> =<coded server IP>.<coded server port>.0000 

其他识别负载均衡器的方法

识别负载均衡器的其他方法如下:

  • 分析服务器之间的 SSL 差异:不同的 Web 服务器之间的 SSL 配置可能会有细微的变化。发给池中 Web 服务器的证书的时间戳可能会有所不同。可以利用 SSL 配置的差异来确定负载均衡器后面是否配置了多个服务器。

  • 重定向到不同的 URL:另一种将请求在服务器之间进行负载均衡的方法是通过将客户端重定向到不同的 URL 来分发负载。用户可能浏览到一个网站www.example.com,但被重定向到www2.example.com。另一个用户的请求被重定向到www1.example.com,然后传递一个来自不同服务器的网页。这是识别负载均衡器最简单的方法之一,但由于管理开销和安全问题,它并不经常被实现。

  • 负载均衡器的 DNS 记录:DNS 区域中的主机记录可用于判断设备是否为负载均衡器。

  • 负载均衡器检测器:这是 Kali Linux 中包含的一个工具。它用于确定网站是否使用负载均衡器。从 shell 执行该工具的命令是lbd <网站名称>。该工具附带了一个免责声明,说明它是一个概念验证工具,可能会产生误报。

  • Web 应用程序防火墙(WAF):除了负载均衡器外,应用程序还可能使用 WAF 来防御攻击。Kali Linux 中的 WAFW00F Web 应用程序防火墙检测工具能够检测路径中是否存在任何 WAF 设备。可以通过导航到信息收集| IDS / IPS 识别来访问该工具。

应用程序版本指纹识别

在端口25和端口80等众所周知的端口上运行的服务可以很容易地识别,因为它们被广泛知名的应用程序(如邮件服务器和 Web 服务器)使用。互联网分配号码管理局IANA)负责维护端口号的官方分配,并且可以从每个操作系统中的端口映射文件中识别映射。然而,许多组织在更适合其基础设施的端口上运行应用程序。您经常会看到一个内部网站在端口8080上运行,而不是端口80,或者在端口8443上运行,而不是端口443

端口映射文件只是一个占位符,应用程序可以在任何开放的端口上运行,由开发人员设计,违背了 IANA 设定的映射。这正是为什么您需要进行版本扫描,以确定 Web 服务器是否确实在端口80上运行,并进一步分析该服务的版本。

Nmap 版本扫描

Nmap 有几个选项可用于执行版本扫描;版本扫描可以与操作系统扫描结合使用,也可以单独运行。Nmap 通过发送各种数据包来探测目标,然后分析响应以确定确切的服务及其版本。

要仅进行版本扫描,请使用-sV选项。操作系统扫描和版本扫描可以使用-A(侵略性)选项结合在一起,该选项还包括路由跟踪和执行一些脚本。如果没有定义端口以及扫描选项,Nmap 将首先使用默认的前 1000 个端口列表对目标进行端口扫描,并从中识别开放的端口。

接下来,它将向开放的端口发送探测,并分析响应以确定在该特定端口上运行的应用程序。接收到的响应与nmap-service-probes文件中的大型签名数据库进行匹配。它类似于 IPS 签名的工作原理,其中网络数据包与包含恶意数据包签名的数据库进行匹配。版本扫描选项的好坏取决于该文件中签名的质量。

以下截图显示了前面命令的输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以向 Nmap 项目报告不正确的结果和未知端口的新签名。这有助于提高未来版本中签名的质量。

Amap 版本扫描

Kali Linux 还附带了一个名为 Amap 的工具,它由The Hacker’s Choice(THC)组创建,类似于 Nmap。它通过发送一些数据包来探测开放的端口,然后分析响应以确定在该端口上监听的服务。

将要发送到目标端口的探针定义在名为appdefs.trig的文件中,并且接收到的响应会与appdefs.resp文件中的签名进行分析。

在渗透测试期间,使用多个工具探测端口是很重要的,以排除任何错误的阳性或阴性。仅依赖一个工具的签名可能在测试期间证明是致命的,因为您未来的攻击将取决于在此阶段识别的服务及其版本。

您可以使用-bqv选项调用 Amap,它只会报告打开的端口并打印收到的 ASCII 响应以及与之相关的一些详细信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

指纹识别 Web 应用程序框架

了解用于开发网站的框架可以帮助您识别未修补版本中可能存在的漏洞。

例如,如果网站是在 WordPress 平台上开发的,可以在该网站的网页中找到其痕迹。大多数 Web 应用程序框架都有可以被攻击者用来确定所使用框架的标记。

有几个地方可以揭示有关框架的详细信息。

HTTP 标头

除了定义 HTTP 事务的操作参数之外,标头还可以包含对攻击者有用的其他信息。

在下面的示例中,使用 Firefox 的开发工具(F12键),您可以从Server字段中确定正在使用 Apache Web 服务器。此外,使用X-AspNet-Version,您可以确定 ASP.NET 版本 2 是开发框架。这种方法并不总是有效,因为标头字段可以通过服务器端的适当配置禁用:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

应用程序框架还会创建新的 Cookie 值,这些值可以帮助您了解所使用的底层框架,因此也要注意 Cookie。

HTML 页面源代码中的注释也可以指示用于开发 Web 应用程序的框架。页面源中的信息还可以帮助您识别使用的其他 Web 技术。

WhatWeb 扫描器

WhatWeb 工具用于识别网站使用的不同 Web 技术。它包含在 Kali Linux 中,并且可以通过转到应用程序 | 03 - Web 应用程序分析 | Web 漏洞扫描器来访问。它可以识别不同的内容管理系统、统计/分析包和用于设计 Web 应用程序的 JavaScript 库。该工具声称拥有超过 900 个插件。它可以以不同的侵略性级别运行,以平衡速度和可靠性。该工具可以在单个网页上获取足够的信息来识别网站,也可以递归查询网站以识别使用的技术。

在下一个示例中,我们将使用该工具针对 OWASP BWA 虚拟机,并启用-v详细选项。这将打印出与识别的技术相关的一些有用信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

扫描 Web 服务器以查找漏洞和配置错误

到目前为止,我们已经处理了目标的基础设施部分。现在我们需要分析底层软件并尝试了解隐藏在背后的不同技术。使用默认配置设计的 Web 应用程序容易受到攻击,因为它们为恶意攻击者提供了多个入口来利用应用程序。

Kali Linux 提供了几个工具来分析 Web 应用程序的配置问题。扫描工具通过浏览整个网站并寻找有趣的文件、文件夹和配置设置来识别漏洞。未正确实施和发现运行在旧版本上的服务器端脚本语言,如 PHP 和 CGI,可以使用自动化工具进行利用。

使用 Nmap 识别 HTTP 方法

在 Web 渗透测试期间,对 Web 服务器的第一个直接请求应该是识别 Web 服务器支持的方法。您可以使用 Netcat 打开到 Web 服务器的连接,并使用OPTIONS方法查询 Web 服务器。您还可以使用 Nmap 确定支持的方法。

在不断增长的 Nmap 脚本库中,您可以找到一个名为http-methods.nse的脚本。当您使用--script选项和目标运行该脚本时,它将列出目标上允许的 HTTP 方法,并指出危险的方法。在下面的截图中,您可以看到它检测到了几种启用的方法,并指出TRACE作为一种风险方法:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Metasploit 中的辅助模块测试 Web 服务器

以下模块对于渗透测试人员测试 Web 服务器的漏洞非常有用:

  • dir_listing: 这个模块将连接到目标 Web 服务器,并确定是否在其上启用了目录浏览。

  • dir_scanner: 使用这个模块,你可以扫描目标网站以查找任何有趣的网页目录。你可以提供一个自定义创建的字典给模块,或者使用默认的字典。

  • enum_wayback: 这是一个有趣的模块,它查询 Internet Archive 网站,并查找目标域中的网页。可能已经取消链接的旧网页仍然可以访问,并且可以使用 Internet Archive 网站找到它们。您还可以识别网站在多年间经历的变化。

  • files_dir: 这个模块可以用来扫描服务器以查找数据泄漏漏洞,通过定位配置文件和源代码文件的备份。

  • http_login: 如果网页有一个在 HTTP 上工作的登录页面,您可以尝试使用 Metasploit 字典对其进行暴力破解。

  • robots_txt: 机器人文件可能包含一些未被探索的 URL,您可以使用这个模块查询它们,以找到未被搜索引擎索引的 URL。

  • webdav_scanner: 这个模块可以用来查找服务器上是否启用了 WebDAV,这基本上将 Web 服务器变成了文件服务器。

识别 HTTPS 配置和问题

任何管理任何敏感或个人可识别信息(姓名、电话号码、地址、健康、信用或税务记录、信用卡和银行账户信息等)的网站或 Web 应用程序都需要实施一种机制来保护信息在客户端和服务器之间的传输过程中的安全。

HTTP 最初是作为明文协议诞生的。因此,它不包含保护客户端和服务器之间交换的信息免受第三方查看和/或修改的机制。为了解决这个问题,客户端和服务器之间创建了一个加密通信通道,并通过该通道发送 HTTP 数据包。HTTPS 是在安全通信通道上实现的 HTTP 协议。它最初是在安全套接字层SSL)上实现的。SSL 在 2014 年被弃用,并被传输层安全性TLS)取代,尽管仍有许多网站支持 SSLv3,无论是由于配置错误还是为了向后兼容。

支持旧的加密算法有一个主要的缺点。大多数旧的密码套件被密码分析师发现在合理的时间内使用当今可用的计算能力很容易被破解。

一个专门的攻击者可以从云服务提供商那里租用廉价的计算能力,并使用它来破解旧的密码套件并获取明文信息的访问权限。因此,使用旧的密码套件会提供一种虚假的安全感,应该禁用。客户端和服务器只应允许协商一种被认为是安全的、在实践中非常难以破解的密码套件。

Kali Linux 包含一些工具,允许渗透测试人员识别 SSL/TLS 实现中的配置错误。在本节中,我们将回顾最受欢迎的工具。

OpenSSL 客户端

OpenSSL包含在几乎所有 GNU/Linux 发行版中,它是基本的 SSL/TLS 客户端,并包含了一些功能,可以帮助您对 HTTPS 服务器进行一些基本测试。

一个基本的测试是与服务器建立连接。在这个例子中,我们将连接到一个在端口443上的测试服务器(默认的 HTTPS 端口):

openssl s_client -connect 10.7.7.5:443

您可以在以下截图中看到有关连接参数和证书交换的详细信息。值得注意的是,连接使用了 SSLv3,这本身就是一个安全问题,因为 SSL 已被弃用,并且已知存在漏洞,可能导致信息的完全解密,例如Padding Oracle On Downgraded Legacy EncryptionPOODLE),我们将在后面的章节中讨论:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您经常会看到密码套件被写成 ECDHE-RSA-RC4-MD5 的格式。该格式分解为以下几个部分:

  • ECDHE:这是一种密钥交换算法

  • RSA:这是一种身份验证算法

  • RC4:这是一种加密算法

  • MD5:这是一种哈希算法

可以在以下网址找到 SSL 和 TLS 密码套件的综合列表:www.openssl.org/docs/apps/ciphers.html

您可以使用 OpenSSL 的一些其他选项来更好地测试您的目标,如下所示:

  • 禁用或使用特定协议:使用-no_ssl3-no_tls1-no_tls1_1-no_tls1_2选项,您可以禁用对应协议的使用,并测试您的目标接受哪些协议

  • 测试一个特定的协议-tls1-tls1_1-tls1_2选项仅测试指定的协议

现在,接受 SSL 和 TLS 1.0 被认为是不安全的。在某些应用中,TLS 1.1 可能是可以接受的,但 TLS 1.2 是推荐的选项。

使用 SSLScan 扫描 TLS/SSL 配置

SSLScan是一个命令行工具,可以对指定目标执行各种测试,并返回 SSL/TLS 服务器接受的协议和密码套件的综合列表,以及一些在安全测试中有用的其他信息:

sslscan 10.7.7.5  

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以使用 SSLScan 的颜色代码来快速了解显示结果的安全严重性。红色(允许 SSLv3 并使用 DES 和 RC4 密码套件)表示不安全的配置,而绿色或白色表示推荐的配置。

命令的输出可以使用--xml=<filename>选项导出为 XML 文档。

使用 SSLyze 扫描 TLS/SSL 配置

SSLyze是一个 Python 工具,可以通过与之类似的方式连接到服务器来分析服务器的 SSL/TLS 配置。它可以同时扫描多个主机,并且还可以测试性能并使用客户端证书进行双向认证。以下命令在您的测试机上运行常规的 HTTPS 扫描(包括 SSL 版本 2、SSL 版本 3 和 TLS 1.0、TLS 1.1 和 TLS 1.2 检查、有关证书的基本信息以及对压缩、重新协商和 Heartbleed 的测试):

sslyze --regular 10.7.7.5  

您可以在以下截图中看到结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Nmap 测试 TLS/SSL 配置

Nmap 包含一个名为ssl-enum-ciphers的脚本,可以识别服务器支持的密码套件,并根据加密强度对其进行评级。它使用 SSLv3、TLS 1.1 和 TLS 1.2 进行多次连接。该脚本还会突出显示 SSL 实现是否容易受到之前发布的漏洞的影响,例如 CRIME 和 POODLE:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

爬取 Web 应用程序

在测试大型真实应用程序时,您需要采用更详尽的方法。作为第一步,您需要确定应用程序的大小,因为有几个决策取决于它。您所需的资源数量、工作量估计和评估成本取决于应用程序的大小。

Web 应用程序由多个相互链接的网页组成。在开始评估应用程序之前,您需要对其进行映射以确定其大小。您可以手动浏览应用程序,点击每个链接并查看内容,就像普通用户一样。在手动爬取应用程序时,您的目标应该是尽可能多地识别 Web 页面-从认证和非认证用户的角度来看。

手动爬取应用程序既耗时又容易遗漏。Kali Linux 有许多工具可用于自动化此任务。Burp Suite 中的 Burp Spider 工具以爬取 Web 应用程序而闻名。它自动化了目录中各个 Web 页面的繁琐任务。它通过请求一个 Web 页面,解析其中的链接,然后向这些新链接发送请求,直到映射所有的 Web 页面。通过这种方式,可以映射整个应用程序,而不会忽略任何 Web 页面。

注意:

由于爬虫是一个自动化的过程,因此需要了解应用程序的过程和工作方式,以避免爬虫执行敏感请求,例如密码重置、表单提交和信息删除。

Burp Spider

Burp Spider 使用被动和主动方法来映射应用程序。

当您启动 Burp Proxy 时,默认情况下它以被动爬虫模式运行。在此模式下,当浏览器配置为使用 Burp Proxy 时,它会通过代理更新站点地图,而无需发送任何进一步的请求。被动爬虫被认为是安全的,因为您可以直接控制爬取的内容。这在包含管理功能的关键应用程序中非常重要,您不希望触发这些功能。

为了有效地进行映射,应该将被动爬虫模式与主动模式一起使用。最初,允许 Burp Spider 在您浏览应用程序时被动地进行映射,当您找到需要进一步映射的感兴趣的网页时,可以触发主动爬虫模式。在主动模式下,Burp Spider 将递归请求网页,直到映射所有 URL。

以下截图显示了被动爬虫的输出,当单击应用程序中的各个链接时。在被动映射应用程序之前,请确保将 Burp 设置为 Web 浏览器中的代理,并关闭拦截:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当您想要主动爬取一个网页时,在站点地图部分右键单击链接,然后单击 Spider this branch。一旦这样做,主动爬虫模式就会启动。在 Spider 部分,您将看到已经发出的请求,并且站点地图部分将填充新项目,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当活动爬虫正在运行时,它将显示所发出的请求数量和其他一些细节。在 Spider Scope 部分,您可以使用正则表达式字符串创建规则来定义目标:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

应用程序登录

一个应用程序在允许您查看内容之前可能需要进行身份验证。Burp Spider 可以配置为在爬行应用程序时使用重新配置的凭据进行身份验证。在 Spider 部分的 Options 选项卡中,您可以定义凭据或选择 Prompt for guidance 选项。当您选择 Prompt for guidance 选项时,它将显示一个提示,您可以在其中输入用户名和密码,如果爬虫遇到登录页面,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目录暴力破解

也被称为强制浏览目录暴力破解是请求应用程序或服务器页面中没有直接链接的文件和服务器目录的过程。通常通过从常见名称列表中获取目录和文件名来完成。Kali Linux 包含一些工具来完成这个任务。我们在这里将探讨其中的两个。

DIRB

DIRB可以递归扫描目录,并在 Web 服务器中查找具有不同扩展名的文件。当不是标准的 404 错误时,它可以自动检测到Not Found代码。然后,它可以将结果导出到文本文件中,在服务器需要有效会话时使用会话 cookie,并进行基本的 HTTP 身份验证和上游代理等其他功能。下图显示了基本的 DIRB 用法,使用默认字典并将输出保存到文本文件中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ZAP 的强制浏览

DirBuster 是由 OWASP 维护的目录暴力破解工具,现已集成到 OWASP ZAP 中作为强制浏览功能。要使用它,您启动 OWASP-ZAP(在 Kali 的菜单中,转到 03 - Web Application Analysis | owasp-zap)并配置浏览器使用它作为代理;与 Burp 一样进行被动爬虫,ZAP 会注册您浏览的所有 URL 和它们从服务器请求的资源。因此,您浏览到目标并且检测到的文件和目录会记录在 ZAP 中。接下来,右键单击要进行强制浏览的目录,然后转到 Attack | Forced Browse site / Forced Browse directory / Forced Browse directory (and children)。站点、目录或目录和子目录之间的选择取决于您要扫描的内容-站点表示从服务器的根目录开始扫描,目录表示仅选择的目录,目录和子目录表示递归选择的目录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

之后,选择名称列表文件(字典)并点击开始按钮。现有的目录和文件可能会显示在同一个选项卡中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结

通过这个,我们来到了本章的结束。我们通过侦察阶段并通过扫描 Web 服务器完成了工作。在下图中,您可以查看渗透测试的侦察阶段涉及的任务以及 Kali Linux 中可用于每个任务的一些有用工具:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

侦察是渗透测试的第一阶段。当测试一个可以从互联网访问的目标时,搜索引擎和社交网络网站可以揭示有用的信息。搜索引擎存储了大量的信息,在执行黑盒渗透测试时非常有帮助。我们使用这些免费资源来识别恶意用户可能用来攻击目标的信息。Kali Linux 有几个工具可以帮助您实现目标,在本章中我们使用了其中的一些工具。

最后,我们进入了扫描阶段,这要求黑客积极与 Web 应用程序进行交互,以识别漏洞和配置错误。

在下一章中,我们将研究影响 Web 应用程序的服务器端和客户端漏洞。

第四章:身份验证和会话管理漏洞

Web 应用程序的主要目的是允许用户访问和处理存储在远程位置的信息。有时,这些信息是公开的,而其他时候可能是特定于用户甚至是机密的。这些应用程序要求用户在被允许访问此类信息之前证明其身份。这个身份验证过程称为身份验证,它要求用户提供一个身份证明,可以是以下一个或多个:

  • 用户所知道的东西:例如用户名和秘密密码

  • 用户拥有的东西:如智能卡或发送到用户手机的特殊代码

  • 用户的特征:声音、面部、指纹或任何其他生物识别机制

第一种选择是 Web 应用程序中最常见的。还有一些情况,例如银行或内部企业应用程序,可能使用剩余方法中的一个或多个。

HTTP 是一种无状态和无连接的协议。这意味着服务器将客户端发送的每个请求视为与该客户端或任何其他客户端发送的先前或将来的请求无关。因此,用户登录到 Web 应用程序后,下一个请求将被服务器视为第一个请求。因此,客户端需要在每个请求中发送他们的凭据。这为敏感信息增加了不必要的暴露和通信的不必要努力。

已经开发了许多技术,允许 Web 应用程序跟踪用户的活动并根据他们对自己环境的更改来维护应用程序的状态,并将其与其他用户的活动分开,而无需要求他们在每个操作中都登录。这被称为会话管理

在本章中,我们将回顾现代 Web 应用程序通常如何执行身份验证和会话管理,并学习如何识别和利用这些机制中最常见的一些安全漏洞。

Web 应用程序中的身份验证方案

在进入具体的渗透测试概念之前,让我们回顾一下现代 Web 应用程序中的身份验证是如何进行的。

平台认证

在使用平台认证时,用户在每个请求的头部中发送他们的凭据,使用Authorization变量。即使他们只需要提交一次凭据,浏览器或系统也会存储它们并在需要时使用。

有几种不同类型的平台认证。最常见的几种将在以下小节中讨论。

基本认证

使用这种类型的平台认证,用户名和密码会附加在Authorization头部中,并使用 base64 进行编码。这意味着任何看到请求头的人都能够将凭据解码为明文,因为 base64 编码不是一种加密格式。

以下截图显示了如何以 base64 形式发送登录信息以及如何解码它:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以使用 Burp Suite 的解码器将 base64 转换为 ASCII 文本:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摘要

摘要认证比基本认证安全得多。当客户端想要访问受保护的资源时,服务器会发送一个随机字符串,称为nonce,作为挑战。然后,客户端使用此 nonce 与用户名和密码一起计算 MD5 哈希并将其发送回服务器进行验证。

NTLM

NTLM是摘要认证的一种变体,其中使用 Windows 凭据和 NTLM 哈希算法来转换应用程序的用户名和密码的挑战。此方案需要多个请求-响应交换,并且服务器和任何中间代理必须支持持久连接。

Kerberos

此认证方案使用Kerberos协议对服务器进行身份验证。与 NTLM 一样,它不要求用户名和密码,而是使用 Windows 凭据登录。该协议使用与 Web 服务器分开的认证服务器AS),并涉及一系列的协商步骤以进行身份验证。这些步骤如下:

  1. 客户端将用户名(ID)发送给 AS。

  2. AS 在数据库中查找 ID,并使用哈希密码加密会话密钥。

  3. AS 将加密的会话密钥和包含用户 ID、会话密钥、会话过期和其他数据的票证(TGT),使用服务器的秘密密钥加密后发送给客户端。如果密码不正确,客户端将无法解密其会话密钥。

  4. 客户端解密会话密钥。

  5. 当客户端想要访问 Web 服务器上的受保护资源时,它需要在一条消息中发送 TGT 和资源 ID,并在另一条消息中使用会话密钥加密客户端 ID 和时间戳。

  6. 如果服务器能够解密接收到的信息,它将使用 AS 的秘密密钥和客户端/服务器会话密钥进行加密,进一步使用客户端的会话密钥进行加密,并以客户端到服务器的票证形式进行响应。

  7. 有了 AS 提供的这些信息,客户端现在可以向 Web 服务器请求资源。

在下图中,您可以以图形方式看到该过程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

HTTP Negotiate

也称为Windows 身份验证HTTP Negotiate方案使用 Windows 凭据,并根据 Kerberos 是否可用来选择 Kerberos 或 NTLM 身份验证。

平台认证的缺点

尽管 Kerberos 和 NTLM 方案被认为是安全的,即使在 TLS 上使用摘要或基本认证也可以降低恶意参与者拦截通信并窃取凭据的风险,但是在安全方面,平台认证仍然具有一些固有的缺点。它们如下:

  • 凭据更频繁地发送,因此它们的暴露和在中间人攻击MITM)中被捕获的风险更高,特别是对于基本、摘要和 NTLM 方案。

  • 平台认证没有注销或会话过期选项。当使用 Windows 身份验证时,由于单点登录SSO)已经启用,用户打开应用程序的主页面时会立即开始会话,而不需要用户名和密码,并且如果会话过期,它会自动续订。如果攻击者能够访问用户的计算机或 Windows 帐户,他们将立即获得对应用程序的访问权限。

  • 平台认证不适用于公共应用程序,因为与最流行的基于表单的认证相比,它们需要更高的技术和管理工作量来设置和管理。

基于表单的认证

这是我们更熟悉的一种认证方式:一个包含用户名和密码字段以及提交按钮的 HTML 表单:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此认证可能因情况而异,因为其实现完全依赖于应用程序。尽管如此,最常见的方法遵循以下步骤:

  1. 用户填写认证表单并点击提交按钮。然后,客户端(Web 浏览器)将包含用户名和密码的请求以明文形式发送到服务器,除非应用程序进行了客户端加密。

  2. 服务器接收信息并检查用户在其数据库中的存在,并比较存储的密码(或密码哈希)与提交的密码。

  3. 如果用户存在且密码正确,服务器将以肯定的消息作出回应,该消息可能包括重定向到用户的主页和会话标识符(通常作为 cookie),以便用户无需再次发送凭据。

  4. 客户端接收响应,存储会话标识符,并重定向到主页。

从渗透测试的角度来看,这无疑是最有趣的身份验证方法,因为没有标准的方法来执行它(即使有最佳实践),通常会导致许多漏洞和安全风险,因为实现不当。

双因素身份验证

如前所述,为了向应用程序证明您的身份,您必须提供您所知道的东西、您所拥有的东西或您所是的东西。这些标识符中的每一个都被称为因素多因素身份验证MFA)源于为某些应用程序提供额外的安全层,以防止未经授权的访问,例如密码被攻击者猜测或窃取的情况。

在大多数 Web 应用程序中,双因素身份验证2FA)意味着用户必须提供用户名和密码(第一个因素)以及一个特殊的代码或一次性密码OTP),该代码是由用户拥有的设备临时随机生成的,或者通过服务器通过短信或电子邮件发送给他们。然后用户将 OTP 提交给应用程序。更复杂的应用程序可能会在密码之外实现使用智能卡或某种生物识别技术,例如指纹。由于这需要用户拥有额外的硬件或专用设备,这些类型的应用程序要少得多。

大多数银行应用程序实施了一种 MFA 形式,最近,公共电子邮件服务和社交媒体开始推广并强制用户使用 2FA。

OAuth

OAuth是一种用于访问委派的开放标准。当 Facebook 或 Google 用户允许第三方应用程序访问他们的帐户时,他们不会与这些应用程序共享他们的凭据。相反,服务提供商(Google、Twitter 或 Facebook)共享一个特殊的访问令牌,允许这些应用程序检索有关用户帐户的特定信息或根据用户授权的权限访问某些功能。

会话管理机制

会话管理涉及在登录时创建或定义会话标识符,设置不活动超时时间,会话过期以及在注销时使会话无效;此外,根据用户的权限,它可能扩展到授权检查,因为会话 ID 必须与用户关联起来。

基于平台身份验证的会话

当使用平台身份验证时,最常用的方法是使用已经包含的标头来处理凭据,或者将响应作为用户会话的标识符,并通过应用程序的逻辑来管理会话过期和注销;尽管如前所述,当使用平台身份验证时,通常会发现没有会话超时、过期或注销。

如果使用 Kerberos,AS 发出的令牌已经包含会话信息,并用于管理此类会话。

会话标识符

会话标识符在表单身份验证中更常见,但在使用平台身份验证时也可能存在。会话标识符会话 ID是在每次用户在应用程序中启动会话时分配给每个用户的唯一数字或值。该值必须与用户的 ID 和密码不同。每次用户登录时,它必须是不同的,并且必须随每个请求一起发送到服务器,以便它可以区分来自不同会话/用户的请求。

在客户端和服务器之间发送会话 ID 的最常见方法是通过 cookie。一旦服务器接收到一组有效的用户名和密码,它将该登录信息与会话 ID 关联起来,并向客户端响应,将这些 ID 作为 cookie 的值发送。

在下面的屏幕截图中,您将看到一些包含会话 cookie 的服务器响应的示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在前面的示例中,一个 PHP 应用程序设置了一个名为PHPSESSID的会话 cookie。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上面的示例中,一个 Java 应用程序设置了一个名为JSESSIONID的会话 cookie。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上面的示例中,一个 ASP.NET 应用程序设置了一个名为ASP.NET_SessionId的会话 cookie。

Web 应用程序中的常见身份验证缺陷

我们花了一些时间讨论了 Web 应用程序中不同身份验证机制的工作原理。在本节中,您将学习如何识别和利用其中一些最常见的安全故障。

缺乏身份验证或错误的授权验证

在前一章中,您了解到如何使用 DIRB 和其他工具来查找可能没有在 Web 服务器上的任何页面中引用的目录和文件,或者可能包含特权功能,例如/admin/user/profile。如果您能够直接浏览到这些目录并在其中使用功能,而无需进行身份验证,或者作为标准用户进行身份验证后,您可以通过浏览到这些目录来浏览到应用程序的管理区域或修改其他用户的配置文件,那么该应用程序在身份验证和/或授权机制方面存在重大安全问题。

用户名枚举

在黑盒和灰盒渗透测试场景中,发现应用程序的有效用户列表可能是第一步之一,特别是如果这样的应用程序不是商业应用,以便您可以在线查找默认用户。

通过分析在登录、注册和密码恢复页面等地方提交用户名时的响应,可以对 Web 应用程序中的用户进行枚举。以下是一些常见的错误消息,当提交表单到这些页面时,您可以找到告诉您可以枚举用户的消息:

  • “用户 foo:无效密码”

  • “无效用户 ID”

  • “帐户已禁用”

  • “此用户未激活”

  • “无效用户”

让我们来看一个非常简单的例子,如何从一个 Web 应用程序中发现有效的用户名,当提供错误的用户名时,该应用程序会提供过多的信息。使用 IP 地址为10.7.7.5Broken Web ApplicationsBWA)虚拟机中的 OWASP WebGoat。

首先运行 Burp Suite 并配置您的浏览器以使用它作为代理(在 Firefox 中,导航到首选项 | 高级 | 网络 | 连接 | 设置):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,使用webgoat默认用户和webgoat密码登录 WebGoat,并转到 Authentication Flaws | Forgot Password:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一个需要用户名才能继续恢复过程的密码恢复表单。您可以输入一个不存在的用户名,例如nonexistentuser,并提交以查看结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用户名无效,您将无法继续进行密码恢复。您可以假设当用户有效时,您将获得不同的响应。

现在让我们使用 Burp Suite 的 Intruder 来尝试找到一个有效的用户名。首先,在 Burp Proxy 的历史记录中查找请求,并将其发送到 Intruder(按下Ctrl + I或右键单击并选择发送到 Intruder):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,切换到入侵者标签,然后切换到您的请求编号,最后切换到位置。您可以看到所有可由客户端修改的参数默认都被选中。点击清除以取消选择它们,然后只选择用户名值并点击添加:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

入侵者自动发送多个请求到服务器,用用户提供的输入替换选定的值,并记录所有响应以供分析。现在添加一个要尝试的用户名列表,而不是已提交的用户名。

Burp Intruder 有四种不同的攻击类型,描述了如何使用有效负载填充输入:

  • Sniper:这使用单个有效负载集,并逐个选择每个输入位置的值。请求的数量将是有效负载集的长度乘以输入位置的数量。

  • 撞击锤:这个方法使用一个单一的有效负载集,并同时选择所有输入位置上的每个值。请求数量将等于有效负载集的长度。

  • 草叉:这个方法使用多个输入位置,并且每个位置都需要一个有效负载集。它一次在对应的输入中提交一个有效负载集的值。请求数量将等于最短有效负载集的长度。

  • 集束炸弹:当使用多个输入时,有效负载集 1 中的所有元素将与有效负载集 2 中的所有元素配对,依此类推,直到有效负载集n。攻击中的请求数量由所有有效负载集的大小相乘确定。

接下来,在 Intruder 中切换到 Payloads 选项卡。保持有效负载集不变,点击有效负载选项[简单列表]部分的“加载…”按钮;这是为了加载包含你想尝试的名称的文件。幸运的是,Kali Linux 在/usr/share/wordlists目录中包含了大量的字典和单词列表。

在这个例子中,你将使用/usr/share/wordlists/metasploit/http_default_users.txt

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,你已经定义了带有输入位置的请求,并准备好了有效负载列表,请点击“开始攻击”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从结果中可以看出,所有尝试的名称都有相同的响应,除了一个。你会注意到admin有一个不同长度的响应,如果你查看响应的正文,你会看到它在询问密码恢复问题。所以,admin是一个有效的用户名。

用户名枚举可以在应用程序对有效和无效用户名显示不同响应时进行。此外,一些应用程序在注册新用户时会进行验证,以确保名称不重复。如果此验证在提交表单之前完成,那么有一个执行此类验证的网络服务,你可以用它进行枚举。

通过暴力破解和字典攻击来发现密码

一旦你在应用程序中确定了有效的用户,下一个自然步骤就是尝试找到这些用户的密码。有很多方法可以从用户那里获取有效密码,从模仿原始网站在不同服务器上并使用社交工程来欺骗用户提交他们的信息,到利用不安全的密码恢复机制,再到猜测密码(如果是常见密码)。

暴力破解是一种尝试所有可能的字符组合来发现有效密码的方法。当应用程序允许使用一到三个甚至四个字符的密码时,这种方法可能很有效。如果允许使用这样的密码,很有可能至少有一个用户在使用它们。

对于较长的密码,暴力破解攻击是完全不切实际的,因为在发现一个有效密码之前,你需要向应用程序发送数百万(甚至数十亿)个请求。此外,执行这种攻击所需的时间比标准的一两周的渗透测试计划要长得多(非常长)。在这种情况下,我们依靠人为因素的可预测性——即使对于实际目的来说,八个或更多字符密码的可能组合几乎是无限的,但我们人类倾向于只使用其中一小部分组合作为密码,而且最常见的密码非常常见。

为了利用这个事实,有一些包含常见或默认密码的字典,或者是已知在以前对流行网站的攻击中泄露的密码。使用这些字典,你可以减少需要尝试的次数,增加在字典中找到有效密码的机会,因为已经有很多人将其作为密码使用过。

自 2012 年以来,SplashData 每年发布一份根据被黑客和泄露密码集合进行分析得出的最常用密码列表。可以在以下链接查看 2017 年和 2016 年的结果:www.teamsid.com/worst-passwords-2017-full-list/www.teamsid.com/worst-passwords-2016/。另一个每年发布的列表是来自 Keeper 密码管理器的列表:blog.keepersecurity.com/2017/01/13/most-common-passwords-of-2016-research-study/

使用 THC Hydra 攻击基本身份验证

THC Hydra是黑客和渗透测试人员中长期以来最受欢迎的在线密码破解工具。

在线破解意味着实际进行了对服务的登录尝试。当存在安全和监控工具时,这可能会产生大量流量并在服务器上引发警报。因此,在尝试在线暴力破解或字典攻击应用程序或服务器时,你应该特别小心,并调整参数以获得最佳速度,而不会使服务器过载、引发警报或锁定用户账户。

当存在监控或在一定次数的失败尝试后账户被锁定时,进行在线攻击的一个好方法是为每个用户使用三到四个密码,或者少于锁定阈值的数量。选择最明显或最常见的密码(例如passwordadmin12345678),如果没有结果,返回侦察阶段获取更好的密码集,并在几分钟或几个小时后再次尝试。

THC Hydra 具有连接到各种服务的能力,如 FTP、SSH、Telnet 和 RDP。我们将使用它对使用基本身份验证的 HTTP 服务器进行字典攻击。

首先,你需要知道实际处理登录凭据的 URL。打开你的Kali 机器,打开 Burp Suite,并配置浏览器使用它作为代理。你将使用易受攻击的虚拟机和 WebGoat 应用程序。当你尝试访问 WebGoat 时,会弹出一个对话框要求输入登录信息。如果你提交任意随机的用户名和密码,会再次出现相同的对话框:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

即使尝试不成功,请求已经在 Burp 中注册。接下来,寻找其中一个具有Authorization: Basic头的请求:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在你知道处理登录的 URL 是http://10.7.7.5/WebGoat/attack。这已经足够运行 Hydra 了,但首先你需要有一个可能的用户名列表和一个密码列表。在实际情况下,可能的用户名和密码将取决于组织、应用程序以及你对其用户的了解。对于这个测试,你可以使用以下可能的用户列表,用于名为 WebGoat 的应用程序,并将其指定为安全测试的目标:

admin 
webgoat 
administrator 
user 
test 
testuser 

至于密码,你可以尝试一些最常见的密码,并添加应用程序名称的变体:

123456 
password 
Password1 
admin 
webgoat 
WebGoat 
qwerty 
123123 
12345678 
owasp 

将用户名列表保存为users.txt,将密码列表保存为passwords.txt。首先,运行hydra命令,不带任何参数查看帮助和执行信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以看到它需要使用-L选项添加一个用户列表文件,-P选项添加一个密码列表文件,以及协议、服务器、端口和可选信息,形式如:protocol://server:port/optional。运行以下命令:

hydra -L users.txt -P passwords.txt http-get://10.7.7.5:8080/WebGoat/attack  

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你会发现webgoat用户和webgoat密码的组合被服务器接受。

在使用 Hydra 时,一个有用的选项是使用-ensr修饰符,可以处理登录输入,发送空密码(n),将用户名作为密码(s),反转用户名并将其用作密码(r),以及-u,它首先循环用户。这意味着它尝试所有用户与单个密码,然后继续下一个密码。这可以防止您被某些防御机制锁定。

攻击基于表单的身份验证

由于没有标准的实现,并且 Web 应用程序在验证和攻击预防方面更加灵活,因此登录表单在暴力破解时面临一些特殊的挑战:

  • 用户名和密码参数中没有标准的名称、位置或格式

  • 登录尝试没有标准的负面或正面响应

  • 客户端和服务器端的验证可能会阻止某些类型的攻击或重复提交请求

  • 身份验证可能分为多个步骤,即在一个页面中询问用户名,在下一个页面中询问密码

对于渗透测试人员来说,幸运的是,大多数应用程序使用 HTML 表单的基本模式,通过 POST 请求发送用户名和密码作为参数,并在成功登录时重定向到用户的主页,如果失败,则重定向到登录页面或显示错误。现在,您将研究两种用于对此类表单执行字典攻击的方法。几乎所有基于表单的身份验证都适用相同的原则,只是在如何解释响应和所需的提交参数方面有一些修改。

使用 Burp Suite Intruder

与基本身份验证攻击一样,您首先需要识别执行实际身份验证的请求及其参数,以便攻击正确的请求。

在下面的屏幕截图中,您将在左侧看到 OWASP Bricks 中的身份验证表单(在易受攻击的虚拟系统主菜单中,转到 Bricks | 登录页面 | 登录#3),在右侧,您可以看到通过 POST 方法发送的请求。您会观察到用户名和密码参数发送到正文中,而没有授权头:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要对此登录页面进行字典攻击,您首先需要分析响应,以确定失败的登录与成功的登录有何区别:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在屏幕截图中,您可以观察到失败的响应包含“用户名或密码错误”的文本。当然,这不会出现在成功登录中。

接下来,将请求发送到 Intruder,并选择用户名和密码参数作为输入。然后,选择 Cluster bomb 作为攻击类型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,转到有效负载选项卡,选择有效负载集1,并加载包含之前使用的用户名的文件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于有效负载集2,我们还将使用之前练习中使用的密码文件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如您在此屏幕截图中所见,服务器发送了 60 个请求,因为您有 6 个用户名和 10 个可能的密码:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以在此时发起攻击,然后分析响应,并了解是否有某个登录组合成功。然而,Burp Intruder 具有一些功能,可以使您的生活更轻松,不仅适用于像这样的简单示例,还适用于攻击复杂的真实应用程序。转到选项选项卡,然后转到 Grep - Match,使 Intruder 在响应中查找某些特定的文本,以便您可以轻松识别成功的文本。点击“标记与这些表达式匹配的结果项”框,清除当前列表,并在“输入新项目”框中输入以下内容:

Wrong user name or password. 

按下Enter或点击“添加”。Intruder 将标记所有包含此消息的响应;因此,未标记的响应可能表示成功登录。如果您知道正确的登录消息,您可以寻找该消息并直接识别出一组正确的凭据:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

开始攻击,并等待结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看起来您已经找到了至少一个有效的用户名及其密码。

使用 THC Hydra

在 Hydra 支持的众多协议中,有http-get-formhttp-post-formhttps-get-formhttps-post-form,它们分别是通过GETPOST方法发送的 HTTP 和 HTTPS 登录表单。使用前面练习中的相同信息,您可以使用以下命令在 Hydra 中运行字典攻击:

hydra 10.7.7.5 http-form-post "/owaspbricks/login-3/index.php:username=^USER^&passwd=^PASS^&submit=Submit:Wrong user name or password." -L users.txt -P passwords.txt  

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可能会注意到,这种情况下的语法与您之前使用 Hydra 的语法略有不同。让我们一起来看看:

  1. 首先,您需要hydra命令和目标主机(hydra 10.7.7.5)。

  2. 然后是您要测试的协议或服务(http-form-post)。

  3. 接下来是用引号("")括起来的协议特定参数,用冒号分隔:

  4. URL(/owaspbricks/login-3/index.php

  5. 请求的主体由^USER^指示,Hydra 应该将用户名放在这里,^PASS^指示密码应该放在哪里

  6. 登录失败的消息(“用户名或密码错误。”)

  7. 最后是由-L-P指示的用户名和密码列表

密码重置功能

Web 应用程序中的另一个常见弱点是密码恢复和重置功能的实现。

由于应用程序需要用户友好,并且一些用户会忘记密码,因此应用程序需要提供一种允许这些用户重置或恢复密码的方式。为此问题提供一个安全的解决方案并不是一件容易的事情,许多开发人员可能会留下一些弱点,供渗透测试人员或攻击者利用。

恢复而不是重置

当面临用户忘记密码时该怎么办的问题时,您可以在两个主要选项之间选择:

  • 允许他们恢复旧密码

  • 允许他们重置密码

应用程序允许用户恢复旧密码,这意味着应用程序设计中存在一些安全漏洞:

  • 密码以可恢复的方式存储在数据库中,而不是使用单向哈希算法,这是存储密码的最佳实践。

  • 在服务器端代码中,客户服务代理或系统管理员可以恢复密码。攻击者也可以通过社会工程或技术利用来做到这一点。

  • 当密码通过电子邮件、电话或在网页上显示时,密码就会面临风险。中间人或旁观者可以以许多方式捕获这些信息。

常见的密码重置缺陷

应用程序常用的一种允许用户恢复或重置密码的方法是询问一个或多个问题,只有合法用户才应该知道答案。这些问题包括出生地、第一所学校、第一只宠物的名字和母亲的娘家姓。问题在于,如果应用程序提出的问题对于潜在攻击者来说并不那么机密,那么这个问题会增加,如果用户是高知名度的人物,比如名人或政治家,那么他们生活的许多细节都是公开的,这个问题就会增加。

第二层保护是不直接提供密码重置功能的访问权限,而是通过电子邮件或短信发送密码重置链接。如果在尝试重置密码时请求了此电子邮件或电话号码,那么您可以伪造此信息,将用户的号码替换为您的号码,并获取任何用户的密码重置。

如果电子邮件或电话号码经过正确验证,并且无法伪造它们,仍然存在重置链接没有正确实现的可能性。有时这些链接包含一个参数,指示 ID,比如要重置密码的用户的号码或姓名。在这种情况下,你只需要使用一个你控制的用户生成一个链接,并将该参数更改为你想要重置密码的用户之一。

另一个可能的失败是,这样的重置链接在第一次合法使用后没有失效。在这种情况下,如果攻击者以任何方式获得了这样的链接,他们可以再次访问它并重置用户的密码。

2FA 实施中的漏洞

Web 应用程序中最常见的 MFA 形式是使用随机生成的数字(四到八位数)作为 OTP,用户可以从特殊设备、移动应用程序(如 Google Authenticator、Authy、1Password 或 LastPass Authenticator)或通过服务器根据请求发送的短信或电子邮件中获取。

在渗透测试中,当存在以下条件时,你可以检测和利用这个过程中的一些实施缺陷:

  • OTP 号码不是完全随机的,可以被预测。

  • OTP 与其分配的用户没有关联。这意味着你可以为一个用户生成一个 OTP,并将其用于另一个用户。

  • 同一个密码或令牌可以多次使用。

  • OTP 提交尝试没有限制。这打开了暴力破解攻击的可能性,因为 OTP 通常是短数字字符串,更容易成功。

  • 发送 OTP(一次性密码)的时候,用户信息没有经过验证,这使得攻击者可以伪造电子邮件地址或电话号码。

  • OTP 的过期时间对于应用程序的目的来说太长了。这扩大了攻击者获取有效未使用令牌的时间窗口。

  • 新生成的 OTP 不会使之前的 OTP 失效,所以例如,如果一个用户因为网络故障而多次请求同一操作的令牌或密码(第一次尝试失败),攻击者可以使用之前的尝试来复制该操作或执行另一个接受相同令牌的操作,即使合法操作已经执行过了。

  • 依赖访问应用程序的设备。现在,人们在手机上有银行应用程序、个人电子邮件、社交网络、工作电子邮件和许多其他应用程序。因此,你应该三思而后行,是否将电子邮件、短信或移动应用作为第二因素认证。

检测和利用不正确的会话管理

如前所述,会话管理允许应用程序跟踪用户活动并验证授权条件,而无需用户每次请求时都提交凭据。这意味着如果会话管理没有正确执行,用户可能能够访问其他用户的信息或执行超出其权限级别的操作,或者外部攻击者可能会获取用户的信息和功能。

使用 Burp Sequencer 评估会话 ID 的质量

Burp Sequencer是一种统计分析工具,可以让你收集大量的值,如会话 ID,并对它们进行计算,以评估它们是否是随机生成的,或者只是混淆或编码。这在处理复杂的会话 cookie 时非常有用,因为它可以让你了解 cookie 是如何生成的,以及是否有攻击或预测的方法。

要使用 Burp Sequencer,首先需要找到设置会话 cookie 的响应。通常是成功登录的响应,带有Set-Cookie头。在下面的截图中,你可以看到设置 WebGoat 会话劫持练习的会话 cookie(WEAKID)的响应(转到 WebGoat | 会话管理缺陷 | 劫持会话):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

乍一看,响应的值可能看起来是独特且足够难以猜测的。第一部分看起来像是一个 ID,第二部分似乎是一个时间戳,可能是以纳秒为单位的过期时间。很难猜测会话何时精确地结束在哪个纳秒,对吧?嗯,正如您将看到的,这不是最好的方法。

在 Burp Proxy 的历史记录中找到该响应,右键单击它。然后,您将看到“发送到 Sequencer”选项。进入 Sequencer 后,您需要选择它所关注的响应部分:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以选择分析 cookie、表单字段或响应的自定义部分。在这种情况下,选择WEAKID cookie 并点击“开始实时捕获”。它将开始向服务器发送请求,以捕获尽可能多的不同 cookie 值。完成后,点击“立即分析”执行分析。在结果中,Sequencer 将指示分析的值是否足够随机,并且作为会话 ID 的良好选择。正如您所看到的,WEAKID是弱的并且容易预测:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是信息中随机性水平的度量。结果显示WEAKID的随机性为零,这意味着它是完全可预测的,不适合作为会话 ID 的好选择。Sequencer 还提供有关字符串中每个字节和位的分布和重要性的更详细信息。

在下面的屏幕截图中,您将看到字符分析图表。您可以看到在位置 3、4、15、16 和 18 的字符变化要比位置 0 或 5 到 13 的字符更多,后者似乎根本不变。此外,字符 0 到 4 表明是一个计数器或递增的数字,因为最后一个字符的变化比前一个字符更多,而该字符比前一个字符更多,依此类推。我们将在下一节中验证这一点:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预测会话 ID

我们已经确定了一个似乎是可预测的会话 ID。现在让我们试着找到一个有效的会话。为此,您将使用接收到 cookie 的相同请求并将其发送到 Intruder。在这种情况下,您只需要重复相同的请求几次。但是,Intruder 需要有插入点才能运行,因此在请求中添加一个头部(Test: 1),并在其值中设置插入位置:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在此测试中,您将发送 101 个请求,因此将有效负载设置为“数字”类型,从 0 递增到 100:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在转到“选项”选项卡,在“Grep-Extract”部分添加一个项目。确保选中“根据下面的选择更新配置”复选框,并仅选择 cookie 的值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击“确定”,然后点击“开始攻击”。

现在您可以在 Intruder 的结果表中看到WEAKID值,并且可以验证 cookie 值的第一部分是一个递增的顺序号,第二部分也总是递增的。这取决于请求被服务器接收的时间。如果您查看以下屏幕截图,您会发现序列中存在一些间隙:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当前活动会话的前半部分是18299。我们之所以知道这一点,是因为服务器没有给我们该值,并且我们知道它随着每个请求而增加。我们还知道第二部分是一个时间戳,并且它还取决于会话 cookie 分配的时间。因此,我们要寻找的值的第二部分必须在我们已知的两个值之间:15091545657681509154566190。由于这两个数字之间的差异很小(422),我们可以很容易地使用 Intruder 来暴力破解该值。

现在再次将相同的原始请求发送到 Intruder。这次,在其后添加一个 cookie。在JSESSIONID的值之后,添加以下内容(记得根据您的结果调整值):

; WEAKID=18299-1509154565768

选择最后四个字符,并在那里添加一个位置标记:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,在有效负载选项卡中,攻击将尝试从 5768 到 6190 的数字:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,添加一个匹配表达式,以便您清楚地知道何时获得了成功的结果。此时,您只知道未经身份验证的用户应该有的消息。您会假设经过身份验证的用户(具有有效的会话 cookie)不会被要求登录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

开始攻击,并等待 Intruder 找到一些东西。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在您有一个有效的会话 ID。要使用它,您只需要将会话 cookie 的值替换为您刚刚找到的值,并访问页面以劫持其他人的会话。我会留给您来测试。

会话固定

有时,用户提供的信息用于生成会话 ID,或者更糟糕的是,用户提供的信息成为会话 ID。当发生这种情况时,攻击者可以强制用户使用预定义的标识符,然后监视应用程序,以便在用户启动会话时进行操作。这被称为会话固定

WebGoat 有一个相对简单但非常具有说明性的演示,展示了这种漏洞(转到 WebGoat | 会话管理缺陷 | 会话固定)。我们将使用它来说明如何执行这种攻击。

  1. 第一步是将您设置为攻击者。您需要编写一封电子邮件,其中包含一个会话 ID(SID)值,该值将包含在您发送给受害者的链接中,因此请将该参数添加到链接中,例如&SID=123,以链接到 Goat Hills Financial:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

攻击者发现 Goat Hills Financial 网站使用 GET 参数来定义会话标识符,并向该机构的客户发送钓鱼邮件。

  1. 在这个练习的这一步中,您扮演受害者的角色,接收来自攻击者的电子邮件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于电子邮件看起来合法,因为它来自admin@webgoatfinancial.com,所以您点击链接,它会将您发送到登录页面,然后您相应地登录。现在有一个使用攻击者发送的参数的有效会话。

  1. 下一阶段需要攻击者登录与受害者相同的网站:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您使用 Burp Proxy 拦截请求并编辑它以包含受害者用于登录的SID参数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 现在,您已经获得了对受害者个人资料的访问权限:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在此示例中,会话 ID 的管理存在两个主要缺陷:

  • 首先,会话 ID 是通过用户提供的信息生成的,这使得攻击者更容易识别有效值并将其与现有用户关联起来。

  • 其次,一旦启动了经过身份验证的会话(例如,受害者登录后),标识符就不会更改,这就是术语“会话固定”的起源,因为攻击者能够预设会话 ID 对于受害者将具有的值,从而使其能够使用相同的值劫持受害者的经过身份验证的会话。

预防身份验证和会话攻击

Web 应用程序中的身份验证是一个难以解决的问题,迄今为止还没有找到普遍适用的解决方案。因此,在应用程序的这个领域预防漏洞在很大程度上是具体情况特定的,开发人员需要根据特定的用例和用户配置文件找到可用性和安全性之间的平衡。

我们可以说,即使是会话管理,当前的方法仍然是 HTTP 协议缺陷的变通方法。也许随着 HTML5 和 WebSockets 或类似技术的出现,您将来会有一些更好的替代方案可供使用。

尽管如此,仍然可以为身份验证和会话管理定义一些通用准则,这将帮助开发人员提高对抗攻击者的安全性,并且我们可以在寻找缺陷并向客户提出建议时将其用作参考。

身份验证准则

以下是身份验证指南的列表:

  • 用户名或用户标识符必须对每个用户是唯一的,并且不区分大小写(userUser相同)。

  • 强制执行强密码策略,禁止使用以下密码:

  • 用户名作为密码

  • 短密码(即少于八个字符)

  • 单个大小写密码,即全部小写或全部大写

  • 单个字符集,例如所有数字、所有字母,不使用特殊字符

  • 数字序列(123456,9876543210)

  • 名人、电视节目、电影或虚构人物(超人、蝙蝠侠、星球大战)

  • 公共字典中的密码,例如前 25 个最常见的密码

  • 始终使用安全协议(如 TLS)提交登录信息。

  • 不要在错误消息或响应代码中透露有关用户名的存在或有效性的信息(例如,当找不到用户时不要响应 404 代码)。

  • 为了防止暴力破解攻击,在一定数量的失败尝试后实施临时锁定:五次是一个平衡的数字,这样一个连续五次登录失败的用户将被锁定一段时间,比如二十或三十分钟。

  • 如果实现了密码重置功能,请要求提供用户名或电子邮件以及安全问题(如果有)。然后,通过注册的电子邮件或通过短信将一次性重置链接发送给用户的注册电子邮件或他们的手机。如果用户没有重置密码或在一定时间内没有重置密码,此链接必须被禁用,可能是几个小时。

  • 在实施多因素身份验证时,如果使用移动应用程序,则优先使用第三方和经过广泛测试的框架,例如 Google Authenticator 或 Authy;如果需要物理令牌或智能卡,则使用 RSA 或 Gemalto 设备。

  • 避免实施自定义或自制的加密和随机生成模块,优先选择来自知名库和框架的标准算法。

  • 在敏感任务上要求重新验证身份,例如对用户的特权更改、敏感数据删除或全局配置更改的修改。

OWASP 在其网站上有一个关于在 Web 应用程序上实施身份验证的最佳实践快速指南:www.owasp.org/index.php/Authentication_Cheat_Sheet

会话管理指南

以下是会话管理指南的列表:

  • 无论使用何种身份验证机制,始终实施会话管理并在每个页面和/或请求上验证会话。

  • 使用长、随机和唯一的会话标识符。优先使用已在主要 Web 开发语言(如 ASP.NET、PHP 和 J2EE)中实现的机制。

  • 在登录和注销时为用户生成新的会话 ID。永久使已使用的会话 ID 失效。

  • 在一段合理的不活动时间(15 到 20 分钟)后,使会话失效并注销用户。在安全性和可用性之间提供良好的平衡。

  • 始终给用户明确的注销选项,即具有注销按钮/选项。

  • 使用会话 cookie 时,请确保设置了所有安全标志:

  • 使用Secure属性来防止在非加密通信中使用会话 cookie。

  • HttpOnly属性用于防止通过脚本语言访问 cookie 值。这减少了跨站脚本XSS)攻击的影响。

  • 使用非持久性会话 cookie,不使用ExpiresMax-Age属性。

  • Path属性限制为服务器的根目录(/)或托管应用程序的特定目录。

  • SameSite属性目前仅受 Chrome 和 Opera Web 浏览器支持。这提供了额外的保护,防止外部站点将 cookie 发送到服务器,以防止信息泄露和跨站请求伪造CSRF)。

  • 将会话 ID 与用户的角色和权限关联,并在每个请求上使用它来验证授权。

关于这个主题的更深入的建议可以在 OWASP 的“会话管理备忘单”中找到,网址为www.owasp.org/index.php/Session_Management_Cheat_Sheet

总结

在本章中,我们回顾了 Web 应用程序执行用户身份验证以限制对特权资源或敏感信息的访问的不同方式,并研究了会话的维护方式,考虑到 HTTP 没有内置的会话管理功能。在当今的 Web 应用程序中,最常用的方法是基于表单的身份验证和通过 cookie 发送会话 ID。

我们还研究了身份验证和会话管理中最常见的安全故障点,攻击者如何利用内置的浏览器工具或 Kali Linux 中包含的其他工具(如 Burp Suite、OWASP ZAP 和 THC Hydra)来利用它们。

在最后一节中,我们讨论了一些最佳实践,通过要求对应用程序的所有特权组件进行身份验证,使用复杂的随机会话 ID,并强制执行强密码策略,可以预防或减轻身份验证和会话管理缺陷。这些是防止此类缺陷的一些最重要的预防和减轻技术。

在下一章中,我们将介绍最常见的注入漏洞类型,如何在渗透测试中检测和利用它们,以及修复应用程序和防止通过这些技术进行的攻击所需的措施。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值