PortSwigger Academy | Authentication : 身份认证

本文详细探讨了身份验证机制中的漏洞,包括基于密码和多因素认证的弱点,以及如何通过强化密码策略、速率限制和逻辑审查来保护身份验证。实用案例和实验室提供了解决实际安全问题的步骤。

文章目录

在这里插入图片描述

在本节中,我们将介绍一些网站使用的最常见的身份验证机制,并讨论其中的潜在漏洞。我们将重点介绍不同身份验证机制中的固有漏洞,以及由于身份验证的不恰当实现而引入的一些典型漏洞。最后,我们将提供一些基本指导,说明如何确保您自己的身份验证机制尽可能地健壮。

一如既往,我们创建了一些交互式实验室供您练习利用这些漏洞。如果您已经熟悉这个主题,您可以直接进入实验室来测试您的技能。

1 什么是身份验证?

身份验证是验证给定用户或客户端身份的过程。换言之,它涉及到确保他们真的是他们声称的那个人。至少在某种程度上,网站是暴露给任何连接到互联网上的人的。因此,健壮的身份验证机制是有效web安全的一个重要方面。

有三种身份验证因素可将不同类型的身份验证分为:

  • 你知道的东西,如密码或安全问题的答案。这些有时被称为“知识因素”。

  • 你拥有的东西,也就是一个物理物体,比如手机或安全令牌。这些有时被称为“占有因素”。

  • 你正在做或正在做的事情,例如,你的生物特征或行为模式。这些有时被称为“内在因素”。

身份验证机制依赖于一系列技术来验证这些因素中的一个或多个。

1.1 身份验证和授权有什么区别?

身份验证是验证用户是否真的是他们声称的用户的过程,而授权涉及验证是否允许用户做某事

在网站或web应用程序的上下文中,身份验证确定试图使用用户名Carlos123访问网站的人是否真的是创建帐户的同一个人。

一旦Carlos123通过身份验证,他的权限就决定了他是否有权访问其他用户的个人信息或执行删除其他用户帐户等操作。

2 身份验证漏洞是如何产生的?

从广义上讲,身份验证机制中的大多数漏洞都以以下两种方式之一出现:

  • 认证机制很弱,因为它们无法充分防止暴力攻击。

  • 实现中的逻辑缺陷或糟糕的编码允许攻击者完全绕过身份验证机制。这有时被称为“身份验证中断”。

在web开发的许多领域,逻辑缺陷只会导致网站出现意外行为,这可能是安全问题,也可能不是。然而,由于身份验证对安全性如此关键,有缺陷的身份验证逻辑使网站暴露于安全问题的可能性明显增加。

3 易受攻击的身份验证有何影响?

身份验证漏洞的影响可能非常严重。一旦攻击者绕过身份验证或强行闯入另一个用户的帐户,他们就可以访问受损帐户拥有的所有数据和功能。如果他们能够破坏高特权帐户(如系统管理员),他们就可以完全控制整个应用程序,并有可能获得对内部基础设施的访问权。

即使泄露低特权帐户,攻击者仍然可以访问他们本不应该拥有的数据,如商业敏感业务信息。即使该帐户无法访问任何敏感数据,它也可能允许攻击者访问其他页面,从而提供进一步的攻击面。通常,某些高严重性攻击不可能从公开访问的页面进行,但它们可能从内部页面进行。

4 身份验证机制中的漏洞 ↓

网站的身份验证系统通常由几个不同的机制组成,在这些机制中可能会出现漏洞。一些漏洞广泛适用于所有这些上下文,而另一些则更特定于所提供的功能。
我们将更仔细地研究以下领域中一些最常见的漏洞:

  • 基于密码的登录实验室中的漏洞
  • 多因素身份验证实验室中的漏洞
  • 其他身份验证机制中的漏洞

请注意,有几个实验室要求您枚举用户名和暴力口令。为了帮助您完成这个过程,我们提供了一个候选用户名和密码的短名单,您应该使用这些用户名和密码来解决实验室的问题。

4.1 第三方身份验证机制中的漏洞

