Cookie欺騙 騰訊拍拍秒殺活動的驗證碼漏洞
首先我想討論一下驗證碼這玩意兒。
有誰還記得大概幾年前突然出現(xiàn)了驗證碼這東西,許多網(wǎng)站甚至桌面應(yīng)用程序都陸續(xù)實現(xiàn)了驗證碼技術(shù),主要作用無非就是防止用戶利用程序進(jìn)行自動提交,避免暴力破解,避免服務(wù)器遭受惡意攻擊。
那么,驗證碼機(jī)制又該如何實現(xiàn)。
目前主流的實現(xiàn)技術(shù)主要有session和cookie兩種方式,而這兩種方式可以說技術(shù)是一樣的,區(qū)別在于將驗證碼字符串存儲在服務(wù)器還是客戶端。
前者工作流程:服務(wù)器發(fā)送驗證碼圖片到客戶端并在服務(wù)器保存驗證碼字符串到session,用戶辨認(rèn)圖片并提交驗證碼字符串到服務(wù)器,服務(wù)器將用戶提交的驗證碼字符串與session中保存的字符串進(jìn)行比較。
后者工作流程:服務(wù)器發(fā)送驗證碼圖片以及驗證碼字符串(可能會進(jìn)行加密)到客戶端,客戶端將驗證碼字符串存儲到本地cookie,用戶辨認(rèn)圖片并提交驗證碼字符串以及cookie中所存儲的字符串到服務(wù)器,服務(wù)器將用戶提交的兩個字符串(進(jìn)行解密后)進(jìn)行比較。
相對而言,存放在服務(wù)器的session更為安全,只不過消耗服務(wù)器內(nèi)存,程序員除了使用模式識別辨認(rèn)出驗證碼,沒有其他辦法。而對于使用cookie方式的驗證碼,不增加服務(wù)器內(nèi)存消耗,但我們可以通過對傳輸數(shù)據(jù)進(jìn)行分析輕易破解驗證碼。
這種傳統(tǒng)的驗證碼方式,其框架非常簡單。
看上圖,我們從大的框架分析問題,這里面說的“提供驗證碼服務(wù)”已經(jīng)不區(qū)分session還是cookie了。
接下來從圖中我們可以看出什么了呢,對于有多臺服務(wù)器的大企業(yè)是十分平常的,那么,假如每一個服務(wù)程序都使用驗證碼技術(shù),那么每一個服務(wù)程序就需要獨自實現(xiàn)驗證碼服務(wù),這樣做不是不可以,只是增加了程序員的負(fù)擔(dān)而已。
好吧,現(xiàn)在我們正式進(jìn)入今天的主題,也是接著上面的話題,騰訊的驗證碼框架有何不同。
我們隨便進(jìn)入一個需要驗證碼的騰訊頁面:
http://web2.qq.com
登錄webQQ的時候需要輸入驗證碼,我們通過抓包或者看源代碼,可以知道點擊“換一張”時其實是訪問了這個URL:http://captcha.qq.com/getimage,來自tencent http server。多嘗試幾個需要驗證碼的頁面,發(fā)現(xiàn)其驗證碼依然是是通過訪問http://captcha.qq.com/getimage獲得。當(dāng)然也有例外的情況,不過總體看來騰訊的驗證碼機(jī)制的框架與上面討論的又有些不一樣。
看到了嗎,在這種框架體系下,驗證碼成了一個單獨的組件,不同服務(wù)器不同應(yīng)用程序都可使用它提供的驗證碼服務(wù)接口。
具體流程
好吧,我們繼續(xù)進(jìn)一步研究騰訊驗證碼的具體流程。
訪問http://captcha.qq.com/getimage,看到“zqcu”驗證碼圖片,抓包,查看響應(yīng)標(biāo)頭:
鍵 值
響應(yīng) HTTP/1.1 200 OK
Server tencent http server
Accept-Ranges bytes
Pragma No-cache
Content-Length 2559
Set-Cookie verifysession=h0052f5e46e7ca7d3f1bbb1cfa3bbb2a9ea86bded65adbf78e575c50e0d361145fcd232015653790eb
4;PATH=/; DOMAIN=qq.com;
Connection close
Content-Type image/jpeg
以上就是HTTP協(xié)議中的header內(nèi)容,請注意其中Set-Cookie的部分,其實這就是驗證碼“zqcu”字符串經(jīng)過加密后的密文。當(dāng)我們提交驗證碼時,正是將我們輸入的“zqcu”和密文同時提交,然后服務(wù)器A/B再通過服務(wù)器C的驗證接口判斷是否正確。這時候,一切浮云都是神馬了,原來騰訊驗證碼居然采用cookie方式。
那么,接下來高手通常會有兩種做法:
第一,通過模式識別辨認(rèn)出圖片所承載的驗證碼字符串,然后提交的時候直接發(fā)送識別的字符串。
第二,通過解密破譯出verifysession的明文。
很抱歉,我不是高手,以上兩種方法我都無能為力。所以,以下的內(nèi)容高手可繞過,到此結(jié)束了。
利用cookie欺騙繞過驗證碼
到這里,有人可能會罵,你這不是標(biāo)題黨么,什么cookie欺騙,什么漏洞,啥都沒。
好吧,接下來講講我的方法,就是利用cookie欺騙繞過驗證碼。
剛才我們訪問http://captcha.qq.com/getimage的時候已經(jīng)獲得一個驗證碼圖片,利用人眼識別技術(shù),知道它的驗證碼字符串為“zqcu”,并且截獲了其密文verifysession。
于是,我便開始嘗試每次提交都提交“zqcu”并且將cookie設(shè)為已知的verifysession。嘿嘿,我可以把入哥的介紹信多復(fù)印好幾份嘛。
如果真的那么簡單的話,騰訊也太二了。
第一次提交的時候,我十分驚喜,居然成功欺騙了服務(wù)器。
可是當(dāng)我再次使用這一組驗證碼及其密文,卻返回驗證碼錯誤的提示。我的猜想是,某個驗證碼用過之后,不能馬上再次使用,也許要過1分鐘或者1個小時之后才能使用,這是一個我稱之為過期機(jī)制的坎。也就是說,當(dāng)洪哥問入哥,這是你寫的介紹信么,入哥看了看,說是,然后給這封信添了一個標(biāo)志。
發(fā)現(xiàn)了這個坎,那么悲劇了。
現(xiàn)在我能做的事只有:提前獲得幾組甚至幾百幾千組驗證碼(需要人眼識別,人手輸入)及其密文。而且所獲得的驗證碼還不能閑置太長時間,入哥可能將同一份介紹信發(fā)給兩個人,當(dāng)別人先用了它,那么我要過一段時間才能再用。
注意上面提到了提前兩字,但是同樣需要人工識別并輸入,這到底有什么用呢。
在做什么事情的時候我們是帶著這樣一個目的的:提前輸入好幾組驗證碼,在特定時間連續(xù)并快速的提交。
好吧,我不多說了,看看標(biāo)題,我們開始暴力秒殺吧。
拍拍秒殺流程如下:商品有一個秒殺時間,當(dāng)?shù)搅诉@個時間,成千上萬的玩家開始填寫驗證碼并點擊提交,先到先得。
于是,有了cookie欺騙,我可以提前輸入驗證碼,當(dāng)時間一到,只要提交即可。
今天就講到這里吧,大家可以暢所欲言,提出疑問或者指出錯誤的地方。最后附上我做的拍拍秒殺助手,為了圖個方便用的c#編程,所以需要.net farmework環(huán)境,有興趣的同學(xué)可以將其改寫成c++。
PS:修改本地cookie非常簡單,但是,騰訊這里的Set-Cookie并不是保存到本地的cookie,它是一個標(biāo)志為httponly的cookie,只存儲在標(biāo)頭。
我提供一個函數(shù):InternetSetCookieEx(),其msdn如下:
http://msdn.microsoft.com/zh-cn/library/aa385108.aspx
附下載鏈接:http://d.namipan.com/d/efb4375ee41afae5932279334313c00442c995d2ee600800
【編輯推薦】