网络安全测试入门套件

大家好!

我叫安德烈。 十年来,我一直在寻找各种Web服务中的漏洞。 并准备与您分享我的知识。 去年五月,我在Heisenbug会议上做了有关此事的报告,现在我也准备在Habr的露天场所分享我的知识。 因此,让我们开始吧。

一次,我在臭名昭著的Facebook公司的服务器上发现了一个漏洞 。 伙计们忘了更新ImageMagick(用于图像处理的库)并为此付费:)在此示例中,我想表明我们都是人,而且无论在哪个公司和处于哪个职位,我们都可能犯错误。 唯一的问题是这些错误可能导致各种风险。
您的应用程序/网站/工具越复杂,出现问题的可能性就越大。
您需要检查漏洞。 根本不这样做是很愚蠢的。

以下各项可能是检查Web应用程序的阶段:
  • 准备:
    • 定义入口点-实际上是数据可以从应用程序中获取的位置;
    • 确定技术库存;
    • 确定应检查哪些漏洞;
  • 验证码 您需要检查适用于Web应用程序技术范围的所有漏洞。
  • 代码分析。 不要偷懒,不要跳过此项目。 在某些情况下,如果无法访问代码,很难找到任何漏洞,这也使您可以绕过可能嵌入在应用程序中的筛选。

我将详细讨论所有这些。

所以,准备。 我不会重点关注所有类型的漏洞,否则文章中的文字数量将超过所有可能的和难以想象的大小。 我建议您从OWASP十大项目列表中开始学习。 OWASP联盟每隔几年就会列出最相关的漏洞列表。 我们将详细考虑其中的一些。

s


XSS(跨站点脚本)是对用户的攻击,它使攻击者可以在受害者的浏览器的上下文中执行任意脚本。 大多数情况下,它意味着HTML标签和JS脚本的实现。
示例:曾经有过Yahoo!这样的服务。 Ad Exchange 密码恢复表单具有“ Return URL ”参数。 它可以指示在密码重置过程之后返回哪个页面。 如果在其中插入一个或另一个向量来导致JS代码的执行,则可以获得所有用户的cookie 。 我们将分析这种情况如何发生以及原因。


这是向量本身。 一次全部:

要进行注入,您需要摆脱默认情况下我们所处的变量的上下文(默认情况下-这是程序员在编写代码时所假定的)。
以下是原始值。 这是有效的行为。

我们看到returnURL = / login.jsp
这属于<input>标记的值。
如果我们在jsp之后添加引号,我们将看到HTML语法已经注入。 幸运的是, HTML语言并不严格,解析器将跳过,不会有任何问题:

添加另一个字符。 在这里,我们完全脱离了<input>标记的上下文:

现在,我们添加<svg>标签的开头,就语法而言,我们得到了两个有效的标签:

接下来,添加整个攻击向量:

在这种情况下,将绘制svg图片。 使用“ onloadJavaScript处理程序,我们使用文档的cookie执行警报。 仅此而已! 攻击者收到了您的cookie
如果在证据中我们仅显示警报本身,那么对于攻击者而言,将cookie发送到由他控制的服务器并不困难,在最坏的情况下,也可以抓住您的帐户。 让我们再看一下它的外观:


客户端上还有更多的攻击媒介。 我将给出一些带有简短描述的示例。 但是首先,您需要了解如何脱离上下文:
  • 脱离上下文。 这6个字符不仅有助于从HTML参数值的上下文中脱颖而出,而且还可以帮助您脱颖而出:
    ->'“>

好吧,实际上,这是两个最简单的攻击媒介:
  • 特别插入链接。 但在一般情况下-更改页面的外观。 例如,他们可能在您的页面中嵌入html代码,并显示一些伪造的窗口,要求输入数据:

    字符串“ aaaa ”指向google.com 。 您可以看到该链接已呈现在页面上,但是您可能看不到该链接,但这不会取消其在代码中的存在。 在这两种情况下,都可以认为案件已经完成;
  • 脚本执行,例如,拦截用户cookie



在哪里以及如何搜索XSS?


首先,在页面上找到信息/数据输出功能。 分析什么数据到达那里? 这里是不可信来源的概念。 首先是您的用户 。 攻击媒介可以包含在任何其他来源中:RSS源,其他服务(内部和外部)。
这是一个真实的例子:我为SEMrush IT工作。 我们正在开发一个在线平台,这是在线营销人员的通用工具。 因此,一个服务为我们保存了数据,另一个推论了,每个团队彼此依赖,事实证明,由于缺少对输出数据的正确处理,第二个服务XSS出现了,并且第一个命令根本没有必要过滤输入的数据以任何方式保留其“ 原样 ”。 结论:如果您不知道该或该数据的存储方式,则应将其视为不可信的。 或者事先就谁存储以及如何存储,过滤和显示数据达成协议。