如果您喜欢破解身份验证机制,那么在完成我们的主要身份验证实验室之后,更高级的用户可能希望尝试和解决我们的开发认证 2.0身份验证实验室。(以后再看)

4.2 防止对您自己的身份验证机制的攻击 ↓

我们已经演示了几种方法,在这些方法中,网站可能会由于如何实现身份验证而受到攻击。为了降低对您自己的网站进行此类攻击的风险,您应该始终遵循以下几个一般原则。


接上文: 身份验证机制中的漏洞 ↑

1 基于密码的登录中的漏洞

Vulnerabilities in password-based login
在本节中,我们将更仔细地研究一些基于密码的登录机制中最常见的漏洞。我们还将提出一些可能被利用的方法。甚至还有一些交互式实验室,您可以自己尝试利用这些漏洞。

对于采用基于密码的登录过程的网站,用户可以自己注册帐户,也可以由管理员为其分配帐户。此帐户与一个唯一的用户名和一个秘密密码相关联,用户在登录表单中输入该用户名和密码以进行身份验证。

在这种情况下,他们知道秘密密码这一事实就足以证明用户的身份。因此,如果攻击者能够获取或猜测其他用户的登录凭据,则网站的安全性将受到损害。

这可以通过多种方式实现,我们将在下面探讨。

1.1 暴力破解

暴力破解是指攻击者使用试错系统试图猜测有效的用户凭据。这些攻击通常是使用用户名和密码的单词列表自动进行的。自动化此过程,特别是使用专用工具,可能会使攻击者以高速进行大量登录尝试。

暴力破解并不总是完全随机猜测用户名和密码。通过使用基本逻辑或公开的知识,攻击者可以对暴力攻击进行微调,从而做出更有根据的猜测。这大大提高了此类攻击的效率。依赖基于密码的登录作为唯一身份验证用户方法的网站,如果没有实施足够的暴力保护,可能会非常容易受到攻击。

1.1.1 暴力破解用户名

如果用户名符合可识别的模式(例如电子邮件地址),那么就特别容易猜测。例如,以这种格式查看业务登录是非常常见的名字。姓氏 @somecompany.com网站. 然而,即使没有明显的模式,有时甚至使用可预测的用户名(如adminadministrator)创建高特权帐户。

在审计过程中,检查网站是否公开披露潜在用户名。例如,您是否能够在不登录的情况下访问用户配置文件?即使配置文件的实际内容是隐藏的,配置文件中使用的名称有时与登录用户名相同。您还应该检查HTTP响应以查看是否有任何电子邮件地址被泄露。有时,回复会包含高权限用户(如管理员和IT支持人员)的电子邮件地址。

1.1.2 暴力破解密码

类似地,密码也可以被暴力破解,其难度根据密码的强度而有所不同。许多网站采用某种形式的密码策略,强制用户创建高熵密码,至少理论上,仅使用暴力破解更难。这通常涉及强制使用以下密码:

  • 最少字符数
  • 大写字母和小写字母的混合体
  • 至少一个特殊字符

然而,虽然高熵密码很难单独被计算机破解,但我们可以利用人类行为的基本知识来利用用户无意中引入到这个系统中的漏洞。用户通常会选择一个他们能记住的密码,并试图拓展它以适应密码策略,而不是创建一个随机字符组合的强密码。例如,如果不允许mypassword,用户可以尝试Mypassword1之类的东西!或者改为Myp4$$w0rd

在策略要求用户定期更改密码的情况下,用户通常只对首选密码进行微小的、可预测的更改。例如,Mypassword1!变成Mypassword1?或者Mypassword2!

这种对可能的凭证和可预测模式的了解意味着暴力攻击通常比简单地遍历每个可能的字符组合更复杂,因此更有效。

1.2 用户名枚举

用户名枚举是指攻击者能够观察网站行为的变化,以确定给定用户名是否有效。

用户名枚举通常发生在登录页上,例如,当你输入一个有效的用户名但密码不正确,或在注册表单上当你输入一个用户名显示已经被占用。这大大减少了强制登录所需的时间和精力,因为攻击者能够快速生成有效用户名的短名单。

