token安全之任意密码重置

前言

偶然间挖了一个漏洞是密码重置,挖掘过程很有趣,可以参考下。

挖掘过程

在说明之前我们可以先走下正常流程,这样才方便查漏~

正常流程

第一步骤:

正常填写完,点击下一步发送请求:

POST /[URI] HTTP/1.1
Host: [Host]
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: [Referer]
Content-Length: 37
Cookie: [Cookie]
X-Forwarded-For: 127.0.0.1
Connection: close

userName=用户名/手机号/邮箱&code=验证码

获得对应的响应报文:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 217
Connection: close
Server: nginx/1.12.2

{"code":200,"data":{"username":"用户名"
,"mobile":"手机号","email":"邮箱","token":"3c6e0b8a9c15224a8228b9a98ca1531df72f78a365657d56853b6867fb37dc3c444bcb3a3fcf8389296c49467f27e1d6"},"msg":"ok"}

第二步骤:

获取验证码->输入验证码-进入第三步骤:

输入验证码进入第三步骤的请求包:

POST /[URI] HTTP/1.1
Host: [Host]
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: [Referer]
Content-Length: 133
Cookie: [Cookie]
X-Forwarded-For: 127.0.0.1
Connection: close

receiver=email&token=3c6e0b8a9c15224a8228b9a98ca1531df72f78a365657d56853b6867fb37dc3c444bcb3a3fcf8389296c49467f27e1d6&verifyCode=6685

第三步骤重置密码请求包:

POST /[URI] HTTP/1.1
Host: [Host]
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: [Referer]
Content-Length: 133
Cookie: [Cookie]
X-Forwarded-For: 127.0.0.1
Connection: close

token=3c6e0b8a9c15224a8228b9a98ca1531df72f78a365657d56853b6867fb37dc3c444bcb3a3fcf8389296c49467f27e1d6&pwd=mstsecsb123&checkPwd=mstsecsb123

分析流程

因为这里主要的目标是逻辑漏洞,所以其他类型的就不作研究~

分析并验证可疑点:

1.第一步骤返回包中能获取到的东西

名字 类型
username 正常 [明文]
mobile 打码 [138***888]
email 打码 [123***[email protected]]
token 正常 [加密处理过]

这里先给token划上疑问>其是否可以逆向?

这里的token值跟md5加密很相似,但是长度不一样(MD5长度为16位/32位)

所以大胆的猜想这里的token值可能是由多个md5拼接组成

得到token的值为96位除以根据MD5的长度(16位/32位),得出可能是由三组或者六组组成,这里我很幸运因为我按照三组的方式解密居然发现解密出来了,这里先按照32位分割:

然后丢去解密:

Md5 Text
3c6e0b8a9c15224a8228b9a98ca1531d key [用户名]
f72f78a365657d56853b6867fb37dc3c 6685 [时间戳]
444bcb3a3fcf8389296c49467f27e1d6 ok [返回消息正文 "msg":"ok"]

结论: Token可逆向

2.根据结论分析第二步骤验证码是否跟token有关联:

token=3c6e0b8a9c15224a8228b9a98ca1531df72f78a365657d56853b6867fb37dc3c444bcb3a3fcf8389296c49467f27e1d6&verifyCode=6685

结论: 直接从逆向token操作中可以了解到两者之间是有关联的有token就能知道重置密码的验证码

3.根据结论分析第二步骤是否是必要操作:

这里直接根据第一步骤获取的内容带入到第三步骤,完全可以成功重置密码,发现完全可以绕过第二步骤的验证。

结论: 直接把第一步返回的token带入第三步骤即可重置密码

结尾

原文地址:https://www.cnblogs.com/pshell/p/8120064.html

时间: 2024-10-12 15:40:41

token安全之任意密码重置的相关文章

任意用户密码重置(二):重置凭证接收端可篡改

在逻辑漏洞中,任意用户密码重置最为常见,可能出现在新用户注册页面,也可能是用户登录后重置密码的页面,或者用户忘记密码时的密码找回页面,其中,密码找回功能是重灾区.我把日常渗透过程中遇到的案例作了漏洞成因分析,这次,关注因重置凭证接收端可篡改导致的任意用户密码重置问题. 密码找回逻辑含有用户标识(用户名.用户 ID.cookie).接收端(手机.邮箱).凭证(验证码.token).当前步骤等四个要素,若这几个要素没有完整关联,则可能导致任意密码重置漏洞. 前情提要:[传送门] 案例一:接收端可篡改

