10种常见姿势带你——找回重置用户密码

53 篇文章 12 订阅
订阅专栏

本篇文章是参考大神carry_your讲师(360补天排名第一)的任意用户密码重置的10种常见姿势总结的笔记。
原视频地址:https://www.ichunqiu.com/course/59045

介绍

本次课程主要针对挖掘逻辑漏洞中的任意用户密码重置方法和原理从10种常见情况进行了讲述,并结合漏洞挖掘中的真实案例场景与数据包演示了重置密码漏洞的检测方法,让大家对这一类逻辑漏洞有从浅入深,逐步深奥的见解。

验证码不失效

造成原因

找回密码的时候获取的验证码缺少时间限制仅值判断了验证码是够正确未判断验证码是否过期

测试方法

通过枚举找到真正的验证码输入验证码完成验证

案例

输入目标手机号,获取验证码随意输入验证码1234点击下一步,拦截数据包:


数据包

POST /Account/CheckYQCode HTTP/1.1
Host: www.xxxx.cn
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0
Accept: */*Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer:
http://www.xxxx.cn/userCenter/toForgetPsdPage.html?mobile=
Content-Length: 11
Cookie: ASP.NET_SessionId=30jfruwn22h2xng3ahhzo2jxConnection: close

YQCode=1234

这种验证码不失效而且验证码是4位数的情况下,直接爆破 看包的返回长度或者内容来找到正确的验证码。


得到正确的验证码是 1059然后到网站上输入验证码跳转到输入新密码的页面完成 重置密码

总结

这种验证码不失效的情况现在已经是非常少见的了,而且验证码的位数也很少有简单的4位验证码了。现在绝大多数是这样的:6位数的验证码而且15分钟内有效,这样子的话爆破的可能性就非常的低了。

验证码直接返回

造成原因

输入手机号后点击获取验证码,验证码在客户端生成,并直接返回在Response方便对接下来的验证码进行比对。

测试方法

直接输入目标手机号,点击获取验证码,并观察返回包即可。在返回包中得到目标手机号获取的验证码,进而完成验证,重置密码成功。

案例

总结

这种情况上次狗哥也拿出来了这样一个类似的案例,记得他那个情况是在找回密码返回包中,直接返回了旧密码的md5值,然后修改返回包可以直接重置管理员的密码。

验证码未绑定用户

造成原因

输入手机号和验证码进行重置密码的时候,仅对验证码是够正确进行了判断,未对该验证码是否与手机号匹配做验证。

测试方法

在提交手机号和验证码的时候,替换手机号为他人手机号进行测试,成功通过验证并重置他人密码。

案例一

首先使用自己的手机号接收验证码,


然后输入自己的手机号接收到的验证码,点击下一步并拦截数据包。

最后替换数据包里的目标手机号,然后发包
数据包

POST /tofindPasswordByPhone3.do HTTP/1.1
Host: www.xxxx.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.xxxx.com/tofindPasswordByPhone2.do?mobile=131234xxxxx&captcha=qkan&checkbox=on
Cookie: JSESSIONID=D4DB3147DBF941799B9CA74E4364F2F9; CNZZDATA1257851838=1754906772-1467355802-%7C1467355802; Hm_lvt_203f11422b4fcc8e2be8c54b036c5ff9=1467357432; Hm_lpvt_203f11422b4fcc8e2be8c54b036c5ff9=1467357978; smsRand="d9[x]1gSjADrs[d]"; td_cookie=699947232;
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 33

mobile=13888888888&smsCode=561768

mobile的值改为我们想要重置的用户手机号点击下一步,跳转到设置密码的页面输入新密码,提交就成功重置了13888888888的密码。

案例二

这个案例是验证码未绑定用户延伸一下,有时候测试会遇到这种,我们发现用户名被加密了,有无法得到具体的加密算法,怎么办?


其实大部分这种情况我们都不需要知道加密算法,比如这里例子,得到 liuyy的加密后的值是 80e688602c4b11e66320c421e3b71ef2,那么我们就可以直接利用这个 keyCode参数了。

步骤是一样的,输入我们的用户名和收到的验证码,然后把我们的 keycode替换为 liuyy的那个 keycode,这样就可以重置 liuyy的密码了。(漏洞原因还是是判断了验证码是否正确,而没有判断该验证码是否跟该用户匹配。)

总结

这种情况没有遇到过,学习了,以后在找回密码的时候会这么测试的。现在看来对于白帽子来说有2个手机号是多么的方便了。
案例二中如何获取到其他用户的keyCode呢?这里的话正常走一遍找回密码的流程,然后抓包就会在数据包中找到加密后的keyCode了,这样就可以重置任意用户的密码了。

修改接受验证码的手机或邮箱

造成原因

用户名、手机号、验证码三者没有统一进行验证,仅判断了三者中的手机号和验证是否匹配和正确,如果正确则判断成功并进入下一流程。

测试方法

输入用户名获取验证码,修改接收验证码的手机号为自己的号码,自己手机成功接收验证码,提交到网站进行验证,验证成功并进入下一流程。

案例


点击找回密码,首先我们输入 zhangwei,然后点击获取验证码,这个时候把 手机号改为我们自己的号码,(一般情况下这里是在数据包中进行修改的),然后输入我们 自己的号码和验证码,成功跳到重置密码的页面,密码重置成功。

总结

carry_your大神说这种情况下还是比较常见的,这里不是很能理解,为什么程序员开发的时候不做用户名和手机号的匹配呢?我平时测试的时候,很少遇到这种不做用户名和手机号匹配的情况 ⊙﹏⊙|||

本地验证绕过

造成原因

客户端在本地进行验证码是否正确的判断,而该判断结果也可以在本地修改,最终导致欺骗客户端,误以为我们已经输入了正确的验证码。

测试方法

重置目标用户,输入错误验证码,修改返回包,把错误改为正确,即可绕过验证步骤,最终重置用户密码。

案例


输入手机号 13888888888,输入验证码 123456,验证码错误的时候,返回包返回的是 0

这里我们所做的就是把 0修改为 1,可以借工具修改返回包,我们把 0改为 1,然后查看页面,成功跳转到修改密码的页面,输入新密码即可修改用户 13888888888的密码

总结

who_jeff大神曾经分享给过这样一个类似的案例,当时他是在一个安卓app上进行抓包测试的,当时就直接修改返回包 来欺骗本地的app客户端的,成功重置任意用户的密码。

跳过验证步骤

造成原因

对修改密码的步骤,没有做校验,导致可以直接输入最终修改密码的网址,直接跳转到该页面,然后输入新密码达到重置密码的目的。

测试方法

首先使用自己的账号走一次流程获取每个步骤的页面链接,然后记录页面3对应的输入新密码的链接,重置他人用户时,获取验证码后,直接输入页面3链接到新密码的界面,输入密码重置成功。

案例


首先我们走一下所有的步骤,页面1、页面2、页面3,然后记录下页面3的链接

然后尝试重置他人的用户。(ps:页面 3是在我们的邮箱里接收到的链接)
是某集团系统,所以用户wangshuai,邮箱对应wangshuai@xxx.com.cn

使用账户 wangshuai,点击获取验证码,然后补齐下面的链接 https://xxx/page/login/veifyAccess.html?username=wangshuai&email=wangshuai@xxx.com.cn访问后即可 直接重置该用户的密码

总结

这个漏洞不用按照正常的流程来走,这里的话直接补齐设置新密码的链接,然后利用这里链接可以直接重置任意用户的密码。

未校验用户字段的值

造成原因

在整个重置密码的流程中,只对验证码手机号做了校验,未对后面设置新密码的用户身份做判断,导致在最后一步通过修改用户身份来重置他人的密码。

测试方法

使用自己的手机号走流程,在走到最后一个设置密码的流程时,修改数据包里的用户信息。

案例


使用自己的手机号走流程,最后一步的数据包:
数据包

POST /yw_xxx/regist/saveNewPwd.action HTTP/1.1
Host: www.xxx.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.xxx.com/yw_xxx/regist/toSetPwd.action
Cookie: td_cookie=2080441838; JSESSIONID=530DD2516536F63131A1C098089CF2FB; JSESSIONID=5F3E182FAE378C1E799342C059F923B9Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 57

upassword=qwer1111&upassword1=qwer1111&mphone=131234xxxxx

我们可以看到密码找回成功


而且参数中只有 密码用户名cookie值无效,只需要修改指定用户名的值,就可以重置他人的用户密码。

修改用户为 13888888888,在发送数据包,我们就成功的把 138的密码修改为 qwer111

总结

这里的话关键是在最后一步重置密码的时候替换目标手机号,这种其实也是比较暴力的,拿到这个链接的话 可以无条件批量重置任意用户的密码,这里面利用burp可以批量枚举手机号码的mphone参数。

修改密码处id可替换

造成原因

修改密码的时候,没有对原密码进行判断,且根据id的值来修改用户的密码,类似的SQL语句:

Sql
update user set  password="qwer1234" where id =1

修改数据包里的id的值,即可修改他人密码。

测试方法

修改自己用户密码,抓取数据包,替换数据包中用户对应的id值,即可修改他人的密码。

案例


点击 立即提交,得到右边的数据包,测试发现修改id为 5,就可以把对应的用户密码修改为 123456,没有对用户的原始密码判断,也没有判断 id是否属于该用户。
数据包

POST /Index/user/userinfo.html HTTP/1.1
Host: 192.168.8.31:8088Content-Length: 63Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://192.168.8.31:8088
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.202 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://192.168.8.31:8088/Index/user/userinfo.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: PHPSESSID=28af1649bcbcb0e0dd83afa017691a03; __sticket=hKdyp310daeBfKWqgnimZoB2zrKwespkfaaVm4KKpN-Fp3tokWJ-YJeQqWOXe9mpf5-br8dox6SUlX_Rgn2t05GVpZ6Jqoaqg3zMoY-rnnM.6.a.

id=6&user_name=kefu1&password=123456&name=kefu123&email=&phone=

这里的idkefu1的所在参数user_name并没有去判断是否为用一个用户,这里修改id是可以任意修改其他用户的密码的。


这里在不修改 user_name的情况下,只修改 id值就成功重置了用户的密码。

总结

这种也比较暴力流氓,可以通过枚举id的值 ,来大批量重置任意用户密码的漏洞,因为不需要用户名了,只需要知道id值即可,危害比较大。

cookie值的替换

造成原因

重置密码走到最后一步的时候仅判断唯一的用户标识cookie是否存在,并没有判断该cookie有没有通过之前重置密码过程的验证,导致可替换cookie重置他人用户密码。(cookie可指定用户获取。)

测试方法

重置自己用户密码到达最后阶段,抓到数据包,并在第一阶段重新获取目标用户cookie,替换cookie到我们抓取的数据包中,发包测试。

案例


首先我们重置自己的用户 wang111的密码到最后一步,成功重置密码,抓到如下数据包。
数据包

POST /ppc/valid/resetPassword.do HTTP/1.1
Host: www.xxx.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.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: http://www.xxx.com/ppc/valid/showResetPassword.do
Content-Length: 37
Cookie: JSESSIONID=E1AC27A7302C03C9432DE2254B99311A
Connection: close

password=qwer1111&rePassword=qwer1111

这里的数据包中并没有出现用用户的参数信息,所以这里面的话,可以判断这里应该是用cookie作为身份的判断的。


到第一步去获取验证码的时候,点击下一页,可以获取到该用户 wangshuai对应的内容

Ru
Cookie: JSESSIONID=E1AC27A7302C03C9432DE2254B99311A

拿到这个cookie就意味着可以利用这个身份判断标识去重置这个用户的密码了。


替换得到的 cookie值,即把 cookie对应的用户 wangshuai的密码修改为 qwer1234

总结

关键点:cookie可指定用户获取,尝试用他人账号来找回密码的时候,抓取数据包,可以从中提取出cookie值,然后就可以利用这个cookie值,就可以重置指定用户的密码了。

修改信息时替换字段值

造成原因

在执行修改信息的sql语句的时候,用户的密码也当作字段执行了,而且是根据隐藏参数loginid来执行的,这样就导致修改隐藏参数loginid的值,就可以修改他人的用户密码。

测试方法

修改个人资料的时候,抓取数据包,然后来修改数据包的参数和对应的值,参数名一般可以在其他地方找到,替换隐藏参数即可修改他人的密码等信息。

案例


点击 保存信息 抓取数据包
数据包

POST /xxxxx/employee_updateEmployeeInf.action HTTP/1.1
Host: www.xxxxx.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Referer: https://www.xxxxx.com/xxxxx/employee_forUpdate.action
Cookie: JSESSIONID=A115648DB5F49215078E583ABB6A665A; FLGSID=FLGSRV1; loginUrl=""Connection: close
Content-Type: multipart/form-data;boundary=---------------------------222991508618208
Content-Length: 709
-----------------------------222991508618208
Content-Disposition: form-data; name="mobileNo"
177XXXXXXXX
-----------------------------222991508618208
Content-Disposition: form-data; name="departId"
49
-----------------------------222991508618208
Content-Disposition: form-data; name="minority"
-----------------------------222991508618208
Content-Disposition: form-data; name="sex"
1
-----------------------------222991508618208
Content-Disposition: form-data; name="birthday"
19920829
-----------------------------222991508618208
Content-Disposition: form-data; name="photo"; filename=""
Content-Type: application/octet-stream
-----------------------------222991508618208--

可以看到数据包里只有这几个参数mobileNo、departId、minority、sex、birthdaymobileNo是用户对应的手机号我们尝试修改mobileNo的值,所获得的效果就是我们的手机号修改了,而这个手机号本身就是可以修改的。这个数据包中并没有找到我们标识用户身份的参数信息,唯一可以修改的手机号也只是表单中直接修改可以改变的。接下来我们去找一下隐藏参数。。。

view-source:https://www.xxx.com/ua/employee/forUpdate.do

查看下这个页面的源代码,找到了一个参数loginId,这个参数是对应用户身份的而我们发现 上面的数据包里没有这个参数,那么我们是否可以自己添加上去呢?


这里修改数据包,添加字段 loginId,并且把值修改为他人的用户,发包返回修改成功,这样就成功的把用户 871xxxx的密码改为跟我们密码相同的值。

总结

最后一种要稍微复杂一点,得去找到隐藏参数:loginId 然后再修改数据包,以后挖洞的时候,多留意这些。

转自:https://www.sqlsec.com/2017/10/resetpass.html
作者:国光

写文章

热门文章

  • CTF新手,请问从本地访问flag! 84384
  • 【封神台 - 掌控安全靶场】尤里的复仇 Ⅰ 小芳!一二三四五六七章 34222
  • CTF 音频隐写 大总结 27515
  • Hackbar 免费下载+使用指南 18838
  • 最新版 Kali 2020.3 高DPI 缩放,桌面文字太小怎么调? 17424

分类专栏

  • 奇怪的知识增加了 12篇
  • OSCP 2篇
  • OffSec 2篇
  • Proving grounds Play 2篇
  • 学习方法 3篇
  • Web安全 53篇
  • Linux 10篇
  • SQL 9篇
  • Windows 5篇
  • Python 24篇
  • CTF 13篇
  • 攻防 1篇
  • 实例
  • Crypto 1篇
  • C 1篇
  • MISC 17篇
  • 网站 6篇
  • 大数据 1篇
  • 朝花夕拾 1篇
  • 前端 3篇
  • 取证 1篇
  • 工具 1篇

最新评论

  • B站 郝斌C语言 课件+笔记 (全)

    Auto_yaoyao: 兄弟,有那个文档获取吗

  • 第四届“蓝帽杯”全国大学生网络安全 技能大赛 Writeup

    Q37_E37: import requests import time host = "http://eci-2ze8wn7okojkfsn6fg3d.cloudeci1.ichunqiu.com/?" def dumpTable(): global host ans='' for i in range(1,1000): low = 32 high = 128 mid = (low+high)//2 while low < high: url = host + "id=1^(ascii(substr((select(flag)from(flag)),%d,1))<%d)^1" % (i,mid) res = requests.get(url) if "YES" in res.text: high = mid else: low = mid+1 mid=(low+high)//2 if mid <= 32 or mid >= 127: break ans += chr(mid-1) print("dumpTable is -> "+ans) dumpTable()

  • 【BUUCTF】[GXYCTF2019] Ping Ping Ping 总结笔记 Writeup

    孤丞OVO: base64 -decode

  • 【BUUCTF】[GXYCTF2019] Ping Ping Ping 总结笔记 Writeup

    cllnb: 就是用base64编码输出

  • 第四届“蓝帽杯”全国大学生网络安全 技能大赛 Writeup

    orangedeer_updating: 可以给一下easiestsqli的脚本吗,

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • OffSec Labs Proving grounds Play——Gaara
  • OffSec Labs Proving grounds Play——FunboxEasyEnum
  • 【Bugku】秋名山老司机 详细题解 Writeup
2023年2篇
2020年172篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源瑞字起名男孩名缺火又缺水女孩起名免费起名称网站给大师起名男孩孙姓起名大全新生儿起名子男孩大全方姓名字大全女孩起名双胞胎兄弟起名小名质量效应2攻略的王 起名大全免费给宝宝起名的网址警方透露生父摔死幼童案细节一起创业的公司名字其实幸福很简单翊起名女孩名字卜姓起名核桃商标起名起亚智跑质量排名新疆炒米粉起个好听的名二十道简单易做家常菜七画的字男孩起名用小额股份理财秋天的校园作文聊斋3烤鱼店起名大全雪梅宋卢钺诗积木盒子官网网上起名准吗梁起名上善若水淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化