换一种姿势挖掘任意用户密码重置漏洞
上一篇文章我们提到了利用Unicode规范化来挖洞的思路以及方法,大家反响很热烈
一直在后台给我留言,苦苦哀求
让我憋tm写了,一直写烦不烦呀
现在的读者都已经这么体贴了吗?都已经开始关心我辛苦码字烦躁不烦躁了吗?
别担心,好歹我也是曾被称为阳光幼儿园四班劳动积极分子的男人,这点苦,不算啥!
于是我打开电脑,给你们写了这篇。
国际化域名(IDN)简介
上文已经提到过这个东西了,其实很简单,咱们通常使用的域名都是英文(ascii)字符的,而IDN则允许我们注册ascii字符以外的字符为域名,比如我可以注册一个域名为“阿信.com”,是不是挺拉风的?
虽然我们是注册了这么一个域名奥,但是可能是为了方便存储?(我也不知道方便啥 ?),国际化域名中提供了一种其他字符的域名到ascii字符域名的一个映射,这个映射就是Punnycode,你可以到如下地址体验一下中文域名转换为Punnycode是啥样的:
https://www.punycoder.com/
漏洞场景
有了以上基础,我们来看一下大佬挖到的一个价值$600的任意用户密码重置漏洞。
我们假设目标网站地址为https://axin.com
本次存在漏洞的接口为https://axin.com/forget-password?email=
,可以看到,这是一个再普通不过的通过邮箱重置密码的功能点
但是这个接口没能正确的处理Unicode字符,也就是说,当我输入邮箱victim@gmáil.com
会被规范化为victim@gmail.com
然后目标站点axin.com
就会把victim@gmail.com
用户的重置密码链接发送到邮箱victim@xn--gmil-6na.com
中,其中xn--gmil-6na.com
是gmáil.com
的punnycode
所以,只要我去注册gmáil.com
域名,并搭建一个邮件服务器就能够完成攻击
那有人又要说了,“这个漏洞的挖掘成本也太高了,还要去注册域名,太麻烦!”
其实,duck不必自己去注册域名,我们只要确定这个点是存在Unicode规范化就行,借助burp插件collabrator client就可以实现
我们都知道burp为了方便我们测试一些没有回显的漏洞,提供了一个在公网能够访问到的域名burpcollaborator.net
,并且在使用collabrator的时候会随机生成一个二级域名供我们使用,比如3bfqygorkwzimx55ppnmvkandej47t.burpcollaborator.net
那我们怎么利用这个域名来挖掘这种漏洞呢?其实很简单,流程如下:
- 到目标站点用邮箱
victim@gmail.com.3bfqygorkwzimx55ppnmvkandej47t.burpcollaborator.net
注册一个测试账号 - 然后在重置密码的接口处输入含有Unicode字符的邮箱地址:
victim@gmáil.com.3bfqygorkwzimx55ppnmvkandej47t.burpcollaborator.net
,发送 - 如果目标存在漏洞,我们就可以在collobrator client上看到目标站点发送给我们的
victim@gmail.com
用户的重置密码链接了
- 【译】MySQL char、varchar的区别
- 【jfinal修仙系列】修改ShiroPlugin支持jfinal3.0
- MySQL二进制日志
- 【nginx启动】 97 Address family not supported by protocol
- jfinal 内置的handler功能
- JS 对指定iframe 全屏操作
- 【jfinal修仙系列】扩展CacheInterceptor支持Redis缓存
- 基于Redis的定时任务
- 【jfinal】扩展JFIANL 支持加载jar包中SQL模板
- 【jfinal修仙系列】扩展ShiroCacheManager 支持Redis缓存
- 【springboot】 springboot 整合mybatis-plus
- jfinal-swagger让你的应用接口更加简单
- 【springboot】 spring session 分布式会话共享
- 基于jfinal Template的Shiro 标签
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 5.04-requests_cookies
- 通过 Node.js 小示例学习浏览器缓存策略
- [未解决]报错: execjs._exceptions.ProgramError: TypeError: Cannot read property 'extend' of undefined
- 5.05-requests_cookies2
- 5.06-re
- Python3爬虫 利用百度地图api得到城市经纬度
- [未解决]报错: pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in y
- 6.01-re-split_chinese
- Mac上安装tesseract-OCR
- 6.02-news_re
- 6.03-news_xpath2
- 修改mysql密码
- 6.04-news_xpath3
- 6.05-btc
- 7.01-beautiful_soup