验证码以及登陆模块的逻辑漏洞

进行这个整理,由于在XXX项目的时候,发现登陆处的忘记密码处,在验证用户身份的时候是经过,手机验证码验证的,经过修改响应包的返回参数值,能够绕过验证,进入第三步的密码重置。还有最近测试的一个sso登陆,也存在验证码问题。以前的测试中也遇到过相似的验证码绕过的漏洞,因此对验证码绕过方法进行一个总结汇总、以及关于登陆模块可能会存在的逻辑漏洞进行一个小整理。php

其实,会出现验证码的地方,也就是校验用户身份处,好比,登陆、忘记密码、注册、绑定、活动领取、反馈处等。而登陆模块中可能存在的逻辑漏洞,无非就是用户枚举、任意用户密码重置,固然认证绕过也是逻辑漏洞,这个咱们暂且放在验证码里面。数据库

0X01  绕太短信验证码的方法以及例子浏览器

经过修改响应包的返回值绕过

这种是用户端根据返回的值,来肯定是否进行下一步。好比发送成功返回state的值是success,失败是false,而后客户端根据state的值,来肯定下一步的动做。这样,咱们能够经过修改响应包,绕过验证。cookie

例1

好比忘记密码处:第二步中,对用户的身份进行短信验证,可经过修改响应包,将error换为ok便可绕过身份验证,到设置密码处。工具

例2

注册处,验证手机验证码处,经过修改响应包,或替换为本身的手机号,绕过验证码的限制,形成使用他人手机号进行注册。post

例3

有些登陆也存在相似的问题,随便输入帐号密码,拦截返回的响应包,将包替换为A帐号帐号密码正确的登陆的返回的响应包(前提是,A帐号的cookie是有效的),便可登陆到A帐号。这种也是客户端,根据响应包的值,来决定下一步动做。测试

服务端未对身份作校验

这种比较少,由于算是功能问题,在验证身份时,未对答案进行校验。就是随便输入,就能进入下一步。ui

例4

忘记密码处,第二步中,选择其余方式找回,经过密保找回,未对密保答案进行验证,随便输入答案,便可跳转到设置密码处。spa

验证码置空绕过验证

短信验证码处,随便输入其余,验证码错误,而置空却不校验,则能够经过置空绕过3d

例5

个人==>登录==>短信验证码登录登录时抓包把code(验证码字段)值置为空,便可登录任意帐户

发送短信时,将手机号替换为本身的手机号获取验证码

当修改别人的信息时,须要短信认证时,在发送短信时,咱们能够尝试,将手机号替换为本身的,来获取短信验证码。若是服务端只是检查验证码是否正确,而不是进行手机号和验证码匹配的话,或者只是匹配发送短信手机号和验证码,咱们就能够绕过认证。

例6

忘记验证码,验证身份时,在发送短信时,拦截,将手机号替换为咱们本身的,发送。而后再输入获得验证码,验证,若是此时只是验证码验证码是否正确,便可绕过。可是,若验证发送手机号和验证码是否匹配时,咱们能够在填好验证码,提交时,拦截,将手机号再次改成咱们本身的,便可绕过。

容许一次给多个手机号发送短信,获取验证码

在给手机发送短信验证码时,好比phone=13211111111,咱们同时向多个手机号发送短信,用逗号隔开,即phone=13211111111,13233333333。可发送成功。全部手机收到相同的验证码,若果,后面在验证验证码时,能够匹配成功的话,便可绕过验证码。另外,这样能够向大量手机号发送,形成费用增长。

例7

注册处,在获取短信验证码时,抓包将mobilePhone的值改成多个手机号,并用逗号分隔,可成功多个手机号发送短信验证码。

短信验证码过短,爆破绕过

有的短信验证码位数过短,采用4为纯数字的短信验证码做为登陆认证的凭证,这样如果没有对次数限制或存在图形验证码的话,就很容易采用工具进行爆破验证码登陆。

例8

重置密码处根据短信验证码,是否正确来肯定是否能修改为功,并且验证码是四位纯数字的,能够进行爆破。code=4935&mobile=18556530793&pwd=123456a

利用接口标记绕太短信限制

注册、忘记密码、修改密码处,均存在发送短信验证,可能会设置参数值的不一样,来判断是执行什么样的功能。好比type=1是注册,type=2是忘记密码,type=3是修改密码等。咱们能够经过修改参数值,来绕过一分钟内只发送一次限制,达到短信轰炸的目的。

例9

注册页面处,URL/public/getPhoneVerifyCodeWithCheckPicVerCode正常逻辑是验证图片验证码,正确后,再发送手机验证码。将请求修改成/public/getPhoneVerifyCode,从而绕过图片验证码的验证机制。

例10

注册页面处,发送短信验证码处,能够结合上例中的绕过图形验证码的机制,发现smsType的值,不一样时,能够绕过180秒限制。能够遍历修改smsType的值,从而形成短信炸弹。

例11

注册,在发送手机验证码或邮箱验证码处,r=2时,连续发送验证码,会提醒“从新输入验证码”,说明验证了图形验证码。可是r=5时,能够发送成功,连续发送时,提醒“一分钟内不容许屡次发送”。仅有一分钟内不容许屡次发送验证码限制,可是并未对图形验证码进行校验,能够经过甚至频率,使其,两分钟发送一次,一样能够形成短信/邮箱轰炸。

