webgoat- Identity & Auth Failure 识别和认证失败

Authentication Bypasses 绕过身份认证

01 

身份验证绕过以多种方式发生,但通常会利用配置或逻辑中的某些缺陷,篡改内容以达到目的。

隐藏输入

最简单的形式是依赖于网页/DOM 中的隐藏输入。

删除参数

有时,如果攻击者不知道参数的正确值,他们可能会从提交中完全删除该参数,以查看会发生什么情况。

比如需要提交问题通过验证,但是可以从接口处删除问题参数,如果没有验证,那么就也能通过啦。

强制浏览

如果站点的某个区域未通过配置得到适当保护,则可以通过猜测/暴力破解来访问该站点的该区域。

02 2FA Password Reset

最近(2016 年)的示例 (Paypal 2FA Bypass) 是身份验证绕过的一个很好的示例。他无法收到带有代码的短信,因此他选择了回答安全问题,但是可以用代理工具,删除安全问题直接提交请求也通过了。

作业要求回答问题,重置密码,但是这些问题你可能早都忘记了,那么如何重置密码?

抓包,将问题0和问题1改为问题2和问题3然后随便填

(本来我以为是删除问题0和问题1即可,但这样未解决)

insecure login不安全的登录


Encryption is a very important tool for secure communication,we will find out why it should always be employed when sending sensitive data.

Goals

  • The user should have a basic understanding of packet sniffer usage 数据包利用

  • The user will be able to intercept and read unencrypted requests 拦截并阅读未加密请求

0x02


点击login,可以看到payload里的username和password,输入后点击submit即可。


这题的目的是说明,信息传输过程中需要加密,如不加密,可能用户名和密码会泄露。

JWT tokens

许多应用程序使用 JSON Web 令牌 (JWT) 来允许客户端指示身份,以便在身份验证后进行进一步操作。

JWT token的结构

The token is base64 encoded and consists of three parts:

  • header

  • claims

  • signature

Both header and claims consist are represented by a JSON object. The header describes the cryptographic operations applied to the JWT and optionally, additional properties of the JWT. The claims represent a JSON object whose members are the claims conveyed by the JWT.

JWT是可以解码的

JWT介绍

JWT (JSON Web Token) 是一种用于在网络应用间传递信息的编码方式。它由三个部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature)。

JWT 的头部包含了该令牌的类型(即 "JWT")和所使用的签名算法,如 HMAC SHA256 或 RSA。

载荷是 JWT 中包含的数据段,也称为声明(Claims)。有三种类型的声明:注册声明(Registered Claims)、公共声明(Public Claims)和私有声明(Private Claims)。注册声明包括 iss (签发者)、sub (面向用户)、exp (过期时间) 等。公共声明可以由用户定义使用,但需要避免冲突。私有声明则是为了在同意使用这些声明而创建的它们之间的共享规范。

签名部分使用了编码后的头部、编码后的载荷,以及一个密钥,来生成签名。通过使用头部中指定的算法对这些数据进行加密操作,生成签名部分。这个签名部分用于验证令牌的真实性和完整性。

JWT 通常用于身份验证和授权机制。在客户端登录认证成功后,服务器会生成一个 JWT,并将其返回给客户端。客户端在之后的请求中会携带这个 JWT,供服务器验证用户身份和权限。

JWT 具有以下优点:
1. 简洁:JWT 是一个紧凑的令牌,易于传输和存储。
2. 自包含:JWT 包含了所有必要的信息,避免了对服务器的查询操作。
3. 可扩展:JWT 的载荷部分可以包含自定义声明,以满足特定需求。

然而,需要注意的是,JWT 是基于令牌的验证机制,而不是基于会话的验证机制。因此,在一些场景中可能需要采取额外的安全措施来防止信息被篡改或盗取。

如下为一个真实应用,就采用了JWT和jsessionid来进行授权,一个代表认证,一个代表会话。

JWT 声明滥用

JWT 声明滥用是指在 JSON Web 令牌 (JWT) 中不当或未经授权地操纵声明。JWT 是一种紧凑且独立的方式,用于表示两方之间的信息。它由标头、有效负载(声明)和签名组成。

