type
status
date
slug
summary
tags
category
icon
password
Authentication Bypasses-认证绕过
身份验证绕过以多种方式发生,但通常利用配置或逻辑中的一些缺陷。篡改以达到正确的条件。
- 隐藏输入
最简单的形式是依赖于网页/DOM中的隐藏输入。
- 删除参数
有时,如果攻击者不知道某个参数的正确值,他们可能会从提交中完全删除该参数,看看会发生什么。
- 强迫浏览
如果站点的某个区域没有通过配置得到适当的保护,则站点的该区域可能通过猜测/暴力强迫被访问。
The Scenario
本题要求绕过问题验证,上文案例示例了通过删除参数绕过验证,使用bp进行抓包。
通过删除参数绕过失败。

通过观察发现请求名中带有数字,通过修改数字为空或不存在的数字,可以绕过。
JWT tokens
Json Web Token简称JWT,是基于Json的一个公开规范,就是把用户信息通过加密生成的签名字符串进行安全传输。
JWT令牌的结构由三部分组成:


组成:
头部:加密算法、类型
载荷:用户的非敏感数据
签名字符串:随机字符串(推荐使用加密字符串,建议每隔一段时间更新一下)
3.JWT解码
直接使用在线解码JWT工具:

获取token的流程
浏览器发起请求登陆
1.用户提交用户名和密码给服务端,如果登录成功,使用jwt创建一个token,并给用户返回
创建的token分为三部分 header,payload,signature
1.1 header内部包含了算法,对对这一部分的json做base64url加密
1.2payload为自定义值,比如用户的信息,对此json做base64url加密
1.3把前两部分进行拼接,然后将拼接后的字符串进行加密加盐,最后对密文进行base64url加密
将此三段进行拼接就是jwt的token。
2.在用户访问时,后端对用户携带的token进行校验
2.1将token进行分割,对第二段进行base64url解密,获取pyload信息,检查token的有效时间
2.2由于三部部分的字符串不能反解,把前两段段再进行hs256加密
把token分割,获取前两部分的bash64串,对前两部分的bash64串加密进行hs256加密+加盐,把hash密文转bash64串,再和token的第三部分签名做比较,如果相等,表示token没有修改通过。
5.进行token越权使普通用户用管理员权限重置票数
先使用 bp抓包

使用在线解码工具进行JWT解密