在尝试强制登录页面时,应特别注意以下方面的任何差异:

  • 状态码:在暴力攻击期间,返回的HTTP状态码对于绝大多数猜测可能是相同的,因为大多数猜测都是错误的。如果guess返回不同的状态码,则强烈表示用户名是正确的。无论结果如何,网站总是返回相同的状态码是最佳做法,但并不总是遵循这种做法。

  • 错误消息:有时返回的错误消息会有所不同,这取决于用户名和密码是否都不正确,或者只有密码不正确。最好的做法是网站在这两种情况下都使用相同的通用消息,但有时会出现一些小的键入错误。只要一个字符不在适当的位置,就可以使两条消息区别开来,即使在呈现的页面上该字符不可见的情况下也是如此。

  • 响应时间:如果大多数请求都是以类似的响应时间处理的,那么任何与此不同的请求都表明在幕后发生了一些不同的事情。这是猜测的用户名可能是正确的另一个迹象。例如,网站可能只会在用户名有效的情况下检查密码是否正确。这个额外的步骤可能会导致响应时间稍微增加。这可能很微妙,但攻击者可以通过输入过长的密码使延迟变得更明显,而网站需要更长的时间来处理该密码。

Lab: Username enumeration via different responses

不验证csrf,没啥好说的先爆破用户名,再爆破密码
在这里插入图片描述

Lab: Username enumeration via subtly different responses

通过对比返回包上微小的差异,可能是人为的,可能是失误吧。
在这里插入图片描述
用户名知道了,再爆破密码即可

Lab: Username enumeration via response timing

这一关对中国用户来说太痛苦了,网络波动太大了,根本区分不了
没办法,只能笛卡尔积+递增ip来进行爆破了,但是burp好像没法实现,额,只能自己写了
格式可能不太对,记得调一下

# python3.9
import requests
import re
import time
import threading
import queue


class TimeOutLib:
    url = ''
    # 使用线程安全的队列
    queue_data = queue.Queue(maxsize=0)  # 先进先出队列,这里就设置无限大好了
    queue_print = queue.Queue(maxsize=0)  # 先进先出队列,这里就设置无限大好了
    lib_session = ''
    csrf_token = ''
    thread_num = 50  # 想改线程数量的话改这里
    # money_num = 100
    # headers = {}
    # gift_cards_code_list = []
    # can_buy_gift_card_num = 0

    def __init__(self, url_):
        self.url = url_

    def start(self):
        print('start:')
        print("step 1 : response timing brute force going...")
        # 这里实现多线程和笛卡尔积(username x passwd)和ip增长和爆破  唉,四个功能 先写出来看看,要不要分函数吧
        # 设想一下,先建一个队列,队列是一个list包括[{ip,username,password}],反正笛卡尔积后也就1万个,就直接计算出来好了,方便一点
        # 因为输出的时候,线程会进行抢占,所以输出也要一个队列
        # 生成list
        # self.queue_data.put({'ip': '127.1.1.1', 'username': 'wiener', 'passwd': 'peter'})  # 测试数据
        self.create_brute_force_data()
        # 先获取session和csrf token
        self.get_session_and_csrf_token()
        # 先模拟一次登陆,然后尝试多线程
        # self.login_to_lib()
        # 尝试多线程
        thread_list = []
        for _ in range(self.thread_num):
            # thread = threading.Thread(target=self.login_to_lib())
            # thread = threading.Thread(target=self.login_to_lib)
            # 一步之差天壤之别,好好看看上面这俩代码有啥区别,一个是创建直接执行, 一个是创建 坑死我了,好好的多线程被我写成了单线程。
            thread = threading.Thread(target=self.login_to_lib)
            thread_list.append(thread)
        for t in thread_list:
            t.start()
        # 打印队列长度
        print("计算剩下的队列长度")
        while True:
            i = self.queue_data.qsize()
            print(i, end=" ")
            if i == 0:
                break
            time.sleep(10)

    def login_to_lib(self):  # 这个实验不需要CSRF和会话绑定,谁说的? 需要绑定,只是csrf用一次不会过期罢了
        login_url = self.url + 'login'  # 拼接登录用url
        # 进行登陆
        while True:
            # print("?")
            current_data = self.queue_data.get()
            headers =
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值