×

新闻动态 资料下载

关于网站任意密码重置漏洞的那些事儿

0x_www 0x_www 发表于2021-04-29 14:23:48 浏览790 评论0

抢沙发发表评论


关于网站任意密码重置漏洞的那些事儿   


目标:我们选择重置一个重置的点,比如说这个


捕获901.PNG



然后我们选择忘记密码


捕获902.PNG



这里发现4大块

流程是判断用户输入的用户名

验证用户的身份

重置密码

完成

我们现在需要做的就是输入一个在数据库中存在的用户名

比如:test1


捕获9034.PNG



这时候我们发现是存在这个用户的,那么

他的问题是验证码是4位的,可能存在爆破的风险,按照字典组合就是10000个爆破的点

我们如果点击了获取验证码,那么验证码就可能会发送到这个手机

我们先不发送

先看看源代码


function code_post() {        $.post("SendValidateCode.ashx", { hiddenType: $('#hiddenType').val(), hiddAccount: $('#username').val() }, function (data) {            var jsonResult = eval("(" + data + ")");            if (jsonResult.code == "200") {                //$("#hiddenCode").val(jsonResult.obj);                setCookie('timeRecord', 60);
 function code_post() {        $.post("SendValidateCode.ashx", { hiddenType: $('#hiddenType').val(), hiddAccount: $('#username').val() }, function (data) {            var jsonResult = eval("(" + data + ")");            if (jsonResult.code == "200") {                //$("#hiddenCode").val(jsonResult.obj);                setCookie('timeRecord', 60);            }            else if (jsonResult.code == "416") {                alert('当日发送验证码次数超限!');            }            else {                alert("发送失败,请重试!");            }        });    }


他这里做了一个发送的判断


jsonResult.code

就是响应的状态

发送的参数就是hiddAccount

   if (jsonResult.code == "200") {

就是发送成功,那么我们如果直接点击,那么肯定是===

jsonResult.code

发送之后就需要去组合一个字典去爆破了

捕获.PNG


捕获1.PNG




捕获33.PNG

我们要做的就是不发送

所以我们必须先看一看第三步,重置密码的代码


捕获904.PNG



我们先发现这个data是重置的引用

那么他和jsonResult.code
响应是对应的,那么如果jsonResult.code
=200

那么就可以重置

捕获890.PNG


如果json的返回状态码是200,那么就会加载newpassword newpassword1

到第三步

那么去找了jsonResult.code的引用

if (jsonResult.code == "200") {

 var jsonResult = eval("(" + data + ")");                        if (jsonResult.code == "200") {

发现没有任何的过滤

那么就造成了我们修改response信息,在不用发送发验证码的情况下,json也会返回一个newpassword newpassword1

我们试试

捕获800.PNG



把code改成200就可以了

捕获9011.PNG



我们把密码改成asd123qwe


捕获9090.PNG


登录看看




捕获90901.PNG


 我们已经成功了

接下来我们还需要看一看其他的问题


回到第一步

我们发发现找回用户名密码这里


捕获908.PNG



通过getuserinfo.ashx去传username值

读到username的信息

<input type="hidden" id="hiddenId" value="0" />        <input type="hidden" id="hiddenAccount" value="" />

这两个参数是比较重要的

一个是hiddenId

另外一个是hiddenAccount

我们分别是找一找这两个参数的含义


$("#hiddenAccount").val(jsonData[0].user_name);
.post("CheckUserName.ashx", { u: $("#hiddenAccount").val() }, function (data)

这里还是取用户验证的

那么我们找一找这个

hiddenId



hiddenAccount

 $("#hiddenId").val(jsonData[0].user_id);

是读到userid

然后

 $.post("ResetPassword.ashx", { hiddenId: $("#hiddenId").val(), strNumber: $("#txtPwd1").val() }, function (data) {

他相当于是第三步重置完成了,填写了密码

但是他把这个hiddenId,hiddenAccount带进去了

可能就会造成,我们去查询用户的时候,第一个是读到userid ,username,证明数据库中存在xxx用户,同时也会查询到当前用户的密码

第一步 $("#hiddenId").val(jsonData[0].user_id);
$("#hiddenAccount").val(jsonData[0].user_name);
 第三步 $("#newPassword").hide();                            $("#newPassword1").hide();

那么是不是存在这个问题呢

我们测试


捕获9022.PNG



poST方式提交


捕获90221.PNG



果然读到了,而且密码就是我们重置的asd123qwe

那么既然这个都存在,那么发送短信那里,可能也会存在这个问题

那么利用的方式:http://www.XXX.COM/FindPwd/GetUserInfo.ashx?u={这里就是存在的用户名}

提交之后就会得到用户密码,不用发送短信验证

捕获90890.PNG

我们点击GO


短信验证那里,可能也会存在这个问题


捕获9091.PNG



我们都不用爆破,就可以得到验证码了

我们利用就是:http://www.xxx.com/FindPwd/SendValidateCode.ashx?hiddAccount={存在的用户名}

提交就会验证码


接着我们使用我们写过的post 工具来测试看看我们研究出的成果

首先是验证用户的密码


捕获9999.PNG



那么我们接下来读一读验证码


捕获9998.PNG




同样我们验证码也读到了


漏洞利用结束