JWT 声明滥用可能以不同的方式发生:

  • 未经授权的声明:恶意用户可能会尝试向 JWT 添加未经授权的声明,以获取对他们无权访问的某些功能或资源的访问权限,例如,普通用户尝试修改其 JWT 以声明管理员权限。

  • 篡改声明:攻击者可能会尝试修改 JWT 中现有声明的值,以操纵自己的标识或更改其权限。例如,他们正在更改“user_id”声明以模拟其他用户。

  • 过多的声明:攻击者可能尝试在 JWT 中包含许多不必要或虚假的声明,以增加令牌大小,并可能破坏系统性能或导致其他问题。

  • 过期或更改的过期声明:如果攻击者可以修改“exp”声明以延长令牌的过期时间,则可以有效地获得超出其预期会话的访问权限。

  • 重放攻击:攻击者可能尝试重用旧会话中的有效 JWT 来模拟原始用户或利用限时功能。

  • 密钥声明操作:在某些情况下,“kid”(密钥 ID)声明可能会被误用,如前面的答案中所述。攻击者可能会尝试操纵“kid”声明,以使用不同的密钥进行签名验证。

为了防止 JWT 声明滥用,必须在客户端和服务器端实施适当的验证和验证机制。验证声明,以确保它们有效、授权且与用户的上下文相关。此外,请始终验证 JWT 的签名,以确保令牌的完整性并防止篡改。遵循 JWT 实施、安全密钥管理和定期密钥轮换的最佳实践也有助于降低 JWT 声明滥用的风险。

在以下两节中,我们将深入探讨标头声明滥用的一些示例,让您了解它们的工作原理以及如何保护应用程序。

解码 JWT 令牌

让我们尝试解码 JWT 令牌,为此您可以使用 WebWolf 中的 JWT 功能。 给定以下令牌:

eyJhbGciOiJIUzI1NiJ9.ew0KICAiYXV0aG9yaXRpZXMiIDogWyAiUk9MRV9BRE1JTiIsICJST0xFX1VTRVIiIF0sDQogICJjbGllbnRfaWQiIDogIm15LWNsaWVudC13aXRoLXNlY3JldCIsDQogICJleHAiIDogMTYwNzA5OTYwOCwNCiAgImp0aSIgOiAiOWJjOTJhNDQtMGIxYS00YzVlLWJlNzAtZGE1MjA3NWI5YTg0IiwNCiAgInNjb3BlIiA6IFsgInJlYWQiLCAid3JpdGUiIF0sDQogICJ1c2VyX25hbWUiIDogInVzZXIiDQp9.9lYaULTuoIDJ86-zKDSntJQyHPpJ2mZAbnWRfel99iI

复制粘贴以下 token 并解码 token,能在 token 中找到用户吗?

 0x02

将题目的jwt在WebWolf的JWT中,将payload的user_name中的值复制到token位置提交。

获取JWT token的过程

1、客户端发送用户名和密码登录。

2、服务端创建一个带密码的JWT

3、返回给浏览器

4、浏览器访问服务的时候在Auth header带上JWT。

5、服务端验证JWT签名,从JWT中获取用户信息。

6、将结果返回给客户端。

在此流程中,您可以看到用户在成功对服务器进行身份验证时使用用户名和密码登录 返回。服务器创建一个新令牌,并将此令牌返回给客户端。当客户端连续 调用服务器,它将新令牌附加到“Authorization”标头中。 服务器读取令牌并首先验证签名,验证成功后,服务器使用 令牌中用于标识用户的信息。 

claims

载荷包含用于标识用户的信息以及满足服务器请求所需的所有其他信息。 请注意,不要将敏感信息存储在令牌中,并始终通过安全通道发送

JWT 签名

如果令牌未对客户端应用程序进行签名,则在将每个 JWT 令牌发送到客户端之前,至少应对其进行签名 将能够更改令牌的内容。此处定义了签名规范,此处描述了您可以使用的具体算法: 基本上可以归结为使用“具有 SHA-2 功能的 HMAC”或“具有 RSASSA-PKCS1-v1_5/ECDSA/RSASSA-PSS 的数字签名”功能 用于对令牌进行签名。

检查签名

