身份认证漏洞-16个实验(全)
前言:
介绍:
博主:网络安全领域狂热爱好者。
殊荣:华为云博主、CSDN网络安全领域优质创作者(CSDN:黑色地带(崛起)),2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edusrc高白帽,vulfocus、攻防世界等平台排名100+、高校漏洞证书、cnvd原创漏洞证书等。
擅长:对于技术、工具、漏洞原理、黑产打击的研究。
导读:
面向读者:对于网络安全方面的学者。
本文知识点:
(1)身份验证定义(√)
(2)基于密码的登录中的漏洞(√)
(3)多因素身份验证中的漏洞(√)
(4)其他身份验证机制中的漏洞(√)
目录
实验16:使用暴力攻击的2FA旁路(有一处数据包错误,已研究)
助你一臂之力
📋问题1:挖身份验证漏洞需要准备什么?
🎯信息收集(收集管理员,被攻击账号的相关消息)
🎯已有账号(将很大长度上提升挖到的概率)
🎯准备好字典
📋问题2:使用的工具有哪些?
🎯BP必备(爆破、数据包的分析)
🎯加解密工具(一些关键值一般会被加密)
一、身份验证定义
1、三个身份验证因素
(身份验证机制依赖于一系列技术来验证这些因素中的一个或多个)
知识因素:一些你知道,如密码或安全问题的答案。
占有因素:一些你有也就是像移动电话或安全令牌这样的物理对象。
内在因素:您的身份或行为,例如,您的生物特征或行为模式。
2、身份验证和授权身份验证:验证用户是否确实是他们自称的那个人
授权:涉及验证用户是否被允许做一些事情
3、身份验证漏洞的产生
身份验证机制很弱:不能充分地防止暴力攻击
身份验证失败:实现中的逻辑缺陷或糟糕的编码允许攻击者完全绕过身份验证机制
第三方身份验证机制中的漏洞————
示例:
1、基于密码的登录中的漏洞:
2、多因素身份验证中的漏洞
3、其他身份验证机制中的漏洞
4、实验的字典
用户名:
密码:
二、基于密码的登录中的漏洞
1、强制策略
强制特定用户名,强制特定的密码组成
2、用户枚举
观察网站行为的变化,以确定给定用户名是否有效
在尝试强行登录页面时,应特别注意以下方面的任何差异
1、状态代码:爆破返回的状态代码对于绝大多数都是错误的。如果返回不同的状态代码,则表明用户名正确
————
2、错误信息:有时返回的错误信息会有所不同,具体取决于用户名和密码是否都不正确或只有密码不正确。(如密码错误的提示)————
3、响应时间:如果大多数请求都是以相似的响应时间处理的,那么任何偏离这个响应时间的请求都表明有更多的步骤。(如用户名有效,网站可能仅检查密码是否正确。这个额外的步骤可能会导致响应时间稍微增加)
————涉及实验:
实验1:通过不同响应的用户名枚举
实验4:通过细微不同的响应进行用户名枚举
实验5:通过响应计时的用户名枚举
3、有缺陷的强力保护
暴力攻击会涉及多次失败,暴力保护的核心是尽可能巧妙地自动执行该过程,并降低攻击者尝试登录的速度。
————
防止暴力攻击的两种最常见方法是:
1、锁定账号:如果远程用户尝试登录失败的次数过多(或其他标准),则锁定他们尝试访问的帐户
2、锁定ip:如果远程用户连续进行过多的登录尝试,则阻止他们的IP地址
(都提供了不同程度的保护,但都不是无懈可击的,特别是在使用有缺陷的逻辑实现时)————
例如,如果多次登录失败,IP将被阻止。在一些实施方式中,但如果IP所有者成功登录,则用于失败尝试次数的计数器重置。这意味着攻击者只需每隔几次尝试就登录自己的帐户,以防止达到此限制。
在这种情况下,仅仅在整个单词列表中定期包含您自己的登录凭据就足以使这种防御措施实际上毫无用处。
————涉及实验:
实验6:断蛮力保护、IP块
实验7:通过帐户锁定枚举用户名
实验13:暴力破解保护功能失效,每个请求有多个凭据
实验1:通过不同响应的用户名枚举
part1:
如果账号不存在,会有提示username不存在
(和实战中特别像)
part2:
爆破用户名
使用实验提供的usernaem
发现有一个长度不一样,提示的是密码的错误
账号:alterwind
part3:
爆破密码
使用实验提供的password
发现了有一个长度不一样的,302跳转
尝试一下是不是密码
密码:aaaaaa
part4:
登陆进去了
实验4:通过细微不同的响应进行用户名枚举
part1:
对用户名进行爆破
使用bp实验提供的username
在结果中发现有一个相应时长长一点,在想是不是username验证正确了,在验证密码了
(但最后结果是错的)
对爆破结果再分析
(提取错误的提示信息)
发现了错误提示不一样
(最后验证密码后:正确用户名后面是空格,错误用户名是一个点)
账号:root
part2:
对密码进行爆破
使用实验提供的password
熟悉的302跳转
密码:666666
part3:
登陆
root/666666
实验5:通过响应计时的用户名枚举
part1:
此实验,对ip有限制
爆破时候加上X-Forwarded-For:
payload1:
字典也就100来个,就设120就够了
payload2:
提前设置把提示信息提取出来
part2:
分析结果
把时间勾上
有4个的时间,差不多都是1000
oracle
agent
vagrant
alerts
part3:
对密码进行爆破
payload2:
改为密码字典
(有延迟,很难准确爆破出)
part4:
登陆账号
实验6:断蛮力保护、IP块
part1:
题目已经提供了
已有账号:wiener:peter
要攻击的用户名:carlos
(要准备和password一样多的账号数量,只能多)
因为每错次个就会封ip,所以在登陆错3次内,循环插入正确的账号和密码(且不能多线程,不然就容易直接错3次了)
(使用notepad++的替换功能)
正确账号:wiener
现在每2个里面就有一个正确账号
现在将密码与正确账号对应上(正确密码:peter)
part2:
开始使用
要攻击的用户名:carlos
payload1:
payload2:
part3:
结果分析(302是登陆成功后的跳转,找到账号为carlos的302跳转)
账号:carlos
密码:monitoring
part4:
登陆
实验7:通过帐户锁定枚举用户名
part1:
发现重复登陆5次就会锁定账号,所以把所有账号重复进行5次枚举(使用集束炸弹Cluster bomb),观察响应包
错误的payload2:添加5个null payload
(密码应该不能为空)
正确的payload2:
直接密码1-5,是一样的效果
part2:
分析账号
账号:att
part3:
爆破账号att的密码
虽然有锁定,但尝试观察报错信息
载入密码
分析结果:
有一个长度出奇的短
(应该是提示信息不一样,当通过长度无法区分的时候,就提取提示信息)
账号:att
密码:iloveyou
part4:
登陆
实验13:暴力破解保护功能失效,每个请求有多个凭据
part1:
可以发现请求以JSON格式提交登录凭据
整理的好看点
提示攻击的用户为
carlos
将密码全部以json的格式添加到password关键字后面
先变一个开头(第一个"自己手动加上去)
再变一个结尾(最后一个"也自己手动加上去)
直接复制上去,要加上[数据块]
三、多因素身份验证中的漏洞
1、简述:
2、双因素身份验证令牌
1、一些网站会将验证码以短信的形式发送到用户移动的上。虽然这在技术上还在验证“你所拥有的东西”的因素,但它是开放的滥用。
————
2、首先,代码是通过SMS传输的,而不是由设备本身生成的。这就产生了代码被拦截的可能性。此外,还存在交换SIM卡的风险,即攻击者通过欺诈手段获得带有受害者电话号码的SIM卡。然后,攻击者将收到发送给受害者的所有SMS消息,包括包含其验证码的消息。
————
3、绕过双因素身份验证
有时,双因素身份验证的实现存在缺陷,以至于可以完全绕过它(但是我尝试的经验,一般是前后端分离,只是前端绕过了能进去,但是没有数据)
————
如果用户首先被提示输入密码,然后被提示在单独的页面上输入验证码,则用户在输入验证码之前实际上处于“登录”状态。在这种情况下,值得测试一下,看看在完成第一个身份验证步骤后是否可以直接跳到“logged-in only”页面。有时候,您会发现网站在加载页面之前实际上并不检查您是否完成了第二步
————涉及实验:
实验2:2FA简单旁路
3、有缺陷的双因素验证逻辑
有时,双因素身份验证中的逻辑缺陷意味着,在用户完成初始登录步骤后,网站无法充分验证同一用户是否正在完成第二步
如果攻击者随后能够强制验证代码,这将是极其危险的,因为这将允许他们完全基于用户名登录到任意用户的帐户。他们甚至不需要知道用户的密码。
————涉及实验:
实验8:2FA断开逻辑
4、暴力破解2FA验证码
1、与密码一样,网站需要采取措施防止2FA验证码被强行使用。这一点尤其重要,因为代码通常是一个简单的4位或6位数字。如果没有足够的强力保护,破解这样的代码是微不足道的。
2、一些网站试图通过在用户输入一定数量的不正确验证码时自动注销用户来防止这种情况。这在实践中是无效的,因为高级攻击者甚至可以通过以下方式自动执行此多步骤过程创建宏。该涡轮入侵者扩展也可用于此目的
————
涉及实验:
实验16:使用暴力攻击的2FA旁路
实验2:2FA简单旁路
已获得的凭据:wiener:peter
受害人的:carlos:montoya
双重验证绕过
第一重:密码验证
第二重:邮箱验证码
part1:
先登陆已有凭据wiener:peter
然后收取邮箱验证码
保存登录之后的url
part2:
使用已有凭据登录carlos账户
carlos:montoya(验证账号密码)
到这个URL就是要验证邮箱了
part3:
直接将换为登陆成功的URL尝试绕过第二重邮箱验证
即后面替换为/my-account
就可以登陆成功
实验8:2FA断开逻辑
信息:
已获得的凭据:wiener:peter
受害者账号:carlos
part1:
先登陆已获得的凭据:wiener:peter
part2:
思路分析:
在网站map搜host找到刚刚的数据包login
然后还GET请求了一个login2(请求中的用户为wiener)
思路:将用户改为我们要攻击的账号carlos,并重放就可以第二步验证的是攻击账号的账号了
(分析完以后,退出登陆wiener)
part3:
第一步验证的完整过程
先使用wiener登陆,同时bp打开拦截
放过第一个登陆的数据包
此时将第二个数据包的 verify值改为受害者账号(carlos)
第三个数据包我也改为了carlos
part4:
第二步验证的完整过程
这一步是验证受害用户验证码了(4位数,直接爆破)
————
(此处一个错误提示:千万别用蛮力,全部爆破完才出来,,此时靶场已经关了,服了,用顺序递增)
此时靶场已关,重新来过(服了)
————
重新爆破(换数值递增的方法)
注意:verify=carlos需要改为受害者(否则失败)
(爆破5次发现,官方基本上把验证码设置为了1000以下)
把线程调大点
实验16:使用暴力攻击的2FA旁路(有一处数据包错误,已研究明)
再次分析错误的地方时候:
最后一步可能需要上一步的验证参数
前提:
受害人凭据:carlos:montoya
但无权访问用户的 2FA 验证码(暴力破解)
part1:
登录用户carlos,提交任意验证码0000
(目的收集数据包,验证码对不对无所谓)
part2:
Project options(项目选项)--->sessions--->add
scope(范围)---> all urls
提示:我以为老版的不能多选,就换了最新版试试
正确操作:多选条,然后删除多余的
再点击test macro
————
第三个数据包是200,是正常的
(但是我第二个数据包变成了400,不是302了,按道理账号密码是正确得跳转,并获得session)
然后都点击确认OK
再准备进行验证码爆破
四、其他身份验证机制中的漏洞
1、简述:
除了基本的登录功能外,大多数网站还提供了允许用户管理其帐户的补充功能。例如,用户通常可以更改其密码或在忘记密码时重置密码。这些机制还可能引入可被攻击者利用的漏洞。
网站通常会注意避免在其登录页面中出现众所周知的漏洞。但是很容易忽略这样一个事实,即需要采取类似的步骤来确保相关功能同样健壮。这在攻击者能够创建自己的帐户并因此能够轻松访问以研究这些附加页面的情况下尤为重要。
2、保持用户登录
一个常见的功能是即使在关闭浏览器会话后仍保持登录状态的选项。这通常是一个简单的复选框,标记为“记住我”或“保持我的登录状态”。
————
涉及实验:
实验9:强制使用保持登录状态的Cookie
实验10:离线密码破解
3、重置用户密码
1、通过电子邮件发送密码
2、使用URL重置密码
3、更改用户密码
涉及实验:
实验3:密码重置逻辑错误
实验11:通过中间件的密码重置中毒
实验12:通过更改密码暴力破解密码
实验9:强制使用保持登录状态的Cookie
信息:
关闭浏览器后,会话未销毁(可以尝试暴力破解)
已有凭据:wiener:peter
攻击账号:carlos
part1:
登陆已有账号(点击stay-logged-in)
part2:
分析登陆完整过程的数据包
(2个地方有保持登陆的值)
第一个地方,是提交登陆的地方(这个地方肯定是还没登陆进去的)
第二个地方是登陆进去后的页面(这个地方肯定是成功登陆并保存登陆状态的)
stay-logged-in的值解密出来后就是账号-密码(通过账号密码一直保持登陆状态)
先是进行了一遍base64加密
然后对密码进行了cmd5加密
part3:
提示:先退出登陆到首页
(不然后面爆破不出来)
part4:
对被攻击用户登陆状态的stay-logged-in值进行爆破
先导入密码字典
再设置加密规则
(先在是模仿加密规则,和我们退出来的方向相反)
对密码先进行md5加密
再添加被攻击账号前缀(:千万别打成中文的了)
最后base64加密
part5:
分析结果
进行长度排序
Y2FybG9zOjZlYmU3NmM5ZmI0MTFiZTk3YjNiMGQ0OGI3OTFhN2M5
解密:carlos:6ebe76c9fb411be97b3b0d48b791a7c9
解密:987654321
————
得出
账号:carlos
密码:987654321
实验10:离线密码破解
xss获取cookie的stay-logged-in值
part1:
已有凭据:wiener:peter
受害者账号:carlos
part2:
在主页找一个博客进行评论
exploit-0af000c604e4c40dc20ec4e80197006f.exploit-server.net/部分填自己的
part3:
获取xss获取的cookie
Y2FybG9zOjI2MzIzYzE2ZDVmNGRhYmZmM2JiMTM2ZjI0NjBhOTQz
part4:
离线破解
base64破解
carlos:26323c16d5f4dabff3bb136f2460a943
cmd5解密:
carlos:onceuponatime
part5:
登陆
实验3:密码重置逻辑错误
信息:
已有凭据:wiener:peter
受害者账号:carlos
part1:
先把所有数据包抓了走一遍流程(分析找回的顺序)
输入用户名后,看邮箱
点URL后将进行重置密码
(进行重置的数据包就是关键了)
part2:
我将重置的URL发到了repeater
(观察到了前端隐藏参数,就是用户名)
将用户名改为受害者账号:carlos
302跳转了,可能成功了,现在去尝试登陆
part3:
登陆
carlos/111111
实验11:通过中间件的密码重置中毒
信息:
已有凭据:wiener:peter
本实验中X-Forwarded-Host标头是受支持的,使用它来将动态生成的重置链接指向自己控制的任意域
part1:
复制邮箱,后面要用(其实后面也可以直接查看)
part2:
退出登陆,到忘记密码流程去
先使用受害者账号名
去获取temp-forgot-password-token
添加X-Forwarded-Host标头,并指向漏洞服务器(已有的)
X-Forwarded-Host:exploit-0aea007604ddbf52c85306d901ca0003.exploit-server.net
在漏洞服务器中,找到收获账号的temp-forgot-password-token
nFLC5vX07qjtWVeye3UKdfDOjXaYK0zt
part3:
再使用自己的已有账号w……
去获取重置密码的URL
再去到服务器邮箱里面
part4:
点击重置密码的URL
并将temp-forgot-password-token值由w……的修改为被害者c……的
进入重置密码
重置的需要也需要将temp-forgot-password-token值由w……的修改为被害者c……的
part5:
重置后进行登陆
实验12:通过更改密码暴力破解密码
信息:
已有凭据:wiener:peter
受害者账号:carlos
part1:
使用已有账号分析(先登陆已有账号)
为了爆破出正确原密码,需借助错误提示(观察响应)
方法1:正确原始密码、不一致的新密码(可爆破出原密码)
爆破中:原密码错误时候提示Current password is incorrect,原密码正确的时候提示New passwords do not match
————
方法2:错误原密码、不一致新密码
爆破中:当原密码错误时候,提示Current password is incorrect;当原密码正确到时候,提示信息变为New passwords do not match
————
方法3:错误原密码、一致新密码
错误出现302跳转到登陆页面,正确也是302跳转(无法爆破)
part2:
username改为carlos
对原密码进行爆破
导入字典
在结果数据包中匹配New passwords do not match(此时说明原密码已经正确了)
part3:
分析结果
账号:carlos
密码:7777777
注册已登陆账号,并登陆carlos
- 点赞
- 收藏
- 关注作者
评论(0)