前言1:上次发了QQ邮箱self-xss的综合利用链,因为之前提交了TSRC,看了已经修复才把漏洞细节发出来的,然后被扣了安全币和积分。由于没认真看条款在这先道个歉。
前言2:随着移动应用的普及,二维码在我们的日常生活中显得越来越重要。其中二维码有一个功能用于移动端和PC端的交互认证。随着新事物的出现,新的漏洞也有可能随之出现。要想挖到新漏洞就得先弄清他的原理。
一、抓包分析
既然二维码认证是基于网络流量的认证首选当然是抓包啦。
环境:Chrome+BURP
网址:https://mail.qq.com(QQ邮箱)
1.1.打开网址,点击扫码快捷登录
这样你会抓到一个生成二维码的请求,并得到一个二维码和一个qrsig的cookie,qrsig这个值非常重要,后面会用到。
1.2.接着你就会发现,客户端一直在向服务器发送一个请求包,返回包为二维码未失效(一开始以为是验证二维码的时效性,后面发现不仅仅如此)
1.3.既然有未失效,我索性等了几分钟,看二维码失效是怎么样的
1.4.点击刷新后,发现这个操作又触发了1.1获取新的二维码和qrsig值
1.5.接着我们流程就重复了,现在我们分析下1.2一直重复包的结构
不停测试去掉无关紧要值如下
GET/ptqrlogin?u1=https%3A%2F%2Fmail.qq.com%2Fcgi-bin%2Freadtemplate%3Fcheck%3Dfalse%26t%3Dloginpage_new_jump%26vt%3Dpassport%26vm%3Dwpt%26ft%3Dloginpage%26target%3D&ptqrtoken=650520951&from_ui=1&action=3-13-1576220049044&aid=522005705& HTTP/1.1
Host: ssl.ptlogin2.qq.com
Connection: close
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Accept: */*
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: no-cors
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: qrsig=jJI71X4ePycn70DE485AKclRQL2toySex06uRmVtyr31ra3xTakttA-z3FInBb0I
我们一个一个变量来分析:
u1=要授权的网站(这里是QQ邮箱)
from_ui=1 固定值
ptqrtoken=token 跟cookie的qrsig值对应
action=时间窜
aid= 这个没看懂是啥(但是这个值貌似不重要)
cookie:qrsig(关键值,与ptqrtoken存在对应关系,因为改任意一个值都会报错)
综上所述可以看出:qrsig和ptqrtoken是关键值
服务器就给了我们一个qrsig值,却没有给我们ptqrtoken,所以猜测是通过已缓存的JS算出来的,在资源项中搜索ptqrtoken
果然搜索到了,下载js本地分析:
https://cdn-go.cn/qq-web/any.ptlogin2.qq.com/c7d607f7//ptlogin/ver/19112817/js/c_login_2.js
发现ptqrtoken由qrsig经过hash33生成而成,在js中搜索hash33函数。
function a(t){
for(var e=0,i=0,n=t.length;
i<n;++i)e+=(e<<5)+t.charCodeAt(i);
return 2147483647&e}
通过之前抓取的值本地调试一波,并验证
对比抓包数据,是可以验证成功的。
1.6.既然已经对所有关键值已经有所了解了,接着继续往下走,刷二维码进行认证。
可以从图中看出这三个包分别返回值为认证中,未失效,以及登录成功。但是他们的请求包竟然一模一样。这样就可以推测出客户端一直向服务端以一定频率发送的请求的功能是判断二维码的状态,认证成功/认证状态/二维码是否失效。这样一个完整的认证过程就结束了。
二、流程分析
1、获取二维码以及qrsig值
2、客户端根据qrsig值算出ptqrtoken值
3、客户端一直向服务器发送包含qrsig和ptqrtoken的包(服务器返回二维码状态)
4、当有人扫描二维码并确认
5、服务端在确认后的下一个3步请求返回认证成功的内容
当时间过长二维码失 效回滚第一步,当扫描后未确认,回滚到第二步。
三、舔狗模式
为了更生动形象便于理解,以舔狗来举例。
舔狗向女神要联系方式(qrsig),女神给了。
舔狗日常舔女神,以一定频率的间隔向女神表白(步骤3),女神回复:不讨厌(二维码未失效)。
因为舔狗天天表白,一定时间后女神烦了,回复滚(二维码失效),舔狗必须付出一定代价(刷新)才能继续舔女神。
当一天舔狗突然暴富去找女神(扫描二维码),并同意把钱全部给女神(并点击确认)。舔狗在下一次表白的时候就成功了(步骤3)
———————————————————————————————————————————————————————–
前言3:既然上文弄清了二维码认证的原理,这里就把利用也写了吧
四、我们回顾下上篇文章的认证过程及钓鱼原理
获取二维码图片和cookie值
一直向服务器发送请求包来确认二维码状态
扫描二维码并确认
在下一次请求二维码状态的时候,返回认证成功后页面
从这个过程中我们可以看到二维码认证的机制存在问题
1、任何人都可以请求一个二维码
2、二维码适用于任何一个ID
3、请求二维码方和认证二维码方可以不是同一个会话
这样我们就可以通过以上三点,实施钓鱼攻击,也就是黑客请求一个二维码,然后根据返回的cookie一直向服务器请求认证状态。接着把二维码发送给受害者,根据具体情况选择不同的攻击方案。如:
1.即时聊天工具的一次性二维码钓鱼攻击
2.钓鱼页面的实时刷新的二维码钓鱼攻击
简单画下原理图
这样实现并不困难,具体步骤就按着流程图自己去做吧,今天我们要讲的是配合ssrf漏洞的二维码钓鱼。
五、ssrf+二维码钓鱼
上图可以看出要实现完美的钓鱼,还缺一个如何完美诱骗受害者扫描二维码。是否能配合其他漏洞使钓鱼更加完美呢?这时我就想到了ssrf漏洞。原理图如下
如上图可以看到用户首先访问了存在SSRF漏洞的正规网站,正规网站指向黑客服务器,黑客服务器指向QQ认证服务器,可以简单理解为双重ssrf的利用。
六、生动举例(杀猪盘攻击)
上一篇文章举例了舔狗攻击,这篇文章我就以杀猪盘为例吧。
1、渣男发现一个漏洞,可以通过可信度比较高的人士宣称自己是成功人士(ssrf)
2、渣男批量把这个消息发送给妹子们(上图步骤1)
3、因为这个消息来自可信度比较高的人,妹子们选择相信(步骤2)
4、渣男向银行申请取款(步骤4),银行返回给渣男一个有失效限制的二维码需要妹子们确认(步骤5)
5、渣男们通过甜言蜜语诱骗妹子们扫描二维码(即妹子扫描二维码并确认,上图未画)
6、渣男不知道妹子们有没有扫码并确认,就一直问银行,妹子认证了没?
7、妹子认证成功,银行在渣男下一次询问中,把钱给渣男
文章不能插视频,要改自己去下了帖进去
*本文原创作者:꧁,本文属于FreeBuf原创奖励计划,未经许可禁止转载
来源:freebuf.com 2020-08-05 17:21:22 by: ꧁
请登录后发表评论
注册