得到荷载,可以看到admin为false,把false改为true,进行base64编码,和头部的base64编码进行拼接,最终得到,ew0KICAiYWxnIjogIkhTNTEyIg0KfQ.ew0KICAiaWF0IjogMTY3MDY1NDg0MiwNCiAgImFkbWluIjogInRydWUiLA0KICAidXNlciI6ICJKZXJyeSINCn0.
在线base64编码工具:
以上发生的情况为:后端知识解析他们的令牌,而没有验证正在创建令牌期间使用了什么加密操作。
7.使用的parseClaimsJws方法
parsePlaintextJwt 载荷为文本(不是Json),未签名
parseClaimsJwt 载荷为claims(即Json),未签名
parsePlaintextJws 载荷为文本(不是Json),已签名
parseClaimsJws 载荷为claims(即Json),已签名
8.不明白
10.要求使用TOM过期的token进行付款。
把token进行解析,更改header部分加密发那个凡是为none,再把过期时间更改一下。
Password reset
概念
这节课讲的是密码重置功能,它在大多数情况下是应用程序中被忽视的一部分,导致各种有趣的逻辑缺陷。
目标
教授如何在您的应用程序中安全地实现密码重置功能。
简介
我们每个人以前都在网站上使用过密码重置功能。每个网站都以不同的方式实现这个功能。在一些网站上,你必须回答其他网站上的一些问题,一封带有激活链接的电子邮件将发送给你。在这节课中,我们将介绍一些最常见的密码重置功能,并说明它可能出错的地方。
仍然有一些公司将密码以明文形式通过电子邮件发送给用户。有关几个例子,您可以查看http://plaintextoffenders.com/ 。 在这里,您会发现一些网站仍然以电子邮件的形式向您发送明文密码。这不仅会让你质疑网站的安全性,而且这也意味着他们以明文存储你的密码!
如何防止密码重置功能被滥用
在学习了如何滥用密码重置功能之后,你现在也应该知道如何保护自己的网站免受此类攻击。如果您想要所有缓解方法的详细描述,请查看这里:https://cheatsheetseries.owasp.org/cheatsheets/Forgot_Password_Cheat_Sheet.html
这节课将总结上面小抄中提到的要点。
如何使用安全问题进行用户验证
安全问题是查找用户有效性信息的简单方法,无需询问用户验证数据。问题是,安全问题的类型并不多,而且大多数问题的答案在许多用户中都是相同的。这使得攻击者很容易猜到问题和答案。
让猜测安全问题变得更困难的一个简单方法是让用户自己决定他们想要回答的问题。关于这个主题的更多信息可以在这里找到:https://cheatsheetseries.owasp.org/cheatsheets/Choosing_and_Using_Security_Questions_Cheat_Sheet.html#user-defined-security-questions
通过网络发送数据
通过网络向任何方向发送的所有信息都可以被攻击者读取。一些数据使攻击者更容易编译用户帐户上的关键信息,帮助他们绕过登录和密码重置限制。因此,在密码重置过程中,尽量不要通过网络发送用户名、电子邮件等帐户信息,因为这些信息不是用户自己输入的!
例如:如果您通过电子邮件向用户发送密码重置链接,请不要将用户名包含到密码重置表单中!用户不必在表单上看到他们的用户名,因为非恶意用户已经知道他们的名字。让攻击者尽可能难以收集到更多的信息。
关于密码重置令牌
密码重置令牌允许用户在没有关于用户验证的固有安全信息的情况下重置密码。因此它们应该是安全的。要猜出这样的记号应该很难。令牌也应该只在短时间内有效,并且应该在用户成功重置其密码后无效。
记录用户操作
单独的日志记录不能防止任何攻击,但它可以更容易地确定攻击发生了,以及攻击者如何试图绕过安全措施。您还可以使用日志来确定帐户是否真的被劫持了,以及是否必须将其归还给合法用户。您可以记录的操作有:安全性问题是如何得到回答的?与电子邮件被发送的时间相比,密码重置链接的访问发生在什么时候?有失败的尝试吗?
双因素认证
在两个或多个独立的设备上通过两个或多个不同的方式执行身份验证过程总是更安全。如果用户想要重置密码,可以要求他们输入通过短信、信使或类似方式发送给他们的验证码。这使得攻击者很难绕过验证过程,因为他们需要对另一个设备进行物理访问。另一方面,它要求用户提供关于联系他们的额外信息,这并不是所有人都欢迎的。
进一步的阅读
我们强烈建议进一步查看介绍中链接的小抄!当密码重置功能实现不正确时,攻击者很容易滥用它。只要遵循这里和小抄单中的一些建议,就可以让攻击者更难以滥用它!
Secure Passwords安全的密码
NIST密码标准
密码规则
以下是NIST最新标准提出的一些最重要的建议:
没有组合规则
不要要求用户在密码中至少使用一个大写字母和一个特殊字符。给他们机会,但不要强迫他们!
没有密码提示
如果你想让别人有更好的机会猜出你的密码,把密码写在贴在屏幕上的便签上。
没有安全问题
安全问题,也称为基于知识的身份验证(KBA)已经过时。问用户“你的宠物叫什么名字?”或类似的检查是否真的是他的东西,是非常不安全的。
如果你想让用户遵守并选择长且难以猜出的密码,你就不应该让他们在一段时间后不必要地更改密码。
最小8个字符
现在一个安全的密码应该至少有8个字符长(最多64个字符)。这是最小值,不是最大最小值!
支持所有UNICODE字符
您应该允许在密码中使用所有类型的UNICODE字符。这还包括表情符号和空白。
强度计
在密码创建页面添加强度计,以帮助用户选择一个强而安全的密码。
根据已知的错误选择检查密码
从以前的入侵资料库获得的密码
字典里的单词
重复或连续字符(例如' aaaaaa ', ' 1234abcd ')
特定于上下文的单词,例如服务的名称、用户名及其派生
可用性
除了上述建议,NIST标准还建议增加密码形式的可用性,以增加用户选择强而安全的密码的可能性。其中一些是:
允许粘贴到密码输入
用户应该能够在输入密码时使用“粘贴”功能。因为这方便了密码管理器的使用,它也增加了用户选择强密码的可能性。
允许显示密码
密码输入应该有一个选项来显示输入的密码,以帮助用户成功地输入密码。
提供一个强度计
在密码创建页面添加强度计,以帮助用户选择一个强而安全的密码。
提高帐户的安全性
不同的帐户使用不同的密码
最好不要对多个账户使用相同的密码,而是为每个账户使用不同的密码。
使用密码
使用密码短语生成器,如Diceware来生成密码短语。密码短语是由许多单词组成的密码,而不是随机生成的字符序列。这使得我们人类更容易记住它们。顺便说一句:越长越好!
使用密码管理器
如果你不能记住所有不同的密码,使用密码管理器创建一个并安全地存储你的密码。
使用双因素身份验证
如果可能的话,使用双因素身份验证方法为您的帐户添加额外的安全层。
存储密码
在创建了一个强大而安全的密码之后,它还必须以一种安全的方式存储。NIST给出了应用程序应该如何处理密码以及如何安全存储密码的建议。
密码应该如何存储?
首先:使用加密和受保护的通道来请求密码
验证者在请求记忆秘密时,应使用经过批准的加密和经过验证的受保护通道,以抵抗窃听和MitM(中间人)攻击。
抵抗离线攻击
密码应该以一种能够抵抗脱机攻击的形式存储。
使用盐
密码在存储之前应该加盐。salt的长度应该至少有32位,并且应该任意选择,以减少存储散列之间的salt值冲突。
使用哈希
在存储密码之前,应该使用单向密钥推导函数对其进行散列。该函数将密码、salt和成本因子作为输入,然后生成密码散列。
合适的键派生函数示例:
基于密码的密钥推导函数2 (PBKDF2)(尽可能大,至少10,000次迭代)
气球
密钥派生函数应使用经批准的单向函数,例如:
关键哈希消息认证码(HMAC)
SP 800-107中任何认可的哈希函数
安全哈希算法3 (SHA-3)
小脑模型
kccak消息认证码(KMAC)
可定制的抖动(cSHAKE)
ParallelHash
记忆硬键派生功能
使用内存硬密钥派生函数,进一步增加执行攻击所需的代价。
高成本因素
密钥派生函数的成本因素(迭代次数)应该在验证服务器性能允许的范围内尽可能大。(至少10,000次迭代)