如果您已经有来自不受信任来源的数据,那么我建议:
  • 研究传入数据的过滤;
  • 检查输出的上下文。 即使没有过滤,也并非在所有情况下都可以执行XSS 。 例如,如果响应的Content-type是: text / plain;
  • 不要依靠过滤嵌入式安全系统框架。


SQL注入




SQL代码的实现(英语SQL注入) -在数据库查询中引入了此处未隐含的指令。

例子(不是从生活,而是好的):
我们看到一个显示用户表的脚本。 在这种情况下,他可以按用户名搜索。
右侧显示对数据库查询的外观,左侧显示浏览器中脚本的结果。

此外,为了测试并至少获得一些主要结果,我们在name参数的值中插入了两个引号。 单人和双人:

我们从输出的角度来看,一切都崩溃了,表格完全消失了。 该请求还将获得额外的2个引号。 违反了SQL查询的整个语法。
如果我们采用这样的构造并将其添加到参数值( ed .:在黄色框中查看 ),我们将得到一个绝对有效的请求。 页面输出与第一个请求完全相同,该请求不包含注入:

为了完全验证是否存在漏洞,我们添加了一个平局而不是统一:

事实证明,从布尔逻辑的角度来看,该请求变为假,因此不包含数据。 但是,与发生错误的时刻不同,我们拥有表本身的输出。

为了不列出可能在不同数据库引擎和不同类型查询中的所有内容,我将所有内容简化为一行:

您可以尝试输入参数,然后根据答案中的差异尝试了解正在发生的事情,是否存在漏洞。 大约有80%的情况您可以使用此操作进行处理。
在困难的情况下,仍有20%的情况不会为您提供任何信息,例如:嵌套查询/过滤等。 在我的实践中,我只遇到过一次类似的经历。 然后,我不得不绕过服务端的过滤。

SQL有什么危险?
  • 从明显的信息泄漏 。 如果攻击者能够对您的数据库生成查询,则他可以以一种或另一种方式获取不应被输出的值(密码散列,客户端地址等);
  • 数据变更 。 现在,许多开发人员通过ORM系统使用数据库。 这些系统本身默认情况下允许您一次进行多个查询,SQL语法也允许您这样做。 如果存在漏洞,则不仅可以选择数据,还可以更改数据(包括删除表,更改数据库结构等)。
    在相同情况下,可能会增加用户特权。 更改某些表中的字段(例如,在用户数据库中放置is_admins = true ),从而提高您对管理员的权限;
  • 拒绝服务 在某些情况下,注射可能会导致拒绝服务。 生成了多个对数据库的繁重查询,并在多个线程中启动了这些查询,并且您的服务可能会停止一段时间。
  • 读取系统文件是SQL注入可能带来的另一场灾难。 这种风险的发生取决于您使用的数据库系统以及使用该数据库系统的用户(是否特权);
  • RCE(远程代码执行)是代码执行。 它直接取决于所使用的数据库类型(以前在默认情况下,使用MSSQL中的默认数据库设置,这是可能的)。

下表显示了SQL查询中的漏洞。 当然,您不需要记住它。 另外,这些并不是所有可能的选择,而仅仅是示例。 请注意以下事实:如果原始数据到达SQL查询的地方可能会以红色突出显示。 有经验的攻击者可能会找到一种方法来利用此漏洞。 小心细心。


SSRF(服务器端请求伪造)


文字翻译-服务器端的虚假请求。 也就是说,一种攻击使您可以操纵发送到应用程序的数据,从而迫使您不向业务逻辑最初计划的位置发出请求。
下图显示了SSRF的操作:

有一个攻击者,有您的服务器,该服务器已被防火墙关闭,但同时有一项功能可让您进一步代表服务器发出请求。
如果此功能没有得到适当的保护和/或不正确的保护(如通常发生的情况:),处理传入的数据,则攻击者可以使用MemcachedRedis或访问受害者的任何内部资源。

对于一个更具说明性的示例,请考虑SEMrush用于内部员工培训的展台。
重要的是要注意“ 头像URL ”的含义:

这里我们注意两点:
  • 头像网址本身
  • 以及使用文件下载它的能力。

请注意,“ Avatar URL ”字段是用于输入的文本字段,这意味着我们可以操纵该值。 让我们尝试使用404错误页面上的化身,也许是互联网上最著名的图片-Googlebot。
做一次:

