在学习本章前,建议先对前序章节进行了解,传送门如下:
本章节结合靶场试验来仔细研究多因素身份验证机制中可能出现的一些漏洞。
有时,双因素身份验证中的逻辑缺陷意味着在用户完成初始登录步骤后,网站无法充分验证同一用户是否正在完成第二步。
例如,用户在第一步中使用其正常凭据登录,如下所示:
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
然后在进入登录过程第二步之前,他们会分配一个与其账号相关的cookie:
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
提交验证码时,请求使用此cookie来确定用户尝试访问的账号:
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
在这种情况下,攻击者可以使用自己的凭据登录,然后在提交验证码时将账户cookie的值更改为任意用户名:
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
如果攻击者随后能够暴力破解验证码,这是极其危险的,因为这将允许他们完全基于用户名登录任意用户的账号,他们甚至不需要知道用户的密码。
https://portswigger.net/web-security/authentication/multi-factor/lab-2fa-broken-logic
这个场景采用双因素身份验证,但存在逻辑缺陷,场景提供了一个可完全登录的账户密码和收验证码的邮箱。
①先用场景提供的账号wiener登录,登录后要求输入验证码,从场景提供的邮箱获取到验证码,可以发现验证码时4位数字。
②在验证码地方输入个其他的4位数字,使验证失败。在BurpSuite中分析所抓的包,在第一次用户名密码登录后,会跳转到/login2到验证码的页面。先把对这个页面的请求发送给Repeater
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
③在Repeater中修改此请求,将用户改成carlos,随后发送此请求,这样即向系统申请carlos的验证码,系统会响应200 OK
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
④随后将POST /login2的请求发送给Intruder,用来爆破carlos的验证码
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
⑤在Intruder的"Positions"中先清空所有变量,再将用户名改成carlos,同时将验证码设置为变量
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
在"Payloads"中,将变量类型设置为Number,因为验证码时4位数字,所以设置下变量的范围,随后进行自动攻击
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
⑥从攻击结果中找到响应码是302的响应,前面这4位数字即为密码
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
⑦再将POST /login2的请求再发送给Repeater,改造下请求,把用户名改成carlos,同时验证码改成前面刚爆破出来的那个,随后发送请求
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
⑧从响应来看已经验证成功了,获取URL,并在浏览器中打开,即可完成本试验
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
这个场景利用的就是双因素之间关联性不强的逻辑漏洞,验证码部分只通过验证请求时的用户名来进行确认,从而可以使攻击者即使在不知道受害人密码的情况下也可以完成验证实现登录。
在前面场景中,最后也采用爆破验证码的技术手段。与密码一样,网站也需要采取措施防止双因素验证码的暴力破解,这点其实尤为重要,因为验证码通常是一个简单的4位或6位数字。如果没有足够的保护,破解这样的验证码是相当容易的。
如果用户输入了一定数量的错误验证码,一些网站会尝试通过自动注销用户来防止爆破情况发生,但这在实际环境中是无效的,因为高级攻击者可以通过攻击工具创建宏来自动化这个多步骤过程。
https://portswigger.net/web-security/authentication/multi-factor/lab-2fa-bypass-using-a-brute-force-attack
这个场景采用双因素身份验证,但容易受到暴力破解。假设已经获得了受害者有效的用户名和密码,但无权访问该用户的双因素的验证码。
要完成这个试验,暴力破解双因素验证码并访问carlos的账户页面
①因为直接就有受害者的账户和密码,直接进行登录,登录后会要求再输入验证码。可以发现,输入两次错误验证码后,账号就自动登出了,因此在发送每个爆破请求前,我们需要使用Burp的会话处理功能自动重新登录。
②在Burp中找到"Projectoptions"中的"Sessions"标签,在"Session Handing Rules"面板中,点击"Add",进入"Session handling rule editor"配置面板
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
③在这个面板中进入"Scope"标签,在"URL Scope"选项中选择"Include all URLs",即在后面发起的所有请求前,都执行自动登录的宏
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
还是在这个面板返回"Details"标签,在"Rule Actions"中点击"Add>Run a macro"来运行一个宏指令
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
④在"Select macro"中点击"Add"打开"Macro Recorder",选择下面三个请求:
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
⑤点击OK后,再点击"Test macro"测试下这个宏,可以看到最后个响应包含让你提供4位的验证码,说明脚本没问题,随后一路点击OK到Burp的主页面
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
⑥把POST/login2请求发送到Intruder进行改造,在"Positions"标签中清除所有变量,只设置mfa-code后面的参数为变量
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
在"Payloads"标签中,设置变量的类型和范围
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
在"Resource Pool"标签中,把"Maximum concurrent requests"设置成为1,随后开始攻击。
⑦从攻击结果中找到响应码是302的响应,右键点击复制到URL
![身份验证漏洞-多因素身份验证中的漏洞(下) 身份验证漏洞-多因素身份验证中的漏洞(下)]()
这个场景中虽然对验证码的爆破进行了一定的防护,但是无法完全避免攻击者利用自动化工具来实施爆破,只是变相的降低了攻击效率。而在攻击频次上只能设置为1的原因是每次在进行验证码提交前都需要进行登录,过多的并发会导致登录失效。如果每次登录时,验证码都会重新更新的话,这种攻击技术就无效了。
SQL注入攻击-发现、利用和防范
SQL注入攻击-盲注(一)
SQL注入攻击-利用UNION检索其他数据(上)
SQL注入攻击-检索隐藏的数据
HTTP高级请求走私-HTTP请求隧道(上)
HTTP高级请求走私-CRLF的利用(上)
HTTP高级请求走私-响应队列中毒
HTTP请求走私漏洞-漏洞利用场景(上)
HTTP Host头漏洞-密码重置投毒
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):身份验证漏洞-多因素身份验证中的漏洞(下)
评论