一个重要的步骤是在执行任何其他操作之前验证签名,让我们尝试查看您需要的一些内容 在验证令牌之前要注意。

分配

尝试更改您收到的令牌并通过更改令牌成为管理员用户,并在您成为管理员后重置投票.

jwt在线Whttps://dinochiesa.github.io/jwt/

作业0x06

又是一个我靠源码解决的,因为不会做。

分别使用给的三个账号登录,投票,在post请求可以看到设置了key为accesstoken的cookie。

解码显示如下,可以看到admin为false,那么想到只要我们把admin改为true,然后vote就可以了。

但是JWT解码,无法解出签名,不知道签名,就无法逆向加密为JWT。

 看源码,在login方法里,看到了加密token的过程

写一个加密,可以直接输出JWT值。

   public static void main(String[] args) {
        Claims claims = Jwts.claims().setIssuedAt(Date.from(Instant.now().plus(Duration.ofDays(10))));
        claims.put("admin", "true");
        claims.put("user", "Tom");
        String token =
                Jwts.builder()
                        .setClaims(claims)
                        .signWith(io.jsonwebtoken.SignatureAlgorithm.HS512, JWT_PASSWORD)
                        .compact();
        System.out.println(token);
    }

生成JWT

eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE3MDAzMDgxOTgsImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ.D7vi0ozYz4w6fVf7BjRvF_d5z0rSz3FEigpUu1dLAlFOoNK9BYHNpqrxIpud7pLkY8CNf_hs55KKV_Zz0xYPAQ

解密可以看到信息。

 再看源码,当请求如下方法,当claim包含admin的值为true时,调用reset方法重置票数。

然后使用burpsuite请求一下解决

查看文章WebGoat靶场JWT tokens四五关通关教程(JWT token安全)_webgoat jwt tokens_No_1_is_me的博客-CSDN博客 原来可以修改header中的加密算法为none,将header和body分别用base64加密,发送请求即可。这学到了,原来header和body都是base64加密得到的,且还可以修改加密算法为无。

 

查看源码 在进行jwt解析时调用的这一句,查了一下,竟然不校验签名是否为空,如果你想要检查签名是否为空,你需要自己编写额外的代码来进行检查。你可以在解析 JWT 之后,检查 jwt 对象的 getSignature() 方法返回的是否为空。

本题的启示是,在进行jwt签名解析时,要校验签名算法。 

作业 0x08

进行codereview

两段代码只有一个方法不一样

当选择一个库来帮助处理 JWT 令牌时,请确保:

  • 验证令牌时,请在代码中使用正确的方法。

  • 添加测试用例并验证算法混淆是不可能的。

  • 作为安全团队,编写一个实用程序方法供团队使用,这些方法封装了库,以确保团队使用正确的分析逻辑。

 作业0x11

作弊做法,接口/JWT/secret/gettoken可以返回token,直接在代码中修改username为WebGoat,然后访问这个接口即可返回token。

正确做法,参考WebGoat靶场JWT tokens四五关通关教程(JWT token安全)_webgoat jwt tokens_No_1_is_me的博客-CSDN博客

密钥是可以用工具解开的。

作业0x13

WebGoat靶场搭建及通关记录(一)_51CTO博客_webgoat通关攻略

我这里直接把加密算法改为None,修改exp,生成新的jwt后,使用bp请求 

这题的关键点在于历史jwt token在日志里显示了。 

JWT 声明滥用

JWT 声明滥用是指在 JSON Web 令牌 (JWT) 中不当或未经授权地操纵声明。JWT 是一种紧凑且独立的方式,用于表示两方之间的信息。它由标头、有效负载(声明)和签名组成。

