之前看过其他的二维码登陆绑架缝隙,有的当地写的不是很具体,花了不少时刻去研讨二维码的原理,才弄懂缝隙。为了照料更多入门新手,以自己的了解从头总结一遍,二维码登陆原理不是这儿的主题,不过有必要了解一下流程。
1.翻开登陆当地,挑选扫描二维码登陆,此刻加载二维码;
2.客户端开端轮询,即与服务器树立长衔接,来检测二维码状况;
3.用户翻开手机扫描二维码,此刻二维码为“scan”状况,网页向服务器不断向授权服务器轮询授权码;
4.用户手机看到“承认登陆”按钮,点击此按钮向授权服务器恳求授权,答应此二维码授权,二维码为“confirm”状况(假如超时失效,为“timeout”状况);
5.用户点击“承认登陆”后,网页轮询到授权码,此刻带授权码恳求凭据,成功登陆网站,进入个人中心。
问题解构
使用长轮询完成微信网页版扫码登录:
https://blog.csdn.net/x2145637/Article/details/52795809
这儿有个疑问,二维码几十秒就会过期,怎样办?能够自己写个浏览器插件实时提取出恳求里边回来的状况参数,二维码会有必定的过期时刻,过期会有对应的状况,监控此状况即可,比方状况参数securityId和二维码字符barcode,并更新securityId状况到本地,若timeout则改写二维码;攻击者从本地将barcode当字符串生成自己的二维码图片放在自己的网站上,js一向轮询本地的securityId状况
这儿用微信二维码作为比方,检查二维码状况状况;
拜访https://wx2.qq.com/,页面如下:
拜访此页面时,其实浏览器与服务器之间会树立一个长衔接,用于监控二维码状况。
监控接口为:
https://login.wx2.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=YZm-nRUSFQ==&tip=1&r=-104081975&_=1550587274887
201相当于“scan”状况,手机扫描成功时二维码的状况,手机上点击后监控状况回来如下:
200相当于“confirm”状况,即用户点击承认回来的状况。而且直接回来凭据window.redirect_uri,此刻只需仿制此凭据到其它浏览器拜访,直接可登陆网页版微信。
二维码链接为:
https://login.weixin.qq.com/qrcode/Qe3ev-uOPg==
即二维码字符为Qe3ev-uOPg==,当二维码过期,只需更新此字符Qe3ev-uOPg==即可,更新二维码字符接口:
https://login.weixin.qq.com/jslogin
appid=wx782c26e4c19acffb&fun=new&lang=zh_CN
经过上述可实时更新二维码到自己网站,不必忧虑过期问题。
无“承认登陆”按钮
之一种缝隙,用户扫描二维码直接登陆,没有任何提示,我们都知道,一般扫描二维码会有“承认登陆”等提示,假如没有此提示,简单被攻击者垂钓假造,诱导用户扫描,比方某APP扫描二维码有红包收取,用户只需扫描则被绑架,导致账号被攻击者登陆。这儿用乌云的事例演示。。
能够诈骗绑架进入交游用户的帐号:http://www.anquan.us/static/bugs/wooyun-2013-040673.html。
交游登陆二维码扫描时无任何提示,伪装为加老友的二维码,用户以为是加老友的二维码,,其实是登陆的二维码,当用户扫描时,攻击者那儿可直接登陆用户账号,现在这种缝隙不多了,扫码时基本上都会有登陆等提示
登陆收据盗取
这个缝隙刚开端看的时分,以为是CSRF,,由于大佬们把它归类为CSRF类型,可是我看的时分发现与传统的CSRF彻底不一样,导致一向以CSRF的思想去研讨,被误导了。其实便是收据盗取,结构凭据URL,然后绑架用户的账号。
登陆承认收据盗取,假如没有任何签名维护,攻击者能够直接点击获取的收据拼接链接进行登陆,其实这儿应该是在轮询过程呈现缝隙,用户扫描二维码后,客户端不断轮询恳求服务器,而此次仅仅验证某个令牌等参数来承认用户,只需获取此令牌参数值,则能够假充用户。
取个乌云上的比方,比方 登陆承认恳求如下:
http://szsupport.weixin.qq.com/cgi-bin/mmsupport-bin/qrcodelogin?username=*********&key=*************&clientversion=25030133&devicetype=android8&lan=zh_CN&uuid=AXBIICc4sUSDsFnefkNP&pass_ticket=DebNjGnP2dJnq1bMvHvgL%2BezqqE70Ry9iWB625%2FRT8RRnwCD3tlq3qxuxG5YPzhx
其间uuid为二维码字符,usename为微信号,uuid值怎样获取,文章前面部分现已讲过,usename改为要绑架用户的微信号,key值是不知道的,这儿只需知道key的值可经过此链接登陆方针微信号。
Referer获取key思路:URL跳转、引证站外图片处,把跳转的URL、图片改为攻击者自己网站的URL,只需受害用户点击 结构好的URL,会跳转到攻击者网站,此刻在攻击者服务器恳求包的Referer里,就会看到key值,当然假如跳转处URL有key才能够,不然就去寻觅带有key传递的当地,进行结构,只需能结构出向攻击者服务器发送一个恳求即可。
上述获取key值之后,拼接登陆恳求的链接,在浏览器里拜访如下:
点击“承认登陆”直接登陆受害用户微信账号。
二维码CSRF缝隙
为啥这儿是CSRF?上面却仅仅收据盗取,由于上面的“登陆承认”是不需要用户触发,结构URL后由攻击者直接触发。这儿的CSRF缝隙是由于攻击者无法替代用户直接触发“登陆承认“按钮,有必要以用户自己的身份触发,相似往常的添加、删去的CSRF,此处仅仅针对“登陆承认”的CSRF,当然,这儿还需要用户先扫描二维码,而不能让用户直接触发“登陆承认”的恳求,假如点击二维码链接就相当于扫描二维码的话,可直接结构POC。[1][2]黑客接单网