Skip to content

Latest commit

 

History

History
419 lines (240 loc) · 44.8 KB

File metadata and controls

419 lines (240 loc) · 44.8 KB

七、注入和溢出测试

当今时代的所有网站都向用户提供动态响应,这些响应是由外部数据库通知的,或者是从 HTML 本身之外的过程推断出来的。在客户端,这通常被隔离并限制在浏览器的域对象模型DOM)空间内,但在服务器上,这些交织过程的种类和范围变得非常难以管理。由于所有典型企业的防御都经过了调整,允许应用绑定的流量进入 web 层,而 web 层又被信任访问应用和数据库层,黑客已经学会了将 web 层变成他们的傀儡。网络层在不知不觉中成为了内部威胁,随之而来的是所有特权访问和信任关系。

注入是破坏客户机-服务器连接的一种强大而常见的形式,可用于公开意外信息以及影响应用本身的性能。XSS 攻击的重点是注入脚本以诱使客户端执行攻击者的命令,而其他注入类型的攻击则是直接跟踪后端数据。当我们测试或攻击一个 web 应用时,破坏用户的主机是有用的,但是大量的服务器端注入可以诱使 web 应用直接进行黑客的投标。这些注入攻击因应用而异,但利用 web 应用验证用户输入和掩盖错误处理能力中的弱点。攻击者受到许多结果的驱使,但除了窃取应用背后的数据或知识产权之外,还会产生更具破坏性的结果�� 破坏或损坏数据,破坏应用的可用性,并破坏其在用户及其服务公司中的信任状态。

注射剂最令人担忧的方面是,它们易于实现,而且大量网站易受攻击。快速浏览一下谷歌黑客数据库GHDB)或Shodan.io可以很容易地暴露出数百万缺乏保护的服务器。

我们当然应该粗略地看看这些开源智能OSIT)存储库,因为黑帽黑客肯定在使用它们。使用Burp SuiteZed Access ProxyZAP)、Arachni和其他工具进行聚焦扫描,可以帮助我们发现特定目标中更广泛的潜在问题,门户网站本身的一些智能实践也可以。结构化查询语言SQL)、可扩展标记语言XML路径语言XPath)、轻量级目录访问协议LDAP)、命令/可执行文件、以及超文本传输协议HTTP注入)是最常见的威胁,但其影响和位置各不相同。

在本章中,我们将了解并实施每种主要类型的注入和输入操纵攻击,并学习如何使用多种工具来识别漏洞并利用其弱点。

本章将帮助我们:

  • 针对各种数据库(包括 SQL、Oracle 和 LDAP)发现并测试各种形式的注入(盲注入、经典注入、复合注入)
  • 了解执行代码注入以导致堆栈、缓冲区和堆溢出的需要
  • 学习进行 HTTP 动词篡改和参数污染
  • 了解如何从列表中选择并使用正确的工具,包括 recon ng、BBQSQL、SQLMap、SQLninja 和其他工具

给你的测试注入一些乐趣


注入攻击数量众多,但由于它们都插入了已知将被传输到应用或数据库层以供执行的代码,因此它们的影响使注入在 OWASP 前 10 名中排名第一。我们将在这里介绍大型门户,但要知道扫描和测试方法非常相似,因为我们将利用自动化来探测每个门户的弱点迹象,并针对任何潜在缺陷传递基于最佳实践的字符串进行测试。在我们进入注射品种之前,退一步看看 OWASP 是如何描述它们的。下面的屏幕截图来自于他们最新发布的OWASP 2017前 10名单的候选版本 https://github.com/OWASP/Top10/blob/master/2017/OWASP%20Top%2010%20-%202017%20RC1-English.pdf

OWASP 的注入攻击特性。

OWASP 对这些攻击的担忧是多方面的,但黑客对它们的易用性及其潜在影响使它们成为应用开发人员的严重担忧。网络技术严重依赖于动态内容,这使得这种依赖成为黑客们的共同目标,因为他们知道动态方面使他们具备了注入的条件。下表可以帮助我们了解每次攻击的基本范围、相对难度以及发现攻击的典型弱点:

| **注射式** | **检测难度** | **开发难度** | **潜在影响** | **最终目标/受影响组件** | | **SQL 注入** | 硬的�� 失明的简单-经典 | 中等的 | 非常严重 | 数据库枚举 SQL 支持的框架 Oracle 应用 | | **XML(XPath)注入** | 适度的 | 容易的 | 不好的 | XML 存储数据枚举、损坏、数据销毁 | | **LDAP 注入** | 很容易 | 容易的 | 中等(不同) | 凭据,通常用于升级或生成新帐户 | | **命令注入** | 坚固的 | 中等的 | 非常严重 | 应用层滑入命令以运行恶意代码进行破坏性操作或横向移动 | | **缓冲区溢出** | 中等的 | 中等的 | 非常严重 | 应用层针对破坏性方式或横向移动执行恶意代码的 Repoint 指令 | | **HTTP 注入** | 容易的 | 很容易 | 低的 | Web 或应用层强制执行 Web 服务器或应用内部的功能 |

SQL 有什么好处吗?


