【THM】Burp Suite:Intruder(Burp Suite攻击器·更新版)-学习

发布时间 2024-01-02 21:48:35作者: Hekeatsl

本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/burpsuiteintruder

本文相关内容:了解如何使用 Intruder 在 Burp Suite 中自动化执行请求。

image-20231219185445169

简介

在本文中,我们将探索Burp Suite的Intruder模块,该模块能够提供自动请求操作并支持完成模糊测试和暴力破解等任务。

Burp Suite的Intruder模块是一个强大的工具,它允许我们执行自动化和可定制的攻击,它提供了修改请求的特定部分以及使用不同的输入数据来执行重复测试的能力。对于需要针对目标站点测试不同值的模糊测试和暴力破解等任务,Intruder模块尤其有用。

前置学习基础

在学习本文内容之前,建议先阅读并理解以下博客文章内容:

实验环境部署

我们可以在与本文相关的Tryhackme实验房间中一键部署目标虚拟机,并且我们还能在相关的THM实验房间中使用THM官方所提供的AttackBox来作为自己的攻击机,当然使用自己的本地kali机器作为攻击机也是可以的。

image-20231227000143478

什么是Intruder?

Intruder(入侵者,攻击器)是Burp Suite的内置模糊测试工具,它允许我们自动化地修改请求并通过使用不同的输入值来进行重复测试,这在模糊测试或者暴力破解攻击中非常有用。

Intruder可以接受一个请求(通常是Burp Proxy先捕获到请求再转发至Intruder中),并能使用这个请求作为模版来自动向目标服务器发送大量具有细微差别的请求。例如,通过捕获包含登录尝试的请求,我们可以配置Intruder将用户名和密码字段替换为字典中的值,从而能够允许我们对登录表单进行暴力破解攻击;类似地,我们也可以导入模糊测试字典,并结合Intruder对子目录、端点或虚拟主机进行模糊测试,Intruder的主要功能与Wfuzz或Ffuf命令行工具类似。

简而言之,作为一种执行自动化请求的工具,Intruder非常强大,但是还有一个问题:如果想不限速率地使用Intruder,那么我们必须下载Burp Suite专业版。当我们在Burp Suite社区版中使用Intruder模块时,它会受到一定的速率限制,而这种速度限制可能会让许多渗透测试人员选择使用其他工具来进行模糊测试和暴力破解攻击。尽管如此,Intruder模块仍然是一个很有价值的工具,值得我们去学习如何有效地使用它。

让我们查看一下Intruder模块的选项卡界面:

image-20231227214712385

如上图所示,我们能够在Position子选项卡中看到Target,此处允许我们选择攻击目标。

如果我们从Burp Proxy中发送一个被拦截的请求到Intruder(使用Ctrl + I快捷键或者右键单击请求消息并选择“发送给Intruder”即可),那么此时Target字段就会被自动填充。

Intruder中有四个子选项卡:

  • Positions(位置):这个子选项卡允许我们选择攻击类型,并且能够配置我们想要在请求模板中插入的有效载荷(Payload)的位置。

  • Payloads(有效载荷):这个子选项卡允许我们选择不同的payload(有效载荷)并将其插入到我们在Positions子选项卡中所定义的每个位置,例如我们可以选择从指定的字典文件中加载项目以作为一种有效载荷,至于如何将有效载荷插入到请求模板中,则取决于我们在Positions子选项卡中所选择的攻击类型;Payloads子选项卡还能够让我们修改Intruder中关于有效载荷的行为,例如为每个有效载荷定义预处理规则——添加前缀或后缀、执行匹配和替换或者根据已定义的正则表达式来跳过成功匹配到的有效载荷等等。

  • Resource Pool(资源池):这个子选项卡主要允许我们在各种自动化任务之间进行资源分配,这对于Burp Suite社区版而言并不是特别有用;Burp Suite专业版允许我们在Burp后台运行各种类型的自动化任务,而Resource Pool就是我们希望在这些自动化任务和Intruder之间分配可用内存和计算机处理能力的地方;如果我们不能访问后台自动化的任务,那么使用Resource Pool就没有什么意义(本文所使用的是Burp社区版,所以并不能访问后台自动化任务)。

  • Settings(设置):Intruder允许我们在Settings子选项卡中配置攻击行为,这里的设置主要将应用于Burp如何处理结果以及Burp如何处理攻击本身;例如,我们可以选择标记包含指定文本片段的请求,或者定义Burp如何处理重定向(3xx)响应。

