Web业务安全测试学习:密码找回相关案例
密码找回凭证可被暴力破解案例1:某社交软件任意密码修改案例2012年,某社交软件的官网上新增了一个忘记账号或密码的链接。
[*](1) 单击忘记密码链接后,进入重设密码选择页
[*](2) 选择使用手机号重设密码,并输入一个真实注册用户的手机号码
[*](3) 单击 "下一步" 按钮后,系统提示将发送验证码到注册手机
[*](4) 单击 "我已收到验证短信" 后,系统弹出重置密码确认页,需要输入手机上收到的验证码作为密码找回凭证。核对成功则可以成功进行密码重置
[*](5) 单击 "OK",并对该请求进行抓包,获取到报文:
check=false&phone=186XXXXXXXX&……&verifycode=1234
[*](6) 根据以上报文信息可以发现该密码找回功能的验证码比较简单,只有4位数字,可以尝试枚举修改报文中的verifycode 进行暴力破解。几次尝试后收到系统提示 "您的提交请求过于频繁,请稍后在试试。" 说明该网站的密码找回功能是对用户凭证的验证频率做了限制,只能想办法绕过其限制。
[*](7) 经过一系列的尝试后发现,在phone=186XXXXYYYY的号码后面随机添加不为数字的字符时,可以绕过此限制。于是推测其漏洞点在于判断phone=186XXXXYYYY 的尝试次数时未对phone的值进行提纯,所以可以利用在号码后添加随机字符的方式绕过限制。但在下一步操作的时候,只取了phone中数字的部分,然后再取出此号码的verifycode进行比对,比对成功则修改密码。
密码找回凭证直接返回给客户端
案例1:密码找回凭证暴露在请求链接中
[*](1) 进入某直播网站登录处,单击忘记密码,选择通过注册手机找回密码
[*](2) 输入手机号,单击获取验证码,然后抓包查看请求链接,发现验证码直接出现在了请求链接中
[*](3) 直接输入请求链接中暴露的验证码即可修改密码。
案例2:加密验证字符串返回给客户端
[*](1) 进入某电商官网按正常流程执行找回密码功能,填写好邮箱和图片验证码,进入下一步,然后使用抓取请求包
[*](2) 分析返回的数据包,发现其中包含了一个加密字符串,将其记录下来,将其记录下来
[*](3) 之后,邮箱中会收到一个找回密码用的验证码。将该验证码在页面上填好,单击下一步按钮即可进入密码重置页面
[*](4) 观察发现,密码重置页面URL中的加密验证字符串和之前返回数据包中加密字符串是同一个。既然如此,则可以绕过邮箱验证码校验,直接利用抓包工具获取到的加密字符串构造到URL中进行任意密码重置。
案例3:网页源代码中隐藏着密保答案
[*](1) 进入某邮箱网站官网,单击 "找回密码" 按钮,再单击 "网上申诉" 链接
[*](2) 在网上申诉页面直接看源代码,发现源代码中不但有密码提示问题,还在Hide表单里隐藏着问题答案。这样,可以获取任意用户的密码修改答案,从而修改任意用户的邮箱密码。
案例4:短信验证码发送给客户端
[*](1) 进入某商城网站,点击忘记密码
[*](2) 使用一个已注册的手机,通过短信验证码找回,抓取响应包
[*](3) 发现短信验证码返回给客户端。。。。(好弱智....)
密码重置链接存在弱Token有些信息系统的密码找回功能会在服务端生成一个随机 Token 并发送到用户邮箱作为密码凭证。但一旦这个Token的生成方式被破解,攻击者就可以伪造该Token作为凭证重置其他用户的密码。
案例1:使用时间戳的md5作为密码重置的Token
[*](1) 进入某网站先按正常流程取回一次密码,进入邮箱查看邮件内容
[*](2) 从邮件内容中可以看出参数vc为一串md5值,u为用户邮箱。将参数vc解密后为1496732066。于是猜测参数vc应该为id值,尝试遍历id值并修改变量u,查看是否可以修改其他用户密码,结果发现不行。
[*](3) 再仔细观察vc参数,发现和UNIX时间戳格式相符,于是使用UNIX时间戳转换工具验证,转换成功。
[*](4) 大致推测出该系统找回密码的流程。用户取回密码时,先产生一个精确的时间戳并与账号绑定记录在数据库内,同时将该时间戳作为密码找回凭证发送到用户的注册邮箱。只要用户能够向系统提供该时间戳即可通过认证,进入密码重置流程。但对攻击者来说,只要编写一段程序在一定时间段内对时间戳进行暴力猜解,很快就可以获得找回密码的有效链接。
案例2:使用服务器时间作为密码重置Token
[*](1) 进入某积分兑换商城,首先用2个账号在两个浏览器窗口中同时找回密码来进行对比
[*](2) 对比邮箱中收到的找回密码链接,我们可以看出,找回密码使用的随机Token只相差4,那么攻击者可通过遍历Token的方式重置其他用户的密码。
密码重置凭证与用户账户关联不严有些信息系统在密码找回功能上存在缺陷,只校验了密码重置凭证是否在数据库中存在,但未校验该重置凭证和用户账号之间的绑定关系。
案例1:使用短信验证码找回密码
[*](1) 进入某手机厂商官网,首先填写自己的手机号进行密码找回。
[*](2) 收到验证码后填入验证码和新密码提交,这时候使用数据抓包工具进行抓包,将数据包中的username修改为其他账号,post上去后就可以使用自己设置的密码登录其他账号。
案例2:使用邮箱Token找回密码
[*](1) 进入某公共信息网站使用真实信息找回密码后,系统会发送一封邮件到绑定的邮箱中。邮箱中的找回密码链接如下:
用户ID值&authcode=XXX&Email=邮箱地址
[*](2) 访问后可直接进入用户密码重置页面。在该页面输入新密码,并在提交时使用抓包工具抓取数据包,可获得以下内容:
org.apache.struts.taglib.html.TOKEN=83accc27d5178f832d9f22a1d02bdacf&org.apache.struts.taglib.html.Password=123456&passwordw=123456&rtEmail=邮箱&idtagCard=用户ID
[*](3) 虽然有Token,但该Token并没有和用户ID进行绑定验证,依然可以通过修改用户ID重置他人密码。随机修改了一个用户ID并提交后,提示密码重置成功。
重新绑定用户手机或邮箱有些信息系统在绑定用户手机或邮箱的功能上存在越权访问漏洞。攻击者可以利用该漏洞越权绑定其他用户的手机或邮箱后,再通过正常的密码找回途径重置他人的密码。
案例1:重新绑定用户手机
[*](1) 首先注册一个某邮箱的测试账号,然后会跳转到一个手机绑定的页面上
[*](2) 此处链接中有个参数为uid,将uid修改为其他人的邮箱账号,然后填入一个你可控的手机号,获取到验证码。确定后这个目标邮箱已被越权绑定了密保手机。
[*](3) 走正常的密码找回流程,发现这个邮箱多了一个通过手机找回密码的方式,这个手机尾号就是刚刚绑定的手机号码
[*](4) 获取验证码并填入新密码,最终成功重置了目标账户的密码。
案例2:重新绑定用户邮箱
[*](1) 某网站用户注册后的激活页面链接如下:
[*](2) 链接尾部的一串数字是用户的ID,通过修改这个ID即可进入其他用户的页面,该页面提供了更改邮箱地址的功能,可在此处将邮箱地址修改为自己的测试邮箱
[*](3) 然后使用该测试邮箱进行密码找回,即可重置目标用户的密码。
服务端验证逻辑缺陷有些信息系统的服务端验证逻辑存在漏洞。攻击者可通过删除数据包中的某些参数、修改邮件发送地址或者跳过选择找回方式和身份验证的步骤,直接进入重置密码界面成功重置其他人的密码。
案例1:删除参数绕过验证
[*](1) 某邮箱系统可通过密码提示问题找回密码
[*](2) 首先随机填写密码答案,然后进入下一步,抓包后将问题答案的整个字段都删除再提交
[*](3) 因服务端验证逻辑存在缺陷,无法获取到问题答案的情况下直接通过了验证,密码重置成功
案例2:邮箱地址可被操控
[*](1) 某网站可以通过注册时填写的邮箱来找回密码,但为防止网络不稳定等因素导致邮件发送失败,找回密码页面提供了 "重新发送邮件" 的功能
[*](2) 单击重新发送邮件,然后抓包拦截请求,将数据包中的邮箱地址改为自己的测试邮箱
[*](3) 进入自己的测试邮箱,单击收到的链接,密码重置成功
案例3:身份验证步骤可被绕过
[*](1) 进入某网站的密码找回功能,输入账号和验证码
[*](2) 确定后,直接访问,即可跳过选择找回方式和身份验证的步骤,直接进入重置密码界面
[*](3) 最终成功修改密码并登陆到个人中心
在本地验证服务端的返回信息——修改返回包绕过验证有些信息系统在密码找回功能的设计上存在逻辑缺陷,攻击者只需要抓取服务端的返回包并修改其中的部分参数即可跳过验证步骤,直接进入密码重置界面
案例:
[*](1) 进入某电商网站,单击忘记密码,输入用户名 admin 后选择手机找回,单击发送验证码,然后随便填写一个验证码,单击下一步按钮
[*](2) 此时抓包并拦截返回的数据包。经过测试,将返回码改成200即可绕过验证逻辑
[*](3) 直接跳转到了重置密码页面(也可能在最后一步重置密码提交,后台还是做了校验的,重置不成功的)
注册覆盖——已存在用户可被重复注册案例:
[*](1) 进入某快递网站,单击用户注册,输入用户名 admin,在鼠标离开输入框后会提示该账号已注册
[*](2) 输入一个未注册的用户名并提交表单,同时用抓包工具截取数据包并将 username 修改为 admin
[*](3) 此时 admin 用户的密码被重复注册的方式修改了,但原用户的所有信息却没有改变,也就是说这时候攻击者获取了用户的信息,包括姓名、身份证、手机号等。
Session覆盖——某电商网站可通过Session覆盖方式重置他人密码案例:
[*](1) 使用自己的账号进行密码找回
[*](2) 收到邮件后先不要打开链接
[*](3) 在同一浏览器内打开网站再次进入密码找回页面,输入其他人的账号
[*](4) 单击 "发送找回密码邮件" 后停在该页面
[*](5) 在同一浏览器中打开第二步中自己邮箱中收到的链接,然后设置一个新密码
[*](6) 使用新设置的密码,成功登陆进其他人的账户。
防范密码找回漏洞的相关手段
[*](1) 在密码找回功能设计时对用户凭证的验证次数和频率进行限制,防止攻击者对用户凭证的暴力枚举攻击
[*](2) 对密码找回的各个环节进行梳理,记录分析所有交互数据,避免密码找回凭证等敏感信息直接返回给客户端
[*](3) 对服务端密码重置Token的生成算法进行审计,避免使用容易被攻击者破解的简单算法
[*](4) 密码重置凭证应与账户严格绑定,并设置有效时间,避免攻击者通过修改账户ID的方式重置他人的密码
[*](5) 对客户端传入的数据要进行严格的校验,手机号、邮箱地址等重要信息应和后台数据库中已存储的信息进行核对,不应从客户端传入的参数中直接取用。避免攻击者通过篡改传入数据的方式重置他人的密码
[*](6) 对用户注册、手机邮箱绑定等业务逻辑进行审计,避免攻击者通过用户重复注册和越权绑定等漏洞间接重置他人密码
支持
页:
[1]