JWT 声明滥用可能以不同的方式发生:

  • 未经授权的声明:恶意用户可能会尝试向 JWT 添加未经授权的声明,以获取对他们无权访问的某些功能或资源的访问权限,例如,普通用户尝试修改其 JWT 以声明管理员权限。

  • 篡改声明:攻击者可能会尝试修改 JWT 中现有声明的值,以操纵自己的标识或更改其权限。例如,他们正在更改“user_id”声明以模拟其他用户。

  • 过多的声明:攻击者可能尝试在 JWT 中包含许多不必要或虚假的声明,以增加令牌大小,并可能破坏系统性能或导致其他问题。

  • 过期或更改的过期声明:如果攻击者可以修改“exp”声明以延长令牌的过期时间,则可以有效地获得超出其预期会话的访问权限。

  • 重放攻击:攻击者可能尝试重用旧会话中的有效 JWT 来模拟原始用户或利用限时功能。

  • 密钥声明操作:在某些情况下,“kid”(密钥 ID)声明可能会被误用,如前面的答案中所述。攻击者可能会尝试操纵“kid”声明,以使用不同的密钥进行签名验证。

为了防止 JWT 声明滥用,必须在客户端和服务器端实施适当的验证和验证机制。验证声明,以确保它们有效、授权且与用户的上下文相关。此外,请始终验证 JWT 的签名,以确保令牌的完整性并防止篡改。遵循 JWT 实施、安全密钥管理和定期密钥轮换的最佳实践也有助于降低 JWT 声明滥用的风险。

声明滥用

当标头信息被篡改或操作不当时,可能会发生标头声明误用

JSON Web 密钥 URL (JKU)

JKU 是 JWT 规范的一部分,它允许 JWT 使用者获取动态验证令牌签名所需的公钥。 它是指向 JSON Web 密钥集 (JWKS) 端点的 URL,其中包含颁发者用于对 JWT 进行签名的公钥。

JKU 示例如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#efefef"><code>{
"jku": "https://example.com/.well-known/jwks.json"
}</code></span></span></span></span>

脆弱性

JWT 声明误用 JKU 当使用弱密钥或可预测的密钥对 JWT 进行签名并且服务器提供指向托管公钥的外部位置的 JKU 时,就会出现漏洞。

攻击者可以通过构建具有恶意声明的 JWT 并使用 来诱骗服务器使用弱密钥或纵的密钥来验证 JWT,从而利用此漏洞。 这完全取决于应用程序内部使用的库。 默认情况下,某些库会阻止从随机服务器下载,并使用允许的 URL 列表。 但是,对 URL 进行过滤非常具有挑战性,也可以绕过这一点。jku

开发步骤:
  • 识别 JKU 端点:攻击者首先需要在应用程序的 JWT 处理逻辑或任何公开的配置中找到 JKU 端点

  • 生成恶意 JWT:使用恶意声明制作 JWT,更改或添加声明以获得未经授权的访问或提升权限。

  • 对 JWT 进行签名:使用您自己的私钥对恶意 JWT 进行签名。

  • 将 JWT 发送到服务器:将带有恶意声明的构建的 JWT 发送到服务器。

  • 服务器验证:服务器在收到 JWT 后,使用从 JWKS 端点获取的公钥验证签名。

  • 成功攻击:如果服务器使用弱密钥或纵的密钥来验证 JWT,攻击者将获得未经授权的访问或执行其预期的漏洞利用。

缓解

为了防止JKU滥用JWT声明,开发人员和安全专业人员应遵循以下最佳实践:

  • 白名单:利用白名单来验证从令牌接收的 JKU 是否存在于允许列表中。 使用 String 比较函数比较 url 时要小心,请改用白名单,并从 .jku

  • 静态密钥:避免将 JKU 与托管在外部端点上的公钥一起使用。 相反,请使用安全管理和定期更新的静态密钥。

  • 签名验证:确保服务器正确验证 JWT 签名,并拒绝签名无效或纵的令牌。

  • JWT 验证:仔细验证和清理所有 JWT 声明,以防止注入攻击和未经授权的访问。

  • 审核和监控:定期审核 JWT 使用情况,监控可疑活动,并实施异常检测机制。

  • 安全测试:定期执行安全测试,包括渗透测试和代码审查,以识别和修复潜在漏洞

声明滥用

接下来,我们将探讨在 JSON Web 令牌 (JWT) 中滥用密钥Kid 声明的安全隐患

JSON Kid

kid 指示应使用 JSON Web 密钥集 (JWKS) 中的哪个密钥来验证 JWT 的签名。 如果滥用,攻击者可以利用此漏洞获得对敏感资源的未经授权的访问或执行权限提升。

一个示例 KID 如下所示:

{
  "alg": "RS256",
  "kid": "my_rsa_key"
}

脆弱性

当声明被滥用时,通常意味着“kid”的值纵为指向与用于对令牌进行签名的密钥不同的密钥。 这种操作会导致各种安全问题:kid

  • 密钥混淆攻击:在这种攻击中,攻击者操纵“kid”声明值,使其指向与用于对令牌进行签名的密钥不同的密钥。 因此,JWT 的接收者将使用错误的密钥验证签名,从而允许攻击者冒充其他用户或执行未经授权的操作。

  • 密钥枚举:如果声明未受到适当保护,或者只是一个递增的数字或易于预测的值,则攻击者可能会尝试猜测或枚举有效的“kid”值。 通过这样做,他们可能会伪造具有不同值的 JWT,以查找系统中的漏洞或弱点。kidkid

  • 密钥欺骗:在这种攻击中,攻击者使用指向不存在或无效密钥的伪造声明来制作 JWT。 其目的是绕过签名验证,并可能获得对资源或功能的未经授权的访问。kid

  • 密钥覆盖:攻击者可能会在令牌传输或处理过程中尝试覆盖或修改声明,以指向与最初预期不同的密钥。 此操作可能导致签名验证失败或其他安全问题。kid

  • 无kid令牌:如果系统不需要声明的存在,攻击者可能会尝试创建JWT,而根本不包含“kid”声明。 如果收件人采用默认密钥或已知密钥,则此遗漏可能会导致漏洞,而默认密钥或已知密钥可能不安全。kid

  • 不安全的密钥存储:如果“kid”声明与其他弱安全做法(例如以明文形式存储密钥或使用弱加密)结合使用,则攻击者可能会获取有效的“kid”值并利用关联的密钥。

开发步骤:
  • 识别 kid 端点:攻击者必须首先在应用程序的 JWT 处理逻辑或任何公开的配置中找到 kid 端点。

  • 生成恶意 JWT:使用恶意声明制作 JWT,更改或添加声明以获得未经授权的访问或提升权限。

  • 生成一个,使您能够知道验证密钥。kid

  • 将 JWT 发送到服务器:将带有恶意声明的构建的 JWT 发送到服务器。

  • 服务器验证:收到 JWT 后,服务器使用“精心制作的”KID 验证签名。

  • 成功攻击:如果服务器使用弱密钥或纵的密钥来验证 JWT,攻击者将获得未经授权的访问或执行其预期的漏洞利用。

缓解

为了防止 JWT 声明与 KID 一起使用,开发人员和安全专业人员应遵循以下最佳实践:

  • 验证:始终验证“kid”声明,并确保它指向适合签名验证的受信任密钥。

  • 密钥轮换:定期轮换用于对 JWT 进行签名的密钥,并相应地更新相应的“kid”声明。

  • 使用强密钥:确保使用强加密密钥对令牌进行签名。

  • 访问控制:将对密钥和签名服务的访问限制为仅授权人员。

  • 速率限制:实施速率限制以防止攻击者遍历可能的“kid”值。

  • 监控:监控和记录与 JWT 相关的活动,以检测潜在的滥用或可疑行为。

通过遵循这些最佳实践,您可以降低使用“kid”字段滥用 JWT 声明的风险,并增强系统的整体安全性。

作业0x18

webgoat-JWT tokens-Final challenges - 知乎 (zhihu.com)

JSON Web Tokens - jwt.io

这个题是一个SQL注入问题,代码使用 SQL查询key值在数据库中对应的值,获得的就是密钥。

然后这个SQL语句没有过滤,所以可以通过注入,让程序用我们给出的秘钥加密

Password reset密码重置

01 密码重置

本课讲授密码重置功能,大多数情况下,密码重置功能是应用程序中被忽视的部分 导致各种有趣的逻辑缺陷。

我们每个人都会以前在网站上使用过密码重置功能。每个网站都实现 以不同的方式实现此功能。在某些网站上,您必须回答其他网站上的一些问题,例如电子邮件 激活链接将发送给您。

仍然有一些公司会通过电子邮件将密码以明文形式发送给用户。举几个例子 你可以看看 Plain Text Offenders,这不仅会让您质疑网站的安全性,而且还意味着它们会存储 您的密码是明文的!