随着注入的进行,SQL 注入SQLI是球的美女。虽然 SQL 数据库技术之间存在差异,但大多数都订阅了一个共同的语法基础(由美国国家标准研究所 O.T.5 席)定义。,词汇表和组织,这使得学习和适应新数据库变得简单而高效。它用于关系数据库,是现代数据库操作的主力,负责存储、操作和查询来自相邻应用或接口的数据库。有许多免费资源值得为了更好地理解 SQL,万维网联盟的网站(【T10)】https://www.w3schools.com/sql/ 这是一个美妙的开始�� 我们不会深入探讨底层语言。

从统计上讲,98%以上的 web 应用都有包含用户所需信息的数据库支持。其中,SQL 变体是目前最流行的。这些相同的方面使得黑客很容易使用常见的查询和技巧库来检测和利用这些数据库。

但是,不要让这些统计数据和潜在影响蒙蔽了你:SQLI 攻击非常猖獗,而且每年都在增加,尽管它们受到了关注,并且可以采取基本的预防措施来消除或大幅降低它们在应用中的潜力。正如我们将在这里看到的,揭示和利用 SQL 注入漏洞是一项相对容易的任务。

DBs 的速成班坏了

关系数据库提供了一个类似于表的框架,在其中存储数据。SQL 是我们读取和写入这些表的语法,网站可以允许用户通过构建查询并随后显示结果来呈现有用的数据。会出什么问题?

嗯,许多数据库是由系统管理员或工程师实例化的,他们没有特定数据库技术的背景。很可能你的技术恐惧症亲戚甚至在他们自己的个人电脑上安装了数据库作为应用的底层组件。在较大的应用中嵌入数据库的人,在没有深入研究数据库的详细强化的情况下,这样做的可能性同样高。在嵌入父应用之前,默认管理员帐户、端口等简单的事情并不总是被清理干净。在没有以数据库为中心的人员的组织中,web 应用数据库也会出现同样的问题。

Web 应用向用户征求查询并将其传递到数据库的方式各不相同。许多使用PHP 超文本预处理器PHP)的动态内容通过统一请求定位器URL)字符串传递查询,因此很容易出于我们自己的目的进行修改,同时避免有意义的验证。其他网站通过限制用户通过下拉列表、单选按钮和复选框中预先封装的组件构建搜索来强制执行和清理底层 SQL 查询。这些限制性的查询构建方法更难利用,建议尽可能用于安全的应用开发。

下面的屏幕截图显示了这一过程的高级视图。

SQL 注入攻击剖析

SQLI 的类型

考虑到 SQL 的多样性以及有多少种实现方式,很自然会有一些不同的方式来实现 SQLI。与 XSS 一样,我们可以通过两种方式来看待这一点,但 SQLI 可能会有很大的不同,因此可以用不同的方式来描述。与 XSS 一样,我们可以通过查看一些告诉或特征来区分 SQLI:

  • SQLI 的交付方式(通过表单、下拉列表、cookie 操作、URL mods 等)
  • 我们首先提交的输入类型(字符串与值)
  • 我们如何接收回数据(也称为数据提取通道)
  • 如何构建响应(返回错误或以其他方式隐藏任何错误)
  • 影响应用或数据库以获得结果所需的查询数

我们不会详尽地介绍所有这些类别,但我们将讨论 go-to 类型以及它们如何适合上述类别。此外,我将展示一些使用我们可靠的 OWASP破损的 Web 应用BWA虚拟机VM)的示例,我们将看到如何依次处理每一个类别,无论是在实际的注入技术中,还是使用能够自动化其使用的工具。

带内或经典 SQLI

带内 SQLI是 SQLI 最简单、最常见的模式,通常被称为经典 SQLI类型。频带内更好地描述了攻击的执行方式。带内 SQLI 包括通过同一通道发起攻击(恶意 SQL 查询)和接收响应(该查询的结果)。黑客可以通过几种方式使用这些攻击。

  • 基于错误的 SQLI:黑客可以用字符串来探测应用,这些字符串意味着从反映网站结构和策略的响应中出错,但可以帮助绘制和枚举应用正在使用的数据库。下面的 Mutillidae 示例显示了一条语句,当在请求中注入该语句时,将导致一个详细的错误,这实际上可以告诉我们下面的信息:
username=''' AND (SELECT 6803 FROM(SELECT COUNT(*),CONCAT(0x71627a6271,(SELECT (ELT(6803=6803,1))),0x716a7a7a71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)-- sFFK&password=''&login-php-submit-button=Login 
  • 基于 Union 的 SQLI:在一种更为外科手术的方法中,黑客(我们)可能已经确定了数据库的范围,现在将寻求将单独的语句(使用Union语句)组合成单个请求,以诱使应用产生意外结果。通过这样做,他们可以使用应用更期望的东西来承载探测查询,并且在返回结果时,实际上放弃了商品!

盲 SQLI

盲 SQLI就像儿时游戏的数据库版本【热还是冷】。如果你从未玩过,隐藏玩具的孩子会向搜索者提供提示,当搜索者靠近时,他会以不同程度的热情说,当他们远离隐藏的目标时,他会说。盲目的 SQLI 也是如此:当一个数据库不只是为您解释它,而应用开发人员隐藏错误细节时,您有时可以通过推断答案并询问正确的对或错问题来获取所有信息。当然,通过一种经典的 SQLI 模式直接获取数据会更容易,但是,通过使用查询作为一种真/假探测,黑客可以系统地枚举数据库,而无需返回一条数据。也就是说,有两种主要类型的盲 SQLI。

  • 基于内容的盲 SQLI:在这种类型的 SQLI 中,黑客试图使用查询来推断数据库中是否存在数据类型、条目或结构,方法是查看应用是否回退错误,或根据真或假条件回退不同的错误。Mutillidae 应用中的 MySQL 示例如下所示:
username=-1419' OR 7078=7078#&password=''&login-php-submit-button=Login 
  • 基于时间的盲 SQLI:盲 SQLI 的另一种形式有助于克服 web 层通过在查询中操作基于时间的命令进行的任何错误筛选。当我们将一个基于时间的命令与一个布尔(也称为条件)查询相结合,并注意到在观察指定的时间后错误被回退时,这现在成为我们的真/假试金石测试。SQL 有一些等待和睡眠语句,有时被接受;当与数据库可能不希望返回直接答案的查询相结合时,延迟可能是我们枚举内容所需的所有答案。示例如下所示:
username=''' AND 9120=BENCHMARK(25000000,MD5(0x6b4e4344))-- yHeA&password=''&login-php-submit-button=Login 

无论您如何处理盲 SQLI,它都是相当劳动密集型的,而不是您希望在现实世界中手动完成的事情;使用真/假测试查找表中的每个字母,并逐步遍历整个字母表,对于高性能计算来说是一项很好的工作,而不是人工操作。因此,建议您仅在没有其他选项时尝试盲 SQLI。SQLMap 和 SQLninja 等工具可以帮助实现自动化,但正如我们将很快看到的,盲目的 SQLI 扫描可能是一个漫长的过程。

堆叠或复合 SQLI

一旦您了解了经典和盲 SQLI 方法,就不需要太多的时间就可以理解如何生成复合语句并将多个请求堆叠在一起,从而不仅映射目标的数据库,还可以操纵、破坏或销毁存储的数据,并最终在数据库上运行代码。例如,您可以将基于 union 的数据提取 SQLI 与紧跟其后的命令配对,以从源表中删除数据。Netsparkerhttps://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/五尾猴http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet 两者都提供了备忘单,非常好地介绍了堆叠 SQLI 在多种数据库类型中用于善(或恶)的多种方法。在这里造成危害的可能性是巨大的,因此使用 Kali 提供的标准工具(或其他动态应用安全测试DAST套件)进行扫描和测试比设计您自己的漏洞更可取。

SQLI 工具学校

既然我们知道了如何判断每种 SQLI 注入类型对其目标做了什么,以及它如何帮助黑客,那么我们需要有一些方法来实际检测和利用这些漏洞。正如我们所看到的,注入攻击具有相当广泛的实现和影响,并且正如您可能预期的那样,有大量工具可以满足笔测试人员和黑客的需求。然而,我的目标是为您提供一个坚实的基础工具,可以在任何地方提供覆盖,并在需要的时候学习和专业化。在本节中,我们将看到如何使用 SQLMap、BBQSQL、SQLNinja 和一些好的老式浏览器魔术来识别和利用 SQLI vulns。

通过浏览器的老式 SQLI

除了开玩笑,经验丰富的黑客会为所有潜在的页面托管表单编写脚本到 spider 应用,然后访问每个应用来修补它们,并了解 SQLI 是否可行。扫描工具非常有趣,但没有什么比只使用浏览器获取访问权限、提升权限或呈现敏感数据更能说明攻击对客户的严重程度了。例如,如果我们想尝试引导页面显示其查询语法,我们可能会强制执行一个错误,如下面的屏幕截图所示,其中数据库试图告诉我们如何更正它:

强制执行 SQL 错误

当我们点击**Login**按钮时,我们有用的数据库溢出了 bean,我们准确地意识到我们试图攻击的查询是什么,如下面的屏幕截图所示:

SQL 错误非常有用!

最后,我们要处理的查询只是在名为accounts的表中的一个名为username的字段后面:

SELECT username FROM accounts WHERE username=''' 

看看这个简单的查询,并应用从 SQLI 备忘单或语法的实际学术知识中收集到的一些 SQL 知识,很明显,这个查询成功地打破了我们的查询,作为下一步,我们应该尝试欺骗有效的用户名并尝试跳过密码。我们可以通过输入一个新字符串来实现这一点,' or 1=1 -- 将使用逻辑操作来确保用户名存在,带有尾随空格的双连字符告诉 SQL 跳过以下字段;在这种情况下,它可以方便地跳过我们讨厌的密码字段。在用户名字段中输入该字符串时,新查询如下所示:

SELECT username FROM accounts WHERE username='' or 1=1 -- ' 

这一点 SQL 知识让我们这次取得了相当关键的胜利:我们现在以管理员身份登录,如以下屏幕截图所示:

SQLI 如此令人恐惧的原因。

我想我们都同意这很方便�� 故意易受攻击的 Mutillidae 应用是一个易受攻击的应用。返回 Admin 的原因是,与大多数未加固的数据库一样,Admin 用户是用户数据库中的第一个条目。然而,现实世界中的 SQLI 可能就这么简单,假设黑客拥有深入的 SQL 知识,并且愿意修补和解释 web 应用所返回的错误。Firebug Firefox 浏览器插件(是一个非常有用的工具 https://addons.mozilla.org/en-US/firefox/addon/firebug/ ),它可以帮助您公开密码字段,并帮助注入 SQL 查询,即使在通常不清楚的字段中也是如此。如果您有很多其他任务要处理,并且无法承担实际操作时间,那么有一些有用的工具可以迭代这些查询并为我们解释响应。

使用 SQLMap 进行升级

让我们来看看我们已经熟悉的工具,Burp Suite,可以用来提供迦梨在 SQLI 的最古老的工具之一,即 ToL0t.SqLMAP,OTT1,以帮助检查各种 SQL 语言。只是一个警告�� 虽然 Burp 和工具一样快速和通用,但 SQLMap 需要很长时间才能完成它的许多测试。本章的测试运行在一个增强的虚拟机(4 核,8GB 内存)上花费了 10 多个小时,但是等待是值得的。让我们看看这个过程是如何工作的。

首先,我们需要清理蜘蛛网,启动 BurpSuite,使其成为我们的代理,并允许它拦截我们的请求。完成后,我们可以浏览到我们一直选择的登录页面,输入一些来宾凭据,并在我们的**Proxy选项卡和Intercept**子选项卡中捕获请求(如下面的屏幕截图所示)。请注意,这会在最后一行中拾取错误的凭据,以及 SQLMap 可能需要执行其工作的其他重要格式和语法详细信息:

捕获我们的请求。

方便的是,Burp Suite 允许我们直接将其保存到一个文件中供 SQLMap 使用(如下面的屏幕截图所示):

正在保存要使用的 SQLMap 请求。

使用您最喜欢的编辑器(nano在我的例子中),您可以将凭证字段分别更改为两个单引号,如以下屏幕截图所示:

在将请求传递给 SQLMap 之前编辑请求。

现在您可以执行SQLMap并将您的响应文件传递给它,还可以使用SQLMap命令设置您感兴趣的任何其他选项:

SQLMap -r mutillidae_SQLMap.req --threads=10 �b �-time-sec 10 

现在我们应该看到SQLMap像下面的屏幕截图所示,测试各种漏洞,并从 SQL 的角度为我们找到目标。

SQLMap 测试正在进行中。

我们需要回答出现的一些问题,但在这些实践场景中,通常可以对所有问题都回答“是”。经过长时间、高强度的扫描后,SQLMap将对其认为应用可能易受影响的注入进行总结,然后对数据库和 web 应用本身进行描述,如以下屏幕截图所示:

SQLMap 的输出显示 SQLI 类型和服务器信息。

您可能会认识到我前面提供的注入点,它们是本章前面部分类型的示例。这些可以通过 Burp 或 ZAP 直接插入请求并立即验证。

用 BBQSQL 编写一些菜单驱动的 SQLI

SQLMap 是一个用于彻底发现的伟大工具,但有时您渴望使用菜单驱动的方法来实际利用某些特定的东西,特别是围绕盲目的 SQLI。如果您不是 SQL 专家,但知道需要从某个主机模拟特定的漏洞利用,则可以使用BBQSQL自定义盲 SQLI 漏洞利用 https://github.com/Neohapsis/bbqsql )由 Neohapsis 开发的工具(现在是 Cisco 的一部分)。如果你是社会工程工具包集合的忠实粉丝,并且你想快速利用盲 SQLI,那么 BBQSQL 适合你!让我们来看看如何配置它,并将其用于您自己的目的。

要启动 BBQSQL,我们不需要捕获请求以进行有效分析,但复制测试请求以帮助组织攻击是有帮助的。我们可以通过 GUI 快捷方式或在 CLI 上使用bbqsql启动它。开始页面(如下屏幕截图所示)对于设置用户来说非常熟悉,这有助于我们更轻松地启动和运行:

BBQSQL 启动菜单(蓝色轮廓)。

逐步浏览每个菜单(参见下面的屏幕截图),大多数基本参数都在 HTTP 选项中。在这里,我们可以输入 URL、任何输入字段、自定义代理以及我们可能想要使用的任何代理信息。

BBQSQL HTTP 菜单。

BBQSQL 特定参数是 BBQSQL 引擎的核心。重要或最基本的选择如下:

  • 技术:定义这是一个真/假测试(binary_search还是一个基于频率/时间的测试,用于统计发生次数(frequency_search
  • 比较属性:这就是我们告诉 BBQSQL 要查找的内容,它将用于区分真假。可以使用大小、文本字符串、值和许多其他类型的比较。
  • 并发:BBQSQL 的速度是其支持的并发性的直接结果,与其他方法相比,它能够以惊人的速度发现数据库内容。
  • Hooks 文件:您可以使用 Hooks 来修饰攻击,这是一种改变游戏规则的 Python 定义的功能,在其他工具中是看不到的,因为它们允许在发送注入请求的过程中可能需要进行的各种操作,如加密、循环、编码或掩蔽。
  • 查询:当其他 SQLI 工具处理每个数据库平台的细节时,BBQSQL 反而选择伪代码,以允许您手工开发跨 SQL 类型的漏洞,甚至跨 Oracle。这些查询可以用于 URL、cookie 或数据本身(请参见以下屏幕截图)。

BBQSQL 选项菜单。

我强烈建议不仅针对 Mutillidae 应用练习,而且针对 OWASP BWA VM 上提供的其他应用练习,例如该死的易受攻击的 Web 应用DVWA)或中新发布的应用 http://www.vulnhub.com

对于基于 Microsoft SQL 的项目,另一个值得研究的工具是SQLninjahttp://sqlninja.sourceforge.net/index.html ),一种基于 Perl 的工具,可在 Kali Linux 中使用。SQLninja 在基于其他工具的检测结果开发和注入特定数据库子集方面做得非常出色。由于该工具的范围较窄,我们没有在这里介绍它,但是对于目标数据库基于 Microsoft 的那些工作,它是非常宝贵的!

SQLI 与 Oracle 走上高端

如果说 SQL 注入是最常见和最容易实现的,那么 Oracle 注入就是它们丰富而独特的近亲。Oracle 数据库需要比其更常见和更广泛的 SQL 亲属更高的许可成本和更高的知识。这使它们只能使用更昂贵的 web 应用解决方案,因此,大型企业或愿意为更大的固有可扩展性和企业级支持付费的企业最常遇到这些问题。

毫无疑问,Oracle 注入攻击值得知道,或者放在您的工具箱中。为什么呢?如果扫描返回的结果将 Oracle 识别为底层数据库框架,则可能会公布其内容的更高价值。考虑到 Oracle 数据库所拥有的价值,建立和维护这些数据库的费用通常是合理的:Oracle 数据库拥有一些非常敏感和有价值的信息。因此,虽然我们将更常见地看到 SQL 注入,但学习 Oracle 风格并确保在机会出现时做好准备只需很少的努力。请放心,我们的黑帽对手正在寻找进入应用的相同路径,因此我们最好击败他们!

BBQSQL、SQLMap 和其他都提供了 Oracle 模块或扩展,以确保它们也能被覆盖。黑客 MySQL、PostgreSQL 和其他程序中使用的相同过程在 Oracle 中可用。Oracle 还使用了大部分 ANSI 指令集,因此尽管结构上的差异值得注意,但这些工具应该能够提供帮助。

X 因子 XML 和 XPath 注入


一些应用开发人员正在避开 SQL,而使用 XML 编写新的、基于开放标准的数据结构。为什么会有人选择这个?由 SQL 组成的关系数据库无疑利用了一种非常稳定、成熟的技术,但有时具有多个关系索引的数据在 XML 中呈现和存储时会更加紧凑。这需要与数据库层的性能相平衡。关系数据库区分变量类型,这意味着它们可以根据变量类型是字符串、整数、布尔值还是其他类型,对这些类型进行优化处理。XML 将所有内容都视为一个文本字符串,因此应用层的负担是梳理存储的数据,并使用更复杂的逻辑和处理开销进行操作。没有百分之百正确的答案�� 将对这些因素进行称重,以确定每种应用所需的混合物。

当涉及到与该数据交互时,可以使用 XML 本身,或者使用XML 路径语言XPath)向存储的数据传递类似 SQL 的命令、请求和操作。XML 从来就不是一种真正的数据存储技术,而是一种传输/交付标准。如果我们所针对的 web 应用将大部分时间用于使用 SQL 来提取或操作数据,那么它只需转换并创建数据的 XML 表示,那么,仅仅在整个过程中使用 XML 可能是一个巨大的帮助。好消息是,我们也有很多可用于 XML 的工具。Burp Suite 和 OWASP ZAP 将检测一些 XML 注入缺陷,与 SQLI 一样,浏览器或 XML 查看器可以在很大程度上帮助解决这一问题。

XML 注入

XML 注入通常会将数据填充到 XML 元素中,无论是在其节点属性节点值还是CDATA字段中。在下面的片段中,我们看到了一个简单的条目,我可能会购买一些东西,但我很想更便宜(这是一个模拟场景,我总是为我的饮料支付合理的价格):

<catalog>
   <item id="607">
       <brand>Russian River</brand>
       <beer>Pliney the Elder, 12 oz.</beer>
       <price>8.99</price>
   </item>
</catalog>

现在,如果我对为此付费不感兴趣,或者想让它免费,我可以通过 XML 交付一个有效负载,稍微改变一下游戏。下面是我可能填充到服务器 XML 文件中的有效负载:

3.99</price></item><item id="608"><brand> Russian River</brand><beer>Pliney the Younger, 16 oz.</beer><price>3.99

这给了我最终的代码,当然:

<catalog>
   <item id="607">
       <brand>Russian River</brand>
       <beer>Pliney the Elder, 12 oz.</beer>
       <price>3.99</price>
   </item>
   <item id="608">
       <brand> Russian River</brand>
       <beer>Pliney the Younger, 16 oz.</beer>
       <price>3.99</price>
   </item>
</catalog>

事实上,通过普通的旧 XML 到生产服务器获得这种访问是不太可能的。这也意味着在 XML 注入中没有很多 KALI 托管的工具,但是基础是坚实的,以了解什么是更真实的可能性,服务器使用 XPath 来操纵后端的 XML。

注射

XPath是当 XML 爱好者嫉妒 SQL 并发明了自己的查询语言时会发生的事情。好消息是(对于黑客来说)XPath 具有要么全有,要么全无的含义,如果你获得了一些访问权,你就得到了一切!对不起,XML 的人,当你试图让一个标准做得太多时,就会发生这种情况。与 SQL 不同,XPath 缺少细粒度的访问控制,因此没有权限层可供导航,如果可以枚举一个字符,就知道可以捕获所有字符。希望我们的目标开发人员能够理解这些权衡,并通过其他方式实施保护,以防止访问或验证所有事务。

一旦在 SQLI 中有了这个基础,XPath 注入就非常简单了。我们正在寻找转义字符,它们要么暴露逻辑,要么更好,让我们完全访问。让我们首先进入坏掉的 Web 应用BWAPP)**XML/XPath Injection (Login Form)**bug 页面,打开我们的门户,我将在下面的截图中展示如何找到它。这个 VM 包含在我们一直使用的同一个 OWASP BWA 中。您可能也注意到了这一点,但说得很明显,OWASP BWA VM 是 Kali 之外唯一最重要的培训工具,而且是免费的!

查找损坏的 Web 应用 XPath 注入页面

如果我们只需再次使用单引号字符并观察任何错误(如以下屏幕截图所示),就可以测试潜在 XPath 注入是否缺少输入验证:

指示可能存在 XPath 注入的错误

我们将在**LoginPassword**字段中使用' or '1'='1的 XPath 变体,而不是我们在 SQL 中看到的' or 1=1 -â��字符串,它告诉 XPath 查询*请查找此转义字符,因为 1 等于 1,所以我们是合法的!*我们希望正在进行验证以清理这些输入,但令人难以置信的是,当在下面的屏幕截图中使用此字符串时,有多少服务器会像下面这样成功登录:

使用 XPath 注入登录

仅使用一个浏览器就可以很好地理解这个过程,但如果让一个工具提供帮助,您还可以做更多的事情。Recon ng是一款出色的 CLI 工具,它提供了类似于 Metasploit 或 Websploit 的菜单结构,再加上xpath_bruter模块(由 Tim Tomes 完美管理),有助于为主机枚举自动交付盲 XPath 注入有效负载。我们还将与 Burp Suite 合作,这样我们就可以获得所需的输入。因此,启用代理,系上安全带,准备主宰 BWAPP!下面的屏幕截图中,我们先来看看recon-ng需要我们做什么:

侦察 ng 的 XPath_Bruter 模块

让我们假设我们是 OSIT 忍者,也许我们做了一点社会工程,发现 Thor 是一个用户,他有一个相当天真的密码 Asgard。我们可以使用这一组凭据来设置我们的盲目 XPath 注入。从前面的show options命令的输出中,您可以看到我们需要一些东西来开始。下面的屏幕截图突出显示了我们所需的大部分字段。

我们的打嗝套件捕获到种子侦察

首先,我们将获取基本 URL(红色)。然后需要参数字段,它是 URL 字符串的一部分,我们将强制枚举数据(绿色)。我们将使用 login 参数在 true 和 false 之间切换。假设您现在能够拦截所有请求,您应该会看到此门户使用 HTTP GET 消息提交查询(如蓝色所示),这意味着查询嵌入到发送到服务器的 URL 中。最后,这个特定的门户使用 cookies,因此我们可以粘贴整个字符串(紫色)。

侦察 ng 的XPath-Bruter模块将想知道所有这些,它还想知道我们如何区分真假(变量string。因此,如果我输入我知道的真实凭证(我们的真实情况),我会得到 Thor 的秘密消息,这样我就可以使用单词Earth作为我的字符串。如果我使用已知的 false(在撰写本书时,1 肯定不等于 2)执行布尔and条件,该字符串将不会显示

因此,让我们输入这些变量,将 Burp 和代理配置从循环中移除,并执行蛮力攻击!我们将在几分钟内看到枚举的内容,如以下屏幕截图所示:heroes.xml文件包含所有用户帐户的全部内容:

recon ng 的 xpath_bruter 模块中的枚举 XML

您会发现其他注入工具也遵循类似的方法。检测技术围绕着寻找有助于暴露缺陷的字符串的试错过程,而漏洞利用(道德黑客)通常集中在枚举上。黑帽黑客可能使用其中一些工具来实际破坏、操纵或破坏数据,但他们通常使用自定义 Python 或 Ruby 脚本来执行这些恶意攻击,或者利用 Dark Web 上提供的框架。用于更高级的基于 CLI 的注入测试的更好工具之一是 Wapiti(http://wapiti.sourceforge.net/ ),因为它可以帮助 SQL 和 XPath 注入,支持大量命令行开关、选项和用例。

绝地武士的智力把戏


数据库管理员、分析专家和数据科学家获得巨额报酬,帮助构建、管理和提供对各种数据库类型数据的访问,这是理所当然的。但即使一个应用没有使用这种技术,或者一个企业没有直接投资于这些数据库类型,我敢打赌,他们都安装了一个对其内部工作更为重要的数据库——凭证数据库。客户在使用Microsoft Active DirectoryAD)、轻量级目录应用协议LDAP)的众多版本之一,或其他身份管理系统IMS)时,有一个底层数据库正在等待测试。

凭证数据库黑客可能有不同的目标。最简单的方法是找到合法用户的帐户,允许黑客冒充用户并访问敏感信息。其他人将寻找可能未被禁用或隐藏的默认帐户,然后可以不受惩罚地使用这些帐户来执行特权访问、管理功能,甚至创建新的影子帐户,这些帐户可以用作后门,并为以后的尝试保护最初受损的帐户。LDAP 查询,如 SQL 和 XPath,有自己的语法;与其他注入类型一样,无法清理数据的易受攻击查询也会使用转义字符,这些转义字符可以强制登录或快速升级权限。幸运的是,LDAP 的使用更加具体,因此,与其他类型的注入相比,它有一套更简单的手动测试技术。另一方面,Kali 发行版上没有专门针对 LDAP 注入扫描或漏洞利用的广泛使用的工具。Burp Suite 可以提供一些检测和一般注入帮助,但有关更多信息,请参阅 OWASP 关于 LDAP 注入的指南:https://www.owasp.org/index.php/Testing_for_LDAP_Injection_(OTG-INPVAL-006)

超越说服力�� 注射行刑


好了,我们玩完了。也许攻击者认为某个网站对他们没有任何价值,但他们还是想拒绝合法用户使用它的功能。也许他们正在寻找这个应用,并希望将其关闭,使应用所有者束手无策。或者更糟糕的是,也许他们只是利用这个网站进入另一个网站,并在损害他们希望影响或横向移动到另一个应用的应用。无论动机如何,有一类注入攻击的目的不仅仅是说服应用说出它的秘密;相反,他们希望说服服务器运行新代码或执行应用开发人员无意使用或允许的命令。

我们需要在坏人之前找到这些攻击。毫无疑问,数据泄漏是一个巨大的问题,但是服务器本身的完全崩溃或长期危害威胁到应用的存在以及依赖它的公司。

代码注入

代码注入用于实现所谓的缓冲区溢出攻击。这些攻击的重点不是显示漏洞存在的弹出消息,而是利用应用安全验证中的这些漏洞来执行任意代码,从而允许攻击者接管其目标,或将受损的服务器用作进入环境的轴心。简单地说,如果一个网站运行在 PHP 或 ASP 上,并通过 URL 查询传递信息,您只需在我们页面的源代码中识别指示字符串,表明页面重定向已被接受,即可查找代码注入缺陷:

/bWAPP/phpi.php?message=test

虽然这是一个非常良性的测试路径(我们不想造成伤害),但我们可以通过更改消息并为客户捕获结果来利用该漏洞。如果有可能通过一条简单的消息改变 web 服务器的行为,black hat 黑客将试图使用标准 PHP 函数在该服务器上运行真正恶意的东西,试图颠覆或接管 web 服务器本身。

我使用以下字符串修改消息以显示负责人,结果显示在以下屏幕截图中:

http://172.16.30.129/bWAPP/phpi.php?message=MikeRules

成功的代码注入

充满乐趣

有几种形式的代码注入会导致缓冲区溢出,每种形式都侧重于攻击底层 web 或应用层服务器或应用本身中的不同服务。管理库的广泛重用的开发人员通常不会注意到众所周知的溢出攻击,因此可能不了解漏洞的存在。即使存在这种潜在的问题,我们对这些问题的了解也更多,因此我们必须鼓励我们的客户在修补和配置管理方面保持高度警惕。然而,他们自己的自定义代码和他们选择的编程语言缺乏这种程度的仔细检查,因此如果我们不帮助测试他们的应用,他们将很容易受到相同类型的攻击,但通过唯一的向量。

我们将在 WebPen 测试圈中讨论的常见类别有堆栈、堆、格式字符串、Unicode 和整数类型。

  • 堆栈溢出是一种比较常用的形式,当使用诸如 C++或 ASP.NET 之类的松散类型的语言时,开发人员无法实现阿纳尔输入验证和/或堆栈完整性检查(也被称为金丝雀值)。由于没有对用户输入的类型或大小进行验证,攻击者使用该方法向堆栈中注入更长的字符串,然后执行堆栈覆盖相邻的内存空间,从而允许恶意代码找到一个归宿;现在调用的函数指向恶意代码内存空间的顶部。

一些 CPU 能够帮助防御这些溢出,因为它们是更现代的操作系统。确保 web 应用团队指定硬件需求并在软件开发生命周期规范和设计阶段考虑它们是非常值得的。

  • 堆溢出与堆栈溢出类似,只是它们集中在通常不受硬件平台 CPU 保护的空间上。当程序被调用时,堆是动态分配的,攻击者利用这些松散的规则强制溢出,覆盖指针,从而允许黑客重定向 CPU,指向自己的恶意代码。考虑到微软和 Linux 在 2000 年早期就解决了这些问题,这些问题非常罕见,但考虑到它们的潜在影响,它们非常值得检查。
  • 格式字符串溢出利用了精心编制的系统调用和代码中使用的函数。在没有验证的情况下,可以通过各种类型的变量传递函数,而 C 和 C++是臭名昭著的。这些相同的函数属性可能包含底层函数的控制指令,因此常见的情况是格式字符串注入利用这些调用中以前未使用的部分来强制执行意外行为。
  • Unicode 溢出利用编程语言标准字母表以外的字符触发潜在溢出。它们不像堆和堆栈类型那样常见,可以使用类似的预防措施来防止。
  • 整数溢出仅仅利用操作的整数输入中的无效性,这样他们用他们知道的数字加载两个变量,将导致答案超出分配的空间,从而产生溢出。与 Unicode 一样,针对前三种溢出类型的保护应防止整数溢出。

各种形式的缓冲区溢出测试可以通过 Burp Suite、w3af(等工具包含在扫描中 http://w3af.org )和其他功能齐全的 DAST 套件,但 Metasploit 可以帮助制作各种定制脚本来利用它们。原始安全中介绍了关于这方面的精彩教程 http://www.primalsecurity.net/0x0-exploit-tutorial-buffer-overflow-vanilla-eip-overwrite-2/ )正如您所看到的,发生合适的缓冲区溢出攻击有很多方法。

混合-不太好笑

另一方面,命令注入并不希望注入代码、反射回主机并改变应用的行为。命令注入通过在应用的正常操作中使用的可注入命令找到一个窗口,该命令使我们能够看到后端 Web 或应用层服务器。目标是向变量字符串中注入额外的命令,以便在主机操作系统上运行本地命令,例如copy命令、重新配置接口或最坏情况下的场景,例如fdisk。这不是你典型的爱好娱乐的恶作剧�� 这是残酷的东西。OWASP OTG(中对此进行了大量讨论 https://www.owasp.org/index.php/Command_Injection 和工具CommixCommIinjection Exploiter)包含在 Kali Linux 中,只是为了确保我们被涵盖。

要使用 Commix,您需要 URL(我们使用 DVWA 进行此操作)、与会话相关联的 cookie(我再次使用截取打开的 Burp)和正在模糊化的字段(本例中为 IP),然后离开;我很快就获得了 shell 访问权限(如下面的屏幕截图所示)!

通过混合代码注入实现 Shell 访问

打倒 HTTP?


到目前为止,我们在本章中讨论的所有攻击都涉及在表单字段中放置字符串,我们知道这些字符串可能会对后端数据库造成严重破坏。许多 web 服务现在基于用户输入和会话状态创建动态头,一类新的攻击已经浮出水面,以利用这可能打开的漏洞。当攻击者下定决心时,他们可以将信息注入到在许多情况下实际上类似于 XSS 的头中。

例如,HTTP 的语法映射非常严格,因此它将回车符和换行符视为字段之间的特殊描述点。如果 web 服务器没有正确拒绝或清理这些输入,攻击者可能会让其中一些人插入他们自己的任意字段并交付他们的有效负载。这种形式的攻击称为HTTP 响应拆分

此类攻击的另一种形式涉及HTTP 会话修复,这是一种攻击者感知到网站验证用户并使用会话 ID,但无法验证发送会话 ID 的人,从而将任何人(包括攻击者和受害者客户端)视为合法参与者的手段(web 服务器无法区分两者)。通过社会工程,攻击者可以跳枪强迫受害者点击攻击者已经选择会话 ID 的链接。然后,受害者进行身份验证,基本上告诉 web 服务器该会话 ID 是有效的。攻击者基本上植入了自己的 cookie,并让受害者为其提供担保 

HTTP 动词篡改是另一个值得关注的问题,因为它利用了 HTTP 请求上缺乏输入验证的优势,并使用动词(POST、HEAD、GET、TRACE、TRACK、PUT、DELETE 等,对此做了很好的阐述)http://www.restapitutorial.com/lessons/httpmethods.html )。

这些攻击方法是非常新的和即将出现的;除了 Burp 和 Wapati 之类的套件之外,Kali 中没有专门针对 HTTP 注入攻击的工具。欲了解更多信息,请访问Watchfire制作的白皮书 http://www.cgisecurity.com/lib/HTTP-Request-Smuggling.pdf )。

总结


注射攻击数量众多且致命。鉴于攻击者必须利用这些漏洞的类别、方法和目标的数量之多,动态内容能够得到安全保护真是太棒了。这类攻击只能通过基于警戒和最佳实践的分割、消毒和持续渗透测试来预防。

在本章中,我们研究了各种类型的注入攻击,其中 SQL 注入最有可能是该节目的明星。鉴于 SQL 在现代应用框架中的广泛使用,可以理解的是,更多的工具和注意力都集中在这种注入形式上。然而,随着处理能力的爆炸式增长以及对简化的访问和可移植性的需求,XML 和 XPath 的使用正在增加,我们将看到这种情况会持续多久。此外,不应忽略更专业的注入技术,因为 LDAP、命令和代码注入缺陷虽然不太常见,但对于发现服务器缺乏保护的公司来说,它们是潜在的噩梦。总的来说,注射攻击可能是耗时且乏味的测试,但对手只需要装甲上的一个裂缝就可以幸运。

在下一章中,我们将看一个更加技术化的攻击向量。�� 密码缺陷和漏洞。网络正是在公众意识到这种依赖并坚持隐私和保密的时候以令人难以置信的速度发展起来的。黑客在很多方面都领先于他们,他们在等待失败机制的出现,这些机制可以让他们拦截、修改或公开数据流的内容,并背叛 web 应用和客户端之间正常运行所需的信任。如果你已经准备好做一些令人毛骨悚然的事情,那么请跟随我进入第 8 章通过密码测试利用信任!