一次工作中逻辑绕过任意绑定手机号码漏洞(黑盒JS分析)
一次工作中逻辑绕过任意绑定手机号码漏洞(黑盒JS分析)
通过注册的1XX手机号登录,在这里发现可以修改,那么输入注册的手机号提示已存在
接着输入需要更改的手机号,这里就选择13888888886作为测试,这里需要注意,158手机号是不能发送短信的 ,因为号码已存在,按照逻辑推理138888888886可以发送,但是无法获取短信认证码,这里需要先同时打开两个页面,一个:
思路1:先触发忘记密码认证 ,在第一步不输入发送按钮,测试
把1XX得到的验证码直接替换到13888888886,直接替换,但是发现号码必须发送,才能触发输入,我们只能尝试手机号码同时发送并替换
尝试结果:失败
197284,是我们注册的验证码,但是失败了,思路1,没能成功
思路2:如何躲避网站的短信认证,先看看源代码
/短信验证码验证
var checkCode=$("#code").val(); var phone = $("#phone").val();
function checkCode() { var checkCode=$("#code").val(); var phone = $("#phone").val(); if(isNull(checkCode) || isNull(phone) ){ errorMsg("手机号或验证码不能为空!"); return; } if(checkCode!="" && checkCode!= null) { var params="checkCode="+checkCode+"&phone="+phone;; var url1 = "user_validateCheckCode.action?"; $.post(url1,params,function(meg){ if(meg=="1") { errorMsg("验证码不正确!"); }else{ //修改用户信息 updateUserInfo(); } }); }else{ errorMsg("请输入验证码"); } }
实际上可以从代码看出,其中var变量的#phone参数,是直接通过数值去比对的, if(meg=="1") { errorMsg("验证码不正确!"); }else{ //修改用户信息 updateUserInfo(); }
如果meg等于1,那么提示验证码不正确,否则提示修改成功
那么可能为0的时候就可以修改成功,那么我们
var params="phone="+phone; var url1 = "user_checkPhone.action?"; $.post(url1,params,function(meg){ if(meg =="1") { errorMsg("手机号已存在!"); }else{ //d倒计时 timer(); //获取验证码 getCheckCode(); } });
这里做了函数变量params的一个类型判断,同时去比对phone参数是否存在相同数值,如果存在则提示号码已存在,如果不存在则提示号码修改成功
//修改用户信息 updateUserInfo();
回到上一层逻辑
var params="checkCode="+checkCode+"&phone="+phone;; var url1 = "user_validateCheckCode.action?"; $.post(url1,params,function(meg){ if(meg=="1") { errorMsg("验证码不正确!"); }else{ //修改用户信息 updateUserInfo(); }
关键点就在这里 var params="checkCode="+checkCode+"&phone="+phone;;
只是做了一个类型判断,意思就是说,当比对相同用户,那么在这一层肯定会失败,那么我做一个其他触发点发起,在当前输入的138888888886,进行触发验证码,这时候会回到这一步; getCheckCode();发送验证码成功,那么接着,我在另外一个点,也忘记密码,注册用户也触发一次发送,那么在修改手机号这里
我们注意params="checkCode="+checkCode+"&phone="+,我修改为相同类型,即验证和修改都为相同类型,就会回到这一步: if(meg=="0") {
0代表成功了,1代表失败,2就是验证是否当前在登录,防止越权用的
判断用户是否登录,如果没有登录,则跳转到登录页面 $(document).ready(function() { var user = "com.haobai.model.UserInfo@1d74af7a"; if(user == "" || user == null){ window.location.href =
分析结果:如果验证和修改都为相同类型,即可以躲过短信认证,代码设计缺陷导致可以任意更改手机号码认证,我们来试试
开始进行,首先第一步,忘记密码,触发
第二步
让138这个也触发
接着代码层开始比对了,思路就是得到注册的验证码:
990828
在这里填写
还是不正确,怎么回事呢,这时候,需要抓包
把参数改成注册用户的类型,
即:var params="checkCode="+checkCode+"&phone="+phone;; 这段代码的含义
点击修改会触发到这里:
if(meg=="0") {
绑定成功,漏洞利用结束
<< 上一篇