×

新闻动态 资料下载 源码审核

一次工作中逻辑绕过任意绑定手机号码漏洞(黑盒JS分析)

0x_www 0x_www 发表于2021-12-27 19:58:15 浏览237 评论0

抢沙发发表评论

一次工作中逻辑绕过任意绑定手机号码漏洞(黑盒JS分析)


通过注册的1XX手机号登录,在这里发现可以修改,那么输入注册的手机号提示已存在

接着输入需要更改的手机号,这里就选择13888888886作为测试,这里需要注意,158手机号是不能发送短信的 ,因为号码已存在,按照逻辑推理138888888886可以发送,但是无法获取短信认证码,这里需要先同时打开两个页面,一个:


思路1:先触发忘记密码认证 ,在第一步不输入发送按钮,测试

1XX得到的验证码直接替换到13888888886,直接替换,但是发现号码必须发送,才能触发输入,我们只能尝试手机号码同时发送并替换

尝试结果:失败


QQ截图20211227200001.jpg


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 =



分析结果:如果验证和修改都为相同类型,即可以躲过短信认证,代码设计缺陷导致可以任意更改手机号码认证,我们来试试

图片1.png


开始进行,首先第一步,忘记密码,触发


第二步

138这个也触发



接着代码层开始比对了,思路就是得到注册的验证码:

990828

在这里填写


还是不正确,怎么回事呢,这时候,需要抓包

把参数改成注册用户的类型,

即:var params="checkCode="+checkCode+"&phone="+phone;;  这段代码的含义

点击修改会触发到这里:

  if(meg=="0")               {               


绑定成功,漏洞利用结束






少长咸集