双击“ 保存” 。 我们得到了一个机器人而不是我的照片:

在这里,值得注意的是,“ 头像URL ”的值已更改为某些本地路径-显然,应用程序请求了图片,将其保存到服务器并替换了新值。

我们继续前进。 在“ URL头像 ”字段中,输入值文件:/// etc / passwd 。 此设计使您可以访问文件结构。 在某些用于HTTP的库中,默认情况下,使用文件结构的功能处于打开状态,并从启动它们的服务器接收数据:

单击“ 保存 ”按钮后会发生什么?
首先,图片变成“ 蝙蝠 ”,其次,文件的路径改变了。

如果我们尝试在浏览器中请求此图像,则它们将不会向我们显示任何内容(文件已“ 损坏 ”)。 但是我们不是信息安全的第一天,我们知道该怎么做:)通过简单的操作,我们可以在计算机上获取文件的内容:

因此,借助此漏洞,我(作为攻击者)可以获取服务的所有源代码以及其他数据,以供正在运行Web服务的用户阅读。
让我们看一下SSRF的危险:
  • 端口扫描。 对于外部网络,您的服务是一个入口点和2个端口(http和https)。 通过从基础架构内部扫描端口,攻击者可以检测到打开的端口。
  • 绕过基于主机的身份验证。 有什么意义? 您的结构中可能有仅对某些资源可用的服务(请参阅:IP白名单)。 因此,如果您的易受攻击的服务器在白名单中,则可以访问他可用的那些服务,从而可以对其进行操作;
  • 继续开发上述攻击,您可以继续利用Intranet或本地服务器上运行的漏洞程序。 在很多情况下,内部基础结构(外部无法访问)的监控不佳(版本/安全补丁等并不总是更新)。 这也可能导致攻击和数据盗窃;
  • 读取本地数据。 我在上面展示了一个例子。 可以读取和访问您的配置,令牌和密码。


在哪里寻找SSRF?


这不是标准漏洞。 它可以在不同的地方找到,通常是在最意外的地方。 在这种情况下,“在这里看,但您甚至可能不在这里看”技术无效。
可能出现SSRF的迹象:
  • Webhook 。 如果它们的配置不正确,如果在Webhooks发出请求的那些服务器上防火墙配置不正确,则可以获得漏洞。
  • HTML转换 。 尝试嵌入指向内部服务的<iframe><img><base><script>CSS url结构;
  • 下载已删除的文件 。 还记得化身的例子吗? 当用户有机会通过URL将数据上传到服务器时,这就带来了很大的问题。 尝试发送带有端口的URL,并查看上传了哪些内容。


如何搜索SSRF?


  • 提升服务器并运行侦听器
    user$ nc -1 -n -vv -p 8080 -k 

    这样,您将看到端口8080上到达服务器的所有请求。 一方面,它是您的Web服务器上未占用的端口,另一方面,它通常是未被Firewall过滤的端口。 据认为,它用于http协议,并禁止它是可选的;
  • 在正在研究的应用程序中,找到参数,您可以将路径传递给该参数,以从我们的主机(向我们的侦听器 )请求数据;
  • 检查列表器的输出或返回的响应。


XXE(XML外部实体)


我将像往常一样以一个例子开始这个故事,以便使它更加清楚:
在前面提到的SEMrush服务中,有一个用于处理内容分析的工具。 用户输入其站点或竞争对手站点的URL,然后在对其进行分析之前,该服务将下载此内容。 观看视频中的情况:



要下载,该服务将访问指定的站点,并且搜寻器将下载sitemap.xml文件。 这就是我们在本模块中讨论的XML
在视频中,我们可以观察到攻击站点如何将外部实体XXE的定义添加到sitemap.xml ,该定义指向“ file:/// etc / hosts ”。 在Linux系统上,这是一个文件,如果没有DNS记录,则描述与主机对应的IP。
接下来,攻击者在<loc>标记中指示此变量扩展。 之后, XML解析器在处理了隔离专区中的所有XML之后,将位置为“ file:/// etc / hosts ”的值插入到位置变量中(在视频中以红色突出显示)。
攻击者启动了我们的解析器的启动,进入了日志,然后出现一行,在视频中以白色突出显示。 这是在GET请求中获得的文件“ file:/// etc / hosts ”的内容,该文件由它控制的服务器的日志中。
接下来是什么? 攻击者将验证他是对的。 它将文件名更改为“ file:/// etc / fstab ”,再次运行解析器并获取有关正在运行的进程的统计信息。