tips:模糊测试是指我们取一组数据并将其应用于参数,从而测试目标功能或查看是否存在异常响应;例如,我们可以针对web应用程序进行端点模糊测试,我们只需将字典文件中的每个项目添加到Web请求URL的末尾并进行多次发送,然后查看服务器会如何响应即可(如http://MACHINE_IP/WORD_GOES_HERE)。

答题

阅读本小节的内容,并回答以下问题。

我们可以在哪个 Intruder 子选项卡中为我们计划的攻击定义“攻击类型”?

image-20231229100338273

Positions子选项卡

当我们想要使用 Intruder 进行攻击时,我们需要做的第一件事就是查看Positions子选项卡,这个子选项卡会告诉 Intruder 在什么位置插入有效载荷。

让我们切换到Intruder中的“Positions”子选项卡界面:

image-20231229100757842

请注意,Burp Suite默认会为我们标记一些最有可能插入有效载荷的位置(Position)——这些位置将以绿色背景突出显示并会被silcrows ( §)符号所包围。

在Positions子选项卡界面的右侧,我们可以选择“添加§”、“清除§”和“自动§”按钮:

  • Add §: 我们可以在请求消息编辑框中突出显示某些字段并通过单击此按钮来添加新的插入位置。
  • Clear §:点击此按钮会删除所有已定义的位置,从而留给我们一个空白画布来重新定义插入位置。
  • Auto §: 点击此按钮将根据请求消息自动尝试选择一些最可能的插入位置,如果已经清除了默认插入位置但又希望恢复它们,那么该按钮就非常有用。

答题

阅读本小节的内容,并回答以下问题。

image-20231229102536261

Payloads子选项卡

在Burp Suite Intruder的“Payloads-有效载荷”子选项卡中,我们可以为攻击创建、分配和配置具体的有效载荷,该子选项卡分为四个部分:

image-20231229104408328

  • Payload Sets(有效载荷集):

    • 这个部分允许我们为请求消息中已标记的攻击位置配置有效载荷集,并能选择想要使用的有效载荷类型。
    • 当使用仅允许单个有效载荷集(Sniper或Battering Ram)的攻击类型时,"Payload Set"下拉列表将只有一个选项,无论定义的位置数量如何。
    • 如果我们使用的是需要多个有效载荷集的攻击类型(Pitchfork或Cluster Bomb),那么每个攻击位置在"Payload Set"下拉列表中都会有一个对应项目。
    • 注意,在"Payload Set"下拉列表中为多个攻击位置分配编号时,请遵循从上到下、从左到右的顺序;例如,对于被标记的两个攻击位置(用户+密码),下拉列表中的第一项将引用用户名字段,而第二项将引用密码字段(username=§pentester§&password=§Expl01ted§)。
  • Payload settings(有效载荷设置):

    • 此部分将会为当前有效载荷集提供特定于已选的有效载荷类型的选项。

    • 例如,当我们使用"Simple list"有效载荷类型时,我们可以使用“Add-添加”文本框、“Paste-粘贴”行或者从文件中“Load-加载”有效载荷来手动地向集合中添加或删除有效载荷,还可以使用Remove按钮删除当前所选定的行、使用Clear按钮清除整个列表;此外,在加载较大的列表内容时需格外小心,因为它可能会导致Burp Suite崩溃。

    • 每种有效载荷类型都有自己的一组选项和功能,我们需要尽可能地探索可用的选项。

      image-20240101195029047

  • Payload Processing(有效载荷处理):

    • 在这部分中,我们可以定义应用于Payload集合中的每个有效载荷的规则(在将有效载荷发送到目标之前)。
    • 例如,我们可以将字典中的每个单词大写、跳过与特定的正则表达式模式成功匹配的有效载荷、应用其他转换或过滤措施。
    • 虽然我们可能不会经常使用此部分,但是当我们的攻击需要进行特定的有效载荷处理时,此部分就会有很高的使用价值。
  • Payload Encoding(有效载荷编码):

    • 该部分允许我们自定义有效载荷的编码选项。
    • 在默认情况下,Burp Suite会应用URL编码来确保有效载荷的安全传输,然而在某些情况下,我们可能需要调整编码方式;
    • 我们可以通过修改要编码的字符列表或者取消选中“URL-encode these characters”复选框来覆盖默认的URL编码选项。

通过利用Burp Suite Intruder中的“Payloads”子选项卡,我们可以创建和自定义有效载荷集,以满足某些Web安全测试的特定需求,我们能够对具体的有效载荷进行微调以进行有效的测试和利用。

答题

阅读本小节的内容,并回答以下问题。

我们可以使用哪个有效载荷处理规则在Payload集合中的每个有效载荷末尾添加字符?

image-20230411112806471

image-20240102164901650

Intruder攻击类型介绍

当我们切换到Intruder的Positions子选项卡时,我们还可以从中查看"Attack types" 下拉菜单并选择具体的攻击类型。

Intruder为我们提供了四种可选的攻击类型,每种攻击类型都有其特定的使用目的:

  • Sniper(狙击手):该攻击类型是默认且最常用的选项,它会循环遍历有效载荷集,并且每次将一个有效载荷插入到请求中已定义的每个攻击位置;Sniper攻击将以线性方式迭代所有有效载荷,从而允许我们进行精确和集中的Web安全测试。
  • Battering ram(攻城锤):Battering ram攻击类型与Sniper攻击类型的不同之处在于——Battering ram攻击会同时发送所有的有效载荷,并且每个有效载荷将插入到其对应的各自攻击位置;当我们想测试竞争条件漏洞或者需要在测试中同时发送多个payload时,这种攻击类型会非常有用。
  • Pitchfork(干草叉):Pitchfork攻击类型可以使用不同的有效载荷来同时测试多个攻击位置,该攻击类型允许测试人员定义多个有效载荷集,并且每个有效载荷集都会与请求中的特定攻击位置相关联;当存在需要单独测试的不同参数时,这种攻击类型会非常有效。
  • Cluster bomb(集束炸弹):Cluster bomb攻击类型结合了Sniper和Pitchfork中的方法,它能对每个攻击位置执行类似于Sniper的攻击,但也会针对每个攻击位置同时测试所有的有效载荷;当测试中存在多个攻击位置且需要有不同的有效载荷时,这种攻击类型会很有用。

每种攻击类型都有其优点,适合不同的测试场景,了解它们之间的差异有助于我们根据具体的测试目标来选择合适的攻击类型。

答题

阅读本小节内容,并回答以下问题。

image-20240102165529800

Sniper攻击

Sniper(狙击手)是Burp Suite Intruder中默认且最常用的攻击类型,它在针对单个攻击位置进行测试时特别有效,例如密码暴力破解或者API端点模糊测试。

在使用这种攻击类型时,我们将提供一组有效载荷,这可以是单词列表(字典)或者一系列数字,并且我们将使用"Payload Set"来引用那些将要插入到请求中的有效载荷,然后Intruder会获取"Payload Set"中的每个有效载荷,并依次将每个有效载荷插入到请求中的每个已定义的攻击位置。

我们可以查看以下示例模板:

#Example Positions

POST /support/login/ HTTP/1.1
Host: MACHINE_IP
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 37
Origin: http://MACHINE_IP
Connection: close
Referer: http://MACHINE_IP/support/login/
Upgrade-Insecure-Requests: 1

username=§pentester§&password=§Expl01ted§ 

在上述示例中,我们定义了两个攻击位置(Position),分别针对用户名(username)和密码(password)主体参数。

当我们使用Sniper攻击来测试上述示例时,Intruder会从有效载荷集中取出每个有效载荷,并且会针对每个已定义的攻击位置依次替换每个有效载荷。

假设我们有一个单词列表,其中包含了三个单词:burpsuiteintruder

针对上述示例中的两个攻击位置(Position),Intruder将基于单词列表生成六个请求:

image-20230411063643214

注意Intruder是如何从第一个位置(username)开始并尝试每个有效载荷的,之后Intruder还会移动到第二个位置(password)并再次尝试相同的有效载荷;据此,我们可以计算出Sniper攻击将会发送的请求总数(字典中的单词数*已定义的位置数):requests = numberOfWords * numberOfPositions

Sniper非常适合于单位置攻击,例如,在知道用户名的情况下对密码进行暴力破解攻击,或者对单个API端点进行fuzzing测试。

答题

阅读本小节的内容,并回答以下问题。

image-20240102174651568

Battering ram攻击

接下来,让我们看一下Battering Ram(攻城锤)攻击类型。

与Sniper一样,Battering ram也是使用一组有效载荷(例如一个单词列表),但是与Sniper攻击不同的是,Battering Ram会将相同的有效载荷同时放置在所有已定义的攻击位置上,而不是依次将每个有效载荷替换到每个位置。

让我们使用与上一个小节相同的单词列表和请求示例来说明这一点。

#Example Positions

POST /support/login/ HTTP/1.1
Host: MACHINE_IP
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 37
Origin: http://MACHINE_IP
Connection: close
Referer: http://MACHINE_IP/support/login/
Upgrade-Insecure-Requests: 1

username=§pentester§&password=§Expl01ted§

针对上述示例中的两个攻击位置,我们将使用与上一小节中相同的单词列表(burpsuiteintruder)来进行Battering ram攻击,此时Intruder会生成三个请求:

image-20230411072823989

如上表所示,在使用Battering ram攻击时,给定单词列表中的每个有效载荷都会同时插入到请求中的每个攻击位置:在Intruder每次生成请求时,示例中的两个攻击位置都会使用相同的有载载荷。

当我们想要同时针对多个攻击位置测试相同的有效载荷而不需要进行顺序替换时,Battering ram(攻城锤)攻击类型会非常有用。

答题

阅读本小节的内容,并回答以下问题。

image-20230411073152849

Pitchfork攻击

除了Sniper之外,Pitchfork(干草叉)攻击会是我们最可能使用的攻击类型。

我们可以将执行一个Pitchfork攻击想象成同时执行着多个Sniper攻击,Sniper攻击只会使用一个有效载荷集(这个有效载荷集可供每个位置使用),而Pitchfork则会为每个位置提供一个有效载荷集(这样就需要多个有效载荷集,最多20个),并会同时迭代所有的攻击位置。

为了更好地理解Pitchfork攻击,让我们继续使用之前的请求示例,但这次我们将使用两个单词列表(两个字典):

  1. 第一个单词列表将供username使用,包含三个单词:joelharrietalex
  2. 第二个单词列表将供password使用,包含三个单词:J03lEmma1815Sk1ll

tips:已知joel用户的密码为J03l,harriet用户的密码为Emma1815,alex用户的密码为Sk1ll。

假设我们使用上述这两个单词列表针对上一小节中的请求示例执行pitchfork攻击,那么Intruder所生成的请求将如下所示:

image-20230411075757106

如上表所示:在执行Pitchfork攻击时,Intruder会从每个字典中获取第一个单词并将它们同时放入请求中,请求的每个位置对应放入一个单词,然后Intruder会接着对下一个请求重复类似操作——从每个字典中取出第二个单词并将它们同时替换到请求中......。

Intruder将持续进行迭代操作,直到一个(或所有)字典用完为止,在理想情况下,Pitchfork攻击中所使用的多个有效载荷集应该具有相同的长度,因为一旦最短的单词列表被用尽,那么Intruder就会停止攻击测试;例如,如果我们有两个单词列表,第一个单词列表有100个单词,第二个单词列表有90个单词,那么在Pitchfork攻击中Intruder将只会发出90个请求,即第一个单词列表中的最后10个单词将不会被使用。

Pitchfork攻击类型在执行凭据填充攻击(撞库攻击)时特别有用,它允许同时测试需要提供不同有效载荷的多个位置。

答题

阅读本小节的内容,可以帮助我们回答以下问题。

image-20230411081215108

Cluster bomb攻击

在本小节中,让我们来看一下Intruder中的最后一种攻击类型:Cluster bomb(集束炸弹)。

与Pitchfork攻击一样,Cluster bomb攻击也允许我们选择多个有效载荷集:每个位置一个有效载荷集,最多可以使用20个有效载荷集;但是,Pitchfork攻击会同时迭代每个有效载荷集,而Cluster bomb攻击则是会单独迭代每个有效载荷集,从而确保测试每个可能的有效载荷组合。

为了更好地说明Cluster bomb攻击类型,让我们使用与上一小节相同的单词列表:

  • Usernames: joelharrietalex
  • Passwords:J03lEmma1815Sk1ll

假设我们现在不知道哪个密码属于哪个用户,也就是说:我们现在一共有三个用户和三个密码,但是不知道如何匹配。

在这种情况下,我们可以选择使用Cluster bomb攻击,Intruder将基于每个单词列表中的单词来尝试使用所有可能的组合,最终Intruder将生成如下请求:

image-20230411084826484

如上表所示:Cluster Bomb攻击会基于已提供的有效载荷集来迭代每种组合,它通过将每个有效载荷集中的每个单词替换到请求中的相应位置来测试每种可能性。

使用Cluster Bomb攻击会产生大量的流量(请求总数等于每个有效载荷集中的单词数相乘),所以我们要谨慎使用。

因为在Burp Suite社区版中使用Intruder会受到速率限制,所以我们还要意识到:在Burp社区版中基于中等大小的单词列表来进行Cluster Bomb攻击,可能需要更长的时间才能完成测试。

Cluster Bomb攻击类型适用于任何"用户名和密码匹配情况未知"的凭据暴力破解攻击。

答题

阅读本小节的内容,并回答以下问题。

image-20230411090246312

简单示例练习

我们在上文中介绍了很多理论——现在到了我们将上述理论付诸实践的时候了。

准备阶段

在与本文相关的TryHackMe实验房间中部署目标机器。

让我们尝试访问目标机器的以下页面:/support/login

tips:http://MACHINE_IP/support/login

image-20230411115210973

这是一个相当典型的登录界面,通过查看登录表单的源代码,我们可以发现该登录页面没有实施任何保护措施:

---
<form method="POST">
    <div class="form-floating mb-3">
        <input class="form-control" type="text" name=username  placeholder="Username" required>
        <label for="username">Username</label>
    </div>
    <div class="form-floating mb-3">
        <input class="form-control" type="password" name=password  placeholder="Password" required>
        <label for="password">Password</label>
    </div>
    <div class="d-grid"><button class="btn btn-primary btn-lg" type="submit">Login!</button></div>
</form>
---

image-20230411115356520

由于上述登录表单缺乏保护措施,所以我们可使用多种攻击方式(包括cluster bomb攻击),在本小节示例中,实验房间预先为我们提供了一个登录凭据泄露文件,因此我们将选择使用"Pitchfork"攻击类型。

我们可以在部署目标机器之后,使用以下命令来下载任务文件(一个包含登录凭据的字典文件):

wget http://MACHINE_IP:9999/Credentials/BastionHostingCreds.zip

本小节的示例场景:

Bastion Hosting 三个月前遭到网络攻击,这次攻击导致他们所有员工的用户名、电子邮件和明文密码都被泄露;虽然员工被告知立即更改密码,但是,其中有一两个员工并没有当回事......

由于我们已经有了用户名列表和密码列表,并且每个用户名都与一个密码相关联,因此我们可以避免直接进行暴力破解攻击,而是尝试执行凭证填充攻击(撞库攻击)。

答题

下载并解压缩由TryHackMe实验房间所提供的BastionHostingCreds.zip任务文件。

wget http://10.10.205.239:9999/Credentials/BastionHostingCreds.zip
unzip BastionHostingCreds.zip

image-20230411120526715

BastionHostingCreds.zip文件中应包含四个单词列表(字典)文件:

  • emails.txt
  • usernames.txt
  • passwords.txt
  • combined.txt

它们分别是包含泄露的电子邮件、用户名、密码的列表,最后一个是包含组合的电子邮件和密码的列表;我们将使用usernames.txtpasswords.txt单词列表来完成本小节的示例练习。

使用浏览器中导航到 http://10.10.205.239/support/login ,激活攻击机上的Burp代理插件并开启拦截,然后在浏览器中进行登录操作,成功捕获到相关请求:

image-20230411120933714

image-20230411120954211

使用快捷键Ctrl + I将上图中的请求消息转发给Intruder功能模块,查看Positions子选项卡,确保以用户名和密码字段作为攻击位置并选择"Pitchfork"攻击:

image-20230411122538379

切换到"Payloads"子选项卡,我们可以发现我们有两个可用的有效载荷集:

image-20230411122652774

虽然没有命名,但是我们知道在请求消息中用户名字段位于密码字段的左侧,所以上图中的第一个有效载荷集对应用户名字段,第二个有效载荷集则对应密码字段。

我们将这两个有效载荷集都设置为"Simple list"有效载荷类型,然后分别导入字典文件(转到"Payload Options"并选择"Load"按钮进行加载即可):

image-20230411124015794

image-20230411124054208

然后我们回到Intruder的Positions子选项卡,点击"Start Attack-开始攻击"按钮即可。

攻击完成后,我们将看到一个显示结果的新窗口,但同时我们也遇到了一个新问题,Burp发送了100个请求:我们应该如何知道哪些请求是有效的(如果有的话)?

image-20230411130451901

最常见的解决方案是根据响应状态码来区分成功或不成功的登录请求(这仅在状态码存在差异时才有效),在理想情况下,成功的登录请求将为我们提供200响应码,而失败的登录请求将为我们提供401响应码;然而,在许多情况下,我们可能只会看到302响应码(302代表重定向)。

如果无法根据响应状态码找到有效请求,那么我们接下来要采用的解决方案就是基于响应消息的长度来识别请求之间的差异,例如,成功的登录尝试请求可能会产生一个包含400字节的响应消息,而不成功的登录尝试请求则可能会产生一个包含600字节的响应消息(因为不成功的请求所对应的响应消息还会包含错误提示信息)。

我们可以在显示结果的窗口中单击"Length"列,这将按字节长度对响应消息进行排序处理:

image-20230411130703719

一旦我们对响应消息完成按长度排序,我们就会发现与众不同的请求消息。

你可能已经猜到,响应长度较短的请求是使用有效凭据发出的(因为登录成功的响应将不会包含错误提示信息)——我们可以通过使用该凭据尝试登录来进行确认。

  • 用户名:m.rivera
  • 密码:letmein1

image-20230411131232070

image-20230411131254847

用户名:m.rivera

密码:letmein1

我们通过撞库攻击成功地破解了/support/login登录页面。

image-20231229103450039

挑战任务练习

在上一小节中,我们已经成功获得了访问技术支持(IT support)系统的权限,现在让我们看一下我们能利用这个页面做什么。

技术支持的主界面( http://10.10.205.239/support/ )向我们展示了一张票据表——如果我们点击表中的任何一行,我们就会被重定向到一个新页面,在那里我们可以查看完整的票据。

image-20230411132012630

image-20230411132106145

通过观察URL,我们可以看到这些票据页面都是有编号的,相关URL结构的格式如下:http://MACHINE_IP/support/ticket/NUMBER

那么,这意味着什么呢?

编号意味着我们可以知道上述这些票据不是用难以猜到的id来识别的——这些票据都会被分配一个整数标识符。

如果我们使用Intruder对/support/ticket/NUMBER端点进行模糊测试会发生什么?可能存在以下两种情况:

  1. 访问控制有效:端点被正确配置为仅允许用户访问分配给当前用户的票据,在这种情况下,我们只能查看与我们的帐户相关联的票据;
  2. 存在IDOR漏洞:端点可能缺乏适当的访问控制,从而导致端点页面存在IDOR漏洞,在这种情况下,我们就有可能尝试读取所有的现有票据,而不必管票据所分配的用户是谁。

tips:如果是第二种情况,则说明目标页面存在一个被称为IDOR(Insecure Direct Object References-不安全的直接对象引用)的漏洞。

为了进一步调查,我们将针对/support/ticket/NUMBER端点进行模糊测试,此测试将帮助我们确定相关端点是否已正确配置或者是否存在IDOR漏洞。

答题

我们只需要对一个位置进行模糊测试,所以应该选择使用Intruder中的Sniper攻击。

我们选择对 http://10.10.205.239/support/ticket/78 进行模糊测试(针对目标端点页面发送请求并进行请求捕获操作,然后将相关请求转发给Intruder):

image-20230411133437007

image-20230411134347140

攻击完成后,我们将看到一个显示结果的新窗口,选择按状态码排序,发现一共有五个响应码为200的登录尝试,我们需要找到包含flag的票据:

image-20230411135004138

image-20230411135151869

我们找到的flag内容为:THM{MTMxNTg5NTUzMWM0OWRlYzUzMDVjMzJl} 。

image-20230411135321528

综合练习-绕过CSRF Token(令牌)

使用Burp代理捕获发送给 http://10.10.205.239/admin/login/ 页面的请求并检查相关的响应消息:

HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Fri, 20 Aug 2021 22:31:16 GMT
Content-Type: text/html; charset=utf-8
Connection: close
Set-Cookie: session=eyJ0b2tlbklEIjoiMzUyNTQ5ZjgxZDRhOTM5YjVlMTNlMjIzNmI0ZDlkOGEifQ.YSA-mQ.ZaKKsUnNsIb47sjlyux_LN8Qst0; HttpOnly; Path=/
Vary: Cookie
Front-End-Https: on
Content-Length: 3922
---
<form method="POST">
    <div class="form-floating mb-3">
        <input class="form-control" type="text" name=username  placeholder="Username" required>
        <label for="username">Username</label>
    </div>
    <div class="form-floating mb-3">
        <input class="form-control" type="password" name=password  placeholder="Password" required>
        <label for="password">Password</label>
    </div>
    <input type="hidden" name="loginToken" value="84c6358bbf1bd8000b6b63ab1bd77c5e">
    <div class="d-grid"><button class="btn btn-warning btn-lg" type="submit">Login!</button></div>
</form>

image-20240102203904580

我们可以看到上述响应除了存在用户名字段和密码字段之外,还有一个会话cookie集,以及存在一个CSRF(跨站点请求伪造)令牌作为隐藏字段loginToken被包含在表单中。

如果刷新页面,我们会发现会话cookie和loginToken都会随着每次请求而改变,这意味着对于每次登录尝试,我们都需要提取会话cookie和loginToken的有效值。

换句话说,在每次进行尝试登录时,我们都需要唯一的会话cookie值以及隐藏在输入表单中的loginToken值。

接下来我们需要使用Burp Suite中的“Macros(宏)”功能。

在许多情况下,我们可以使用被称为“Recursive Grep(递归提取)”的有效载荷类型来尝试令牌绕过,但不幸的是,在本小节示例中,由于目标web应用程序会将我们重定向回登录页面,而不是简单地向我们显示两个目标参数,因此我们将需要以更艰难的方式来实现令牌绕过。

具体来说,我们必须定义一个"Macros-宏"(一组简短的重复操作),并且让"Macros-宏"在每个请求发送之前执行,该宏将为会话cookie和loginToken提取唯一值,并且会将它们替换到我们的每个攻击请求中。

答题

在攻击机上使用浏览器导航到: http://10.10.205.239/admin/login/

image-20230411144323550

先在浏览器中激活Burp代理插件,然后在Burp Proxy模块中激活Intercept(拦截)功能,最后使用上图所示的页面进行登录尝试,捕获请求并将其发送给Intruder。

将攻击类型设置为“Pitchfork”,然后清除所有预定义位置仅选择用户名字段和密码字段,其他两个位置(会话cookie和loginToken)将由我们的宏进行处理。

image-20230411145002562

接着切换到Intruder中的Payloads子选项卡,加载我们之前使用过的、用于support登录页攻击的用户名字典和密码字典(操作过程和前文一样)。

处理好用户名和密码参数后,我们现在需要找到一种方法来获取不断变化的会话cookie和loginToken,不幸的是,由于响应重定向,使用"Recursive Grep(递归提取)"有效载荷类型在这里不起作用,因此我们不能完全在Intruder中执行令牌绕过操作——我们需要构建一个“Macros(宏)”。

宏(Macros)允许我们重复执行同一组动作,在本例中,我们想向/admin/login/发送GET请求。

  • 切换到 "Settings" 选项卡,然后再找到 "Sessions(会话)"类别 。

  • 向下滚动到底部的“Macros(宏)”部分,然后单击“Add(添加)”按钮。

  • 出现的菜单将向我们显示我们的请求历史记录,如果此处列表中没有发送到http://10.10.205.239/admin/login/的GET请求,我们可以在浏览器中重新导航到/admin/login/位置,然后我们就会看到GET请求出现在历史记录列表中。

  • 选择我们需要的GET请求后,单击“Ok(确定)”。

  • 最后,为宏(Macros)指定一个合适的名称,然后再次单击“Ok(确定)”完成宏定义过程。

    image-20240102210901578

image-20240102210801528

image-20230411150718749

现在我们已经定义了宏,我们还需要设置会话处理规则来定义如何使用宏。

  • 在Settings选项卡的"Sessions"类别中,向上滚动到“Session Handling Rules(会话处理规则)”部分,并选择“Add(添加)”一个新规则。

  • 这将弹出一个新窗口,其中有两个选项卡:“Details”和“Scope”;在默认情况下,我们将位于Details选项卡中。

    image-20240102210631377

  • 我们可以在上图中填写适当的描述,然后切换到Scope(范围)选项卡。

  • 在"Tools Scope"部分,取消选中Intruder以外的所有复选框——我们不需要将此规则应用于其他任何地方。

  • 在"URLScope"部分,选择"Use suite scope",这会将宏设置为仅在已添加到全局范围的站点上运行,如果尚未设置全局范围,可以将 "Use custom scope"选项保留为默认勾选状态并添加http://10.10.205.239/目标站点到Scope中。

    image-20230411152434480

现在我们需要切换回Details选项卡并查看"Rule Actions"部分。

  • 点击 "Add" 按钮——这将出现一个下拉菜单,列出我们可以添加的操作。
  • 从菜单列表中选择"Run a Macro"。
  • 在出现的新窗口中,选择我们之前所创建的宏。

image-20230411152846522

image-20230411152920607

现在,我们可以使用这个宏在Intruder发送请求之前覆盖某些参数,这意味着我们能够尝试得到会话cookie和loginTokens,并将它们的值直接添加到我们的请求中;简而言之——在Intruder开始攻击之前,我们可以限制仅更新哪些参数以及cookies,从而能够将会话cookie和loginTokens添加到攻击请求中:

  • 选择 "Update only the following parameters and headers(仅更新以下参数和标头)",然后单击单选按钮下方输入框旁的“编辑”按钮。

  • 在"Enter a new item(输入新项目)"文本框中,输入"loginToken",点击"添加",再点击"关闭"。

  • 选择 "Update only the following cookies(只更新以下cookies)",然后点击相应的“编辑”按钮。

  • 在"Enter a new item(输入新项目)"文本框中,输入"session",按“添加”,然后按“关闭”。

  • 最后,点击Ok确认我们的操作。

    image-20240102211717930

现在你应该已经配置好了一个宏,这个宏将会替换攻击请求中的CSRF令牌和会话cookie,我们接下来要做的事情就是切换回Intruder并开始攻击。

注意:在这种攻击中,每个攻击请求都应该得到302状态码响应,如果你看到的是403错误状态码,那么则说明你的宏没有正常工作。

与我们之前在上文中执行的登录凭据填充攻击一样,这里的响应代码都是相同的(302重定向),同样,我们可以根据长度对响应消息进行排序,以找到有效的登录凭据;你将看到相当多不同的响应长度,然而,表示成功登录的响应消息仍然会显著地更短。

image-20230411160317727

使用我们刚刚找到的凭据进行登录(在输入凭据之前,你可能需要刷新登录页面)。

  • 用户名:o.bennett
  • 密码:bella1

image-20230411160452414

image-20230411160509351

用户名:o.bennett

密码:bella1

image-20240102212217114