身份验证绕过
身份验证绕过以多种方式发生,但通常会利用配置或逻辑中的某些缺陷。篡改以达到正确的条件。
隐藏输入
最简单的形式是依赖于网页/DOM 中的隐藏输入。
删除参数
有时,如果攻击者不知道参数的正确值,他们可能会从提交中完全删除该参数,以查看会发生什么情况。
比如需要提交问题通过验证,但是可以从接口处删除问题参数,则可以不提交问题也能通过身份验证。
最近(2016 年)的示例 (Paypal 2FA Bypass) 是身份验证绕过的一个很好的示例。他无法收到带有代码的短信,因此他选择了提供的 替代方法,涉及安全问题。使用代理,完全删除了参数......并赢了
强制浏览
如果站点的某个区域未通过配置得到适当保护,则可以通过猜测/暴力破解来访问该站点的该区域。
JWT tokens
许多应用程序使用 JSON Web 令牌 (JWT) 来允许客户端指示身份,以便在身份验证后进行进一步交换。
JWT token的结构
JWT是可以解码的
0x02
将题目的jwt在WebWolf的JWT中,将payload的user_name中的值复制到token位置提交。
获取JWT token的过程
在此流程中,您可以看到用户在成功对服务器进行身份验证时使用用户名和密码登录 返回。服务器创建一个新令牌,并将此令牌返回给客户端。当客户端连续 调用服务器,它将新令牌附加到“Authorization”标头中。 服务器读取令牌并首先验证签名,验证成功后,服务器使用 令牌中用于标识用户的信息。
claims
令牌包含用于标识用户的声明以及服务器满足请求所需的所有其他信息。 请注意,不要将敏感信息存储在令牌中,并始终通过安全通道发送
密码重置
本课讲授密码重置功能,大多数情况下,密码重置功能是应用程序中被忽视的部分 导致各种有趣的逻辑缺陷。
我们每个人都会以前在网站上使用过密码重置功能。每个网站都实现 以不同的方式实现此功能。在某些网站上,您必须回答其他网站上的一些问题,例如电子邮件 激活链接将发送给您。在本课中,我们将介绍一些最常见的密码 重置功能并显示可能出错的地方。
仍然有一些公司会通过电子邮件将密码以明文形式发送给用户。举几个例子 你可以看看 Plain Text Offenders。在这里,您将找到仍然向您发送明文的网站 电子邮件中的密码。这不仅会让您质疑网站的安全性,而且还意味着它们会存储 您的密码是明文的!
0x02
点击忘记密码,在webwolf的main处找到邮件,然后用你的账户名@@owasp.org,输入新的密码,点击访问
安全问题
这一直是一个问题,对于许多网站来说仍然是一个问题,当您丢失密码时,网站会询问您 对于您在注册过程中回答的安全问题。但是这些安全问题,可能并不安全,能被暴力破解,或被猜到。
如果攻击者回答了问题,则可能修改掉你的账户密码。
安全问题的问题
虽然安全问题乍一看似乎是进行身份验证的好方法,但它们 有一些大问题。
“完美”的安全问题应该很难破解,但很容易记住。答案也需要固定, 所以它不能改变。
只有少数问题符合这些标准,几乎没有一个适用于任何人。
如果您必须选择一个安全问题,我们建议您不要如实回答。
为了进一步阐述这个问题,有一个小任务给你:下面列出了一些常见的安全问题。 如果你选择一个,它会向你展示为什么你选择的问题并不像人们想象的那么好。
创建密码重置链接
创建密码重置链接时,需要确保:
-
它是带有随机令牌的唯一链接
-
它只能使用一次
-
该链接仅在有限的时间内有效。
发送带有随机令牌的链接意味着攻击者无法通过启动 阻止用户。该链接不应多次使用,因此无法再次更改密码。 超时对于限制攻击窗口是必要的,拥有链接为攻击者开辟了很多可能性。
如何防止滥用密码重置功能
在学习如何滥用密码重置功能之后,您现在还应该知道如何保护自己的网站免受此类攻击。如果您想全面了解所有缓解方法,请查看此处:Forgot Password - OWASP Cheat Sheet Series
本课将总结上面备忘单中提到的要点。
如何使用安全问题进行用户验证
安全问题是一种简单的方法,可以在不要求用户提供验证数据的情况下查找有关用户有效性的信息。问题是,安全问题的类型并不多,而且大多数问题的答案在许多用户中都是相同的。这使得攻击者很容易猜测问题和答案。
使猜测安全问题变得更加困难的一个简单方法是让用户自己决定他们想要回答的问题。有关此主题的更多信息,请访问:Choosing and Using Security Questions - OWASP Cheat Sheet Series
通过网络发送数据
通过网络向任何方向发送的所有内容都可以被攻击者读取。某些数据使攻击者更容易编译用户帐户上的关键信息,以帮助他们绕过登录和密码重置限制。因此,在密码重置过程中,尽量不要通过网络发送用户自己输入的帐户信息(如用户名、电子邮件等)!
例如:如果您通过电子邮件向用户发送密码重置链接,请不要以任何方式将用户名包含在密码重置表单中!用户不必在窗体上看到他们的用户名,因为非恶意用户已经知道他们的名字。使攻击者尽可能难以收集更多信息。
关于密码重置令牌
密码重置令牌允许用户重置密码,而无需提供有关用户验证的固有安全信息。因此,它们应该是安全的。应该很难猜到这样的代币。令牌也应仅在短时间内有效,并且在用户成功重置密码后应无效。
记录用户操作
仅靠日志记录无法阻止任何攻击,但它可以更轻松地确定攻击是否发生以及攻击者如何试图绕过安全性。您还可以使用日志来确定帐户是否真的被劫持,以及是否必须将其归还给合法用户。您可以记录的操作包括: 安全问题是如何得到解答的?与发送 e-amil 的时间相比,何时访问密码重置链接?有失败的尝试吗?
双因素身份验证
在两个或多个单独的设备上通过两种或多种不同的方式执行身份验证过程总是更安全的。如果用户想要重置密码,您可以要求他们输入通过短信、Messenger 或类似方式发送给他们的验证码。这使得攻击者很难绕过验证过程,因为他们需要对另一台设备进行物理访问。 另一方面,它要求用户提供有关与他们联系的其他信息,这并不欢迎每个人
安全的密码
NIST密码标准
NIST 密码标准(也称为特殊出版物 (SP) 800 系列)是为实施安全密码系统提供建议的指南。
密码规则
以下是最新的NIST标准提出的一些最重要的建议:
-
无组成规则
例如,不要要求用户在其密码上使用至少一个大写字母和一个特殊字符。 给他们机会,但不要强迫他们! -
没有密码提示
如果您希望人们有更好的机会猜到您的密码,请将其写在屏幕上的便条上。 -
没有安全问题 安全问题
(也称为基于知识的身份验证 (KBA))已过时。 问用户“你的宠物叫什么名字?”或类似的东西来检查它是否真的是他,是非常不安全的。 -
无需更改密码如果您希望用户遵守并选择较长、难以猜测的密码,则不应让他们在一段时间后不必要地更改这些密码。
-
最小长度为 8 个字符 现在的安全密码长度应至少为 8 个字符(最多 64 个字符
)。 这是最低限度,而不是最高限度! -
支持所有 UNICODE 字符 您应该允许在密码中使用所有类型的 UNICODE 字符
。 这还包括表情符号和空格。 -
力量计 在密码创建页面添加强度计
,帮助用户选择强而安全的密码。 -
根据已知的错误选择检查密码
-
从以前的违规语料库中获取的密码
-
字典单词
-
重复或连续字符(例如“aaaaaa”、“1234abcd”)
-
特定于上下文的词语,例如服务名称、用户名及其衍生词
-
可用性
除了上述建议外,NIST标准还建议提高密码表单的可用性,以增加用户选择强大且安全的密码的可能性。其中一些是:
-
允许粘贴到密码输入中 用户在输入
密码时应该能够使用“粘贴”功能。 由于这有利于使用密码管理器,因此也增加了用户选择强密码的可能性。 -
允许显示密码 密码输入应具有显示输入密码的选项,以帮助用户成功输入密码
。 -
提供强度计 在密码创建页面上添加强度计
,以帮助用户选择强而安全的密码。
0x04
使用随机密码生成,创建包含如下条件的密码。
您的密码安全吗?
你呢?您的密码安全吗?
有些网站允许测试您的某个帐户是否在过去的数据泄露中被泄露。
转到每个示例的 Have I Been Pwned 或 DEHASHED,并测试您的帐户是否遭到破坏。 如果是这样,最好立即更改密码!
您可以做些什么来提高帐户的安全性?
-
对不同的帐户使用不同的密码 不要对多个帐户使用相同的密码,而是为每个帐户
使用不同的密码是一件好事。-
使用密码短语
使用密码生成器(如 Diceware)生成密码短语。 密码短语是由多个单词组成的密码,而不是随机生成的字符序列。 这使得我们人类更容易记住它们。顺便说一句:时间越长越好! -
使用密码管理器 如果您不记得所有不同的密码,请使用密码管理器
创建一个密码,然后安全地存储您的密码。
-
-
使用双因素身份验证 如果可能,请使用双因素身份验证
方法为您的帐户添加额外的安全层。
存储密码
创建强大且安全的密码后,还必须以安全的方式存储密码。 NIST 提供了有关应用程序应如何处理密码以及如何安全地存储密码的建议。
密码应该如何存储?
-
首先:使用加密和受保护的通道来请求密码
验证者在请求记忆的机密时应使用经批准的加密和经过身份验证的受保护通道 以提供对窃听和 MitM(中间人)攻击的抵抗力。 -
抵御离线攻击 密码应以能够抵御离线攻击
的形式存储。 -
使用盐
在存储密码之前,应对其进行盐渍处理。 盐的长度应至少为 32 位,并且应任意选择,以最大程度地减少存储哈希之间的盐值冲突。 -
使用哈希
在存储密码之前,应使用单向密钥派生函数对其进行哈希处理。 该函数将密码、盐和成本因子作为输入,然后生成密码哈希。
合适的密钥派生函数示例:-
基于密码的密钥派生函数 2 (PBKDF2)(尽可能大,至少⇒ 10.000 次迭代)
-
气球
-
密钥派生函数应使用经批准的单向函数,例如:
-
密钥哈希消息身份验证代码 (HMAC)
-
SP 800-107 中任何批准的哈希函数
-
安全哈希算法 3 (SHA-3)
-
CMAC公司
-
Keccak 消息验证码 (KMAC)
-
可定制的 SHAKE (cSHAKE)
-
ParallelHash (英语)
-
-
-
内存硬键派生函数 使用内存硬键派生函数
,进一步增加执行攻击所需的成本。 -
高成本因子 密钥派生函数的成本因子
(迭代计数)应与验证服务器性能允许的最大一样大。(至少 10.000 次迭代)