最后是“ file:/// etc / hostname ”,启动解析器,转到日志并获取我们所在机器的主机名
这是与我们公司无关的真人发现的真实错误。 我不得不在头上撒灰,然后付钱:)

XXE的另一个示例:

假设我们有一个特定的端点 ,称为-example.com/xxe
我们向其发送XML结构→在XML中,我们声明实体 →实体引用系统文件/ etc / passwd并在响应主体中进一步打开→我们在响应中获取此文件的内容。
值得一提的是,这种情况并不像我们希望的那样频繁发生。

为什么行得通?


XML文档是一种结构化的数据格式,除其他外,它使您可以使用特殊的DOCTYPE标记描述它可能包含的数据类型。
数据类型定义(DTD) -此XML文档中数据类型的定义。 有三种方法可以完成此操作:
  • 如果文档支持DTD 。 下面的示例显示了一些XML ,其中包含一个订单结构,一个product元素和一个count元素(大概是:产品的库存数量和订单中的项目数量)。 Order是这两个元素的父元素:
  • 本地服务器上的外部DTD。
    我们执行与第一实施例相同的操作,但是我们将所有定义都放在一个单独的文件中,该文件位于本地服务器上:

  • 第三方服务器上的外部DTD:

如果您是一位专心的读者,则可能与以下事实相关:在您的服务上发出此类请求和请求外部DTD方案的能力本身就是一个漏洞,我们在上文中谈到过,即SSRF漏洞。
常见的情况是:开发人员修复了XXE漏洞,但是忘记禁止处理外部DTD并获得SSRF 。 由此不会导致致命的后果,但您不要忘记它。

XML中的实体是什么?


XML中的 实体 。 这是什么 这是定义某些值并将其驱动为变量的机会。 实体具有三种不同的类型:

预定义 -预定义。 与HTML代码类似,可以将语言语法中的那些字符用作文本结构。 这里以它们为例,以便您了解它是什么。 是的,在大多数攻击中都没有使用它们,但是在某些特殊情况下可能需要使用它们。
通用参数 。 这是相同的,只是它们声明的语法发生变化,以及声明后如何调用它们

在哪里寻找XXE


几种选择:
  • 任何形式的XML处理:
    • SVG;
    • 网站地图;
  • HTML转换为其他格式;
  • 处理docxxlsx和类似格式。


如何寻找他们?



图片仅显示一个示例。 它不是通用密钥。 需要针对您正在研究的服务中使用的格式进行优化。

我们要做的第一件事:声明一个实体Z ,该实体Z访问受攻击主机控制的主机,并将其扩展到XML文档的主体内。
在这里,第二种选择是可能的-只是Parameter的本质。 与第一个广告不同( 符号)。 并且为了转向这个本质,不再需要文档的主体。 我们可以直接在DOCTYPE结构中访问它并公开此实体:

第三种情况是查看是否已打开或关闭从外部服务请求DOCTYPE的功能:

接下来,我们看看由我们控制的服务器的输出。 如果我们看到来自各个IP地址的对URL的调用/检查 ,则意味着漏洞通过的可能性很高,然后我们只需要弄清楚如何为我们获取更多有趣的数据即可。

XXE的危险是什么? 我将简短地逐点编写:
  • 读取本地文件;
  • 获得当地资源;
  • 端口/主机扫描
  • 纯文本包装器 。 这是访问基于纯文本协议运行的服务的机会。
  • 远程执行代码 (不经常执行 )。 默认情况下它是关闭的;
  • 拒绝服务 由于实体可以串联在一起,因此可以轻松地获得这些参数占用的内存量的指数增长。 结果是十亿个笑声发作 。 换句话说,您只是在使受攻击服务器的内存超载。

总之,我要说的是,如果没有实际应用,所有这些(文章以及您所获得的任何知识)是没有意义的。 因此,我会问您一个真正的琐事:考虑一下您昨天编写/测试的应用程序,并尝试检查其是否存在漏洞。 是否有任何输入表单或XML处理? 此应用程序受保护吗? 是否添加了过滤功能并禁用了DTD
打开SQLmap手册,了解如何使用它来检查您的应用程序。 如果他没有找到任何东西,请使用其他工具并进行检查,然后测试您的应用程序是否存在其他漏洞。 就像我在开始时所说的那样,本文仅研究了几个漏洞,但其中有数千个
我不认为您可以编写绝对安全的代码。 总是存在漏洞,您只是还没有发现它们。

Source: https://habr.com/ru/post/zh-CN441966/


All Articles