任意用户密码重置(四):重置凭证未校验

在逻辑漏洞中,任意用户密码重置最为常见,可能出现在新用户注册页面,也可能是用户登录后重置密码的页面,或者用户忘记密码时的密码找回页面,其中,密码找回功能是重灾区.我把日常渗透过程中遇到的案例作了漏洞成因分析,这次,关注因重置凭证未校验导致的任意用户密码重置问题. 传送门: 任意用户密码重置(一):重置凭证泄漏 任意用户密码重置(二):重置凭证接收端可篡改 任意用户密码重置(三):用户混淆 密码找回需要鉴别用户的合法身份,证明你就是你,通常有两种做法,一是网站将重置验证码发至用户绑定的邮箱或手机号

zzcms8.2#任意用户密码重置#del.php时间盲注#复现

00x0 引言 早上起来,发现seebug更新了一批新的洞, 发现zzcms8.2这个洞好多人在挖,于是我就默默的踏上了复现之路(要不是点进去要买详情,我何必这么折腾~) 环境:zzcms8.2(产品招商型) php-5.4.45 . mysql-5.5.53 01x0 任意用户密码重置 01x1 任意用户密码重置方式一 话说,这个洞的标题应该是任意前台用户密码重置,后台管理员重置不了的,或许是我复现的问题.~~ 先注册个账号,然后首页点击找回密码. 地址:http://localhost/on

任意用户密码重置(五):重置凭证可暴破

在逻辑漏洞中,任意用户密码重置最为常见,可能出现在新用户注册页面,也可能是用户登录后重置密码的页面,或者用户忘记密码时的密码找回页面,其中,密码找回功能是重灾区.我把日常渗透过程中遇到的案例作了漏洞成因分析,这次,关注因重置凭证可暴破导致的任意用户密码重置问题. 传送门: 任意用户密码重置(一):重置凭证泄漏 任意用户密码重置(二):重置凭证接收端可篡改 任意用户密码重置(三):用户混淆 任意用户密码重置(四):重置凭证未校验 密码找回需要鉴别用户的合法身份,证明你就是你,通常有两种做法,一是网

任意用户密码重置的10种姿势

以前安全测试最爱挖的就是任意用户密码重置,今天看了carry_your师傅在ichunqiu上的视频文字总结一下任意用户密码重置的10种姿势: 1,短信验证码可爆破: 视频案例中输入手机号码.图片验证码就可以获取短信验证码,并且新密码也是在一个页面中,但是输入短信验证码之后,后端有个请求会判断短信验证码是否正确,错误的话页面会有提醒.攻击者可以用这个请求来爆破验证码,获取到正确的短信验证码之后就可以重置任意用户密码了. 缺陷主要是两个方面,第一,未对短信验证码的失效时间进行限制:第二,功能设计存

ASP.NET Core 打造一个简单的图书馆管理系统(四)密码修改以及密码重置

 前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows <Pro ASP.NET MVC 5>.<Bootstrap 开发精解>.<锋利的 jQuery> 此系列皆使用 VS2017+C# 作为开发环境

mysql密码重置

mysql密码重置 mysql 密码忘记了怎么办?!下面步骤是如何重置mysql的密码: 1.打开mysql的配置文件,命令:vim /etc/my.cnf .在配置文件中新增一行 skip-grant,结果如下图所示: 2.保存并退出! 3.重启mysqld,命令:service mysqld restart 4.mysql -uroot进入,use mysql:#使用mysql库update user set password='123'where user='root': #更改user这

1~2_Mysql 的配置之密码重置& mysql 登陆

mysql 黙认mysql 是没有设置密码的,正常情况下还是应该设置一个密码. [[email protected] ~]# mysql -uroot 用quit  退出来 给mysql 设置密码 [[email protected] ~]# mysqladmin -uroot password 'zaq12wsx' 如果我们忘记了mysql 的密码,怎么解决呢? 初始化密码 [[email protected] ~]# vim /etc/my.cnf  #编辑my.cnf skip-grant

LAMP - MySQL的root密码重置

登录数据库时,可能会忘记密码,怎么办呢? 方法:编辑mysql配置文件,不让mysql去授权:之后输入mysql无用户登录,因为是root用户,所以在mysql库里进行密码的重置 mysql密码重置过程及语句: [[email protected] ~]# mysql -uroot ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 不输入密码登录会报错 [[email protec