例12

绑定手机号处,正常的发送短信的URL是sendSMS4Mobile,尝试修改URL,是否存在其余发送接口。通过不断尝试,sendSMS接口一样能够发送短信。

利用空格绕太短信条数限制

经过在参数值的前面加上空格,进行绕过一天内发送次数的限制。好比,mobile=13211111111,一天能够发送10次,超过10次今天将再也不发送,次日才能够继续发送。可是,能够经过在手机号前面或后面加上空格又能够发送10次。好比,mobile= 13211111111,前面加个空格,就能够再次发送成功。

经过修改cookie值绕太短信次数

有些发送短信的次数是根据cookie值进行判断,(此cookie值并非登陆状态下的cookie而不是普通状态下的),利用当前cookie值来验证发送次数的话,很容易被绕过。例子https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=27614

以前有个登陆帐号密码错误三次,就会出现图形验证码。可是当关闭浏览器,从新打开,再登陆,又会有三次机会,当时,芦浩分析得出是根据cookie判断的,而后经过,不断获取新的cookie,来绕过三次限制,进而进行帐户密码枚举。

http://wiki.iflytek.com/pages/viewpage.action?pageId=128550855

修改IP绕太短信/邮箱轰炸

有些是验证当前IP,若是当前IP短期内获取短信或邮件频繁或达到必定的次数,会锁定当前IP,这时能够尝试经过修改IP或代理IP来进行绕过限制

利用大小写绕过邮箱轰炸限制

有时候验证码是发送到邮箱的,能够经过修改邮箱后面字母的大小写绕过限制。好比:email=****@qq.com,当次数达到限制时,将字母修改成大写:email=****@Qq.com,便可绕过。

修复建议:

一、服务端对验证码进行校验,短信验证码应该根据用户存在数据库中的手机号收到的验证码进行匹配验证。

二、增长复杂的图形验证码,且一次性有效

三、限制一天内发送的上限

0X02  用户枚举

在验证用户身份的时候,或判断用户是否已注册时,若验证码处理不当、或错误提醒明确,均可能存在用户枚举。

缺少/未验证的图形验证码,形成用户枚举

例1

忘记密码处,首先验证用户身份,虽然此处有图形验证码,可是,图形验证码不刷新,即不是一次有效,经过拦截请求,发现,并未对验证码进行验证。能够进行用户枚举

例2

手机验证码登陆处,在校验手机号是不是已注册的手机号时,绑定的手机号和未绑定的手机号,返回的响应包不一样,并且未增长图形验证码校验,可对已绑定的手机号枚举。

例3

忘记密码处,图形验证码参数为imageValidCode,重复放包时,发现,验证码是一次有效的,通过尝试,发现删除imageValidCode参数,能够绕过验证码的验证机制,从而进行用户枚举。爆破已注册的帐号。

提醒明确,形成的用户枚举

一些错误,提醒明确,好比登陆时,输入帐号、密码,均错误的状况下,提醒帐号错误;帐号正确、密码错误时,提醒密码错误,从而能够进行枚举。

例4

登陆处,输入错误的帐号,会提醒用户不存在;错误的密码,会提醒密码不正确。可根据提示,进行用户、密码枚举。

例5

关联帐户绑定==》切换帐户处,根据loginname的值,返回对应帐号的绑定的手机、邮箱等我的信息。当loginname为不存在的帐号时,响应包为“操做失败”,并且请求包中,仅有loginname这一个参数,能够对其进行用户枚举。

例6

在密码修改功能,会验证原始密码和帐号的正确性,帐号、密码都正确时resCode=00100000,帐号错误resCode=00100001,msg为空。帐号正确,密码错误时,msg提醒原始密码错误。能够进行枚举其余帐号、密码。好比,能够枚举密码为1111的帐号。

修复建议:

一、  模糊提醒

二、  增长复杂的图形验证码,对于登陆后可能存在的枚举,增长token,且一次性有效

三、  限制请求频率,错误必定次数,锁定帐号一段时间

0X03  任意用户密码重置

形成任意用户密码重置,主要发生在修改密码、忘记密码处,在逻辑上处理不严谨形成的。好比,忘记密码处,先验证身份,验证经过才容许密码重置,前面验证很严谨,不能绕过,可是第三步不严谨,好比仅根据帐号来进行密码重置,那就极可能存在任意用户密码重置。

例1

忘记密码处,最后一步更新新密码处,经过抓包,发现仅是根据帐号进行密码修改,那么修改account为任意存在的帐号,就能够修改任意帐号的密码。

修复建议:

一、  逻辑上要严谨,不能说前面校验如今要重置密码的人是A后,就认为后面的操做都是A的。仍是要进行校验确认的。

0X04  附录

一、  https://www.anquanke.com/post/id/93878

二、  https://wooyun.shuimugan.com/bug/index?BugSearch%5Bvendor%5D=%E8%85%BE%E8%AE%AF

相关文章
相关标签/搜索