2010-12-05 19:36 zetsin newbyter.com 我要評論(2) 字號:T | T
一鍵收藏,隨時查看,分享好友!

有誰還記得大概幾年前突然出現了驗證碼這東西,許多網站甚至桌面應用程序都陸續實現了驗證碼技術,主要作用無非就是防止用戶利用程序進行自動提交,避免暴力破解,避免服務器遭受惡意攻擊。

AD:

首先我想討論一下驗證碼這玩意兒。

有誰還記得大概幾年前突然出現了驗證碼這東西,許多網站甚至桌面應用程序都陸續實現了驗證碼技術,主要作用無非就是防止用戶利用程序進行自動提交,避免暴力破解,避免服務器遭受惡意攻擊。

那么,驗證碼機制又該如何實現。

目前主流的實現技術主要有session和cookie兩種方式,而這兩種方式可以說技術是一樣的,區別在于將驗證碼字符串存儲在服務器還是客戶端。

前者工作流程:服務器發送驗證碼圖片到客戶端并在服務器保存驗證碼字符串到session,用戶辨認圖片并提交驗證碼字符串到服務器,服務器將用戶提交的驗證碼字符串與session中保存的字符串進行比較。

后者工作流程:服務器發送驗證碼圖片以及驗證碼字符串(可能會進行加密)到客戶端,客戶端將驗證碼字符串存儲到本地cookie,用戶辨認圖片并提交驗證碼字符串以及cookie中所存儲的字符串到服務器,服務器將用戶提交的兩個字符串(進行解密后)進行比較。

相對而言,存放在服務器的session更為安全,只不過消耗服務器內存,程序員除了使用模式識別辨認出驗證碼,沒有其他辦法。而對于使用cookie方式的驗證碼,不增加服務器內存消耗,但我們可以通過對傳輸數據進行分析輕易破解驗證碼。

這種傳統的驗證碼方式,其框架非常簡單。

  

看上圖,我們從大的框架分析問題,這里面說的“提供驗證碼服務”已經不區分session還是cookie了。

接下來從圖中我們可以看出什么了呢,對于有多臺服務器的大企業是十分平常的,那么,假如每一個服務程序都使用驗證碼技術,那么每一個服務程序就需要獨自實現驗證碼服務,這樣做不是不可以,只是增加了程序員的負擔而已。

好吧,現在我們正式進入今天的主題,也是接著上面的話題,騰訊的驗證碼框架有何不同。

我們隨便進入一個需要驗證碼的騰訊頁面:

http://web2.qq.com

登錄webQQ的時候需要輸入驗證碼,我們通過抓包或者看源代碼,可以知道點擊“換一張”時其實是訪問了這個URL:http://captcha.qq.com/getimage,來自tencent http server。多嘗試幾個需要驗證碼的頁面,發現其驗證碼依然是是通過訪問http://captcha.qq.com/getimage獲得。當然也有例外的情況,不過總體看來騰訊的驗證碼機制的框架與上面討論的又有些不一樣。

看到了嗎,在這種框架體系下,驗證碼成了一個單獨的組件,不同服務器不同應用程序都可使用它提供的驗證碼服務接口。

具體流程

好吧,我們繼續進一步研究騰訊驗證碼的具體流程。

訪問http://captcha.qq.com/getimage,看到“zqcu”驗證碼圖片,抓包,查看響應標頭:

鍵 值

響應 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協議中的header內容,請注意其中Set-Cookie的部分,其實這就是驗證碼“zqcu”字符串經過加密后的密文。當我們提交驗證碼時,正是將我們輸入的“zqcu”和密文同時提交,然后服務器A/B再通過服務器C的驗證接口判斷是否正確。這時候,一切浮云都是神馬了,原來騰訊驗證碼居然采用cookie方式。

那么,接下來高手通常會有兩種做法:

第一,通過模式識別辨認出圖片所承載的驗證碼字符串,然后提交的時候直接發送識別的字符串。

第二,通過解密破譯出verifysession的明文。

很抱歉,我不是高手,以上兩種方法我都無能為力。所以,以下的內容高手可繞過,到此結束了。

利用cookie欺騙繞過驗證碼

到這里,有人可能會罵,你這不是標題黨么,什么cookie欺騙,什么漏洞,啥都沒。

好吧,接下來講講我的方法,就是利用cookie欺騙繞過驗證碼。

剛才我們訪問http://captcha.qq.com/getimage的時候已經獲得一個驗證碼圖片,利用人眼識別技術,知道它的驗證碼字符串為“zqcu”,并且截獲了其密文verifysession。

于是,我便開始嘗試每次提交都提交“zqcu”并且將cookie設為已知的verifysession。嘿嘿,我可以把入哥的介紹信多復印好幾份嘛。

如果真的那么簡單的話,騰訊也太二了。

第一次提交的時候,我十分驚喜,居然成功欺騙了服務器。

可是當我再次使用這一組驗證碼及其密文,卻返回驗證碼錯誤的提示。我的猜想是,某個驗證碼用過之后,不能馬上再次使用,也許要過1分鐘或者1個小時之后才能使用,這是一個我稱之為過期機制的坎。也就是說,當洪哥問入哥,這是你寫的介紹信么,入哥看了看,說是,然后給這封信添了一個標志。

發現了這個坎,那么悲劇了。

現在我能做的事只有:提前獲得幾組甚至幾百幾千組驗證碼(需要人眼識別,人手輸入)及其密文。而且所獲得的驗證碼還不能閑置太長時間,入哥可能將同一份介紹信發給兩個人,當別人先用了它,那么我要過一段時間才能再用。

注意上面提到了提前兩字,但是同樣需要人工識別并輸入,這到底有什么用呢。

在做什么事情的時候我們是帶著這樣一個目的的:提前輸入好幾組驗證碼,在特定時間連續并快速的提交。

好吧,我不多說了,看看標題,我們開始暴力秒殺吧。

拍拍秒殺流程如下:商品有一個秒殺時間,當到了這個時間,成千上萬的玩家開始填寫驗證碼并點擊提交,先到先得。

于是,有了cookie欺騙,我可以提前輸入驗證碼,當時間一到,只要提交即可。

今天就講到這里吧,大家可以暢所欲言,提出疑問或者指出錯誤的地方。最后附上我做的拍拍秒殺助手,為了圖個方便用的c#編程,所以需要.net farmework環境,有興趣的同學可以將其改寫成c++。

PS:修改本地cookie非常簡單,但是,騰訊這里的Set-Cookie并不是保存到本地的cookie,它是一個標志為httponly的cookie,只存儲在標頭。

我提供一個函數:InternetSetCookieEx(),其msdn如下:

http://msdn.microsoft.com/zh-cn/library/aa385108.aspx

附下載鏈接:http://d.namipan.com/d/efb4375ee41afae5932279334313c00442c995d2ee600800