02 先看下webwolf是否可用

点击忘记密码,给自己邮箱发送一个邮件,在webwolf的main处找到邮件,邮件中有密码

然后用你的账户名@@owasp.org,输入新的密码,点击访问

03 了解帐户是否存在

如前所述,在密码重置期间,您通常会发现不同的消息,具体取决于电子邮件是否 地址是否存在。就其本身而言,这可能看起来没什么大不了的,但它可以为攻击者提供以下信息 可用于网络钓鱼攻击。如果攻击者知道您在某个站点上有一个注册帐户,则攻击者可以 例如,创建网络钓鱼邮件并将其发送给用户。用户可能更倾向于单击该电子邮件,因为 用户在网站上拥有有效的帐户。另一方面,对于某些网站来说,这并不重要,但是 一些网站用户想要更多的隐私。

以下截图取自真实网站:

04 安全问题

This has been an issue and still is for a lot of websites, when you lost your password the website will ask you for a security question which you answered during the sign up process. Most of the time this list contains a fixed number of question and which sometimes even have a limited set of answers. In order to use this functionality a user should be able to select a question by itself and type in the answer as well. This way users will not share the question which makes it more difficult for an attacker.

One important thing to remember the answers to these security question(s) should be treated with the same level of security which is applied for storing a password in a database. If the database leaks an attacker should not be able to perform password reset based on the answer of the security question.

用户会在社交网站上分享个人信息,所以使用安全问题来进行密码重置是不安全的,一个很好的安全问题资源:

Home - Good Security Questions

作业给了一个已知用户账号和安全问题,要求找出另外一个用户的密码 

使用爆破,插入爆破点和颜色payload

 

 可以看到有个返回length不一样,查看是成功的。

 

05 安全问题的问题

虽然安全问题乍一看似乎是进行身份验证的好方法,但它们 有一些大问题。

“完美”的安全问题应该很难破解,但很容易记住。答案也需要固定, 所以它不能改变。

只有少数问题符合这些标准。

如果您必须选择一个安全问题,我们建议您不要如实回答。

作业要求查看安全问题。

问题为什么不安全?

1、问题可能很容易猜测 如喜欢的颜色,动物。

2、问题可以在社交网络找到答案。如生日、所在的城市。

创建密码重置链接时,需要确保:

  • 它是带有随机令牌的唯一链接(带有token,防止被劫持重放)

  • 它只能使用一次

  • 该链接仅在有限的时间内有效。(比如修改密码链接24h有效)

发送带有随机令牌的链接意味着攻击者无法通过启动 阻止用户。该链接不应多次使用,因此无法再次更改密码。 超时对于限制攻击窗口是必要的,拥有链接为攻击者开辟了很多可能性。

参考【webGoat】Broken Authentication_红日 webgoat 启动_黑色地带(崛起)的博客-CSDN博客

题目要求重置tom的密码,并登录。 点击忘记密码,输入tom的邮箱,但是我们不是tom,是收不到邮箱的。

 

1、点击重置密码,填写自己的webwolf邮箱

2、在邮箱中找到链接,发现这个链接带了一个token,token用来标识用户。只要知道tom的token就可以重置密码了。

3、重置密码,填写tom的邮箱,点击发送后抓包,并修改抓包的参数中的host为wolf的地址,让wolf收到这个链接。(为什么要这样做?)

4、在wolf的incoming requests中找到这个请求,这个就是tom的token

5、使用自己邮箱中修改密码那个链接拼接上tom这个token,然后重置密码。

6、使用tom的邮箱和重置后的密码登录。

07 如何防止滥用密码重置功能

在学习如何滥用密码重置功能之后,您现在还应该知道如何保护自己的网站免受此类攻击。如果您想全面了解所有缓解方法,请查看此处: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 次迭代)

    • 气球

    • 密钥派生函数应使用经批准的单向函数,例如:

  • 内存硬键派生函数 使用内存硬键派生函数
    ,进一步增加执行攻击所需的成本。

  • 高成本因子 密钥派生函数的成本因子
    (迭代计数)应与验证服务器性能允许的最大一样大。(至少 10.000 次迭代)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值