前言
之前在大學的時候,無意間發現學校的網站後台登入畫面,有驗證碼,當初沒有多想,就是跟一般的驗證碼相同,後來點開驗證碼的圖片連結之後,發現意外的有趣XD…
分析步驟
首先,我們先要拿到相關的連結,就以下面圖中的連結來說好了。
我們會看到登入那邊有一個小驗證碼,對驗證碼圖片開一個新分頁的連結,接著會到下圖所示。
接著,可以看到是一個叫做『authimg.php』的PHP程式在負責產生驗證碼,後面接的參數Code就是負責產生驗證碼裡面的數字。
乍看之下,並沒有什麼特別的,看起來就是一個很正常的亂數驗證碼,不過事實並非這樣。
刪減亂數字串
我試著從字串最後面開始刪減亂數字串之後,我們可以發現到,驗證碼裡面數字並不會跟著變動!不過背景跟數字擺放角度會變,當刪減到剩下長度為8以下的字串時候,可以發現到數字會減少,到長度剛好為8時,每兩個字元的字串正好是對應到一個數字,所以驗證碼可以得出前8個字元分別對應到4個驗證碼裡的數字。
得到確切驗證碼方法
知道是前8個字元對應4個驗證碼的數字之後,可以知道每2個字元對應到1個驗證碼中的數字,以上面連結中為例。驗證碼中數字為『9496』
QK34YS34241124MOQKICA0MOMOEG34
取前8個字元,則變成
QK34YS34
那剩下『QK』的時候,可能會以為數字是:9,但是顯示出來卻是:4
而字串『34』得出來卻是:9
後面的『YS』與『34』也是如此。
所以我們可以得到驗證碼設計的演算法步驟:
- 取Code參數值字串中前8個字元
- 前4個字串與後4個字串先分成兩組
- 二組字串內部分別兩兩一組之後互相對調兩者再合併
- 得到我們要的驗證碼
以『QK34YS34』為例。照步驟則拆成兩組,分別為:『QK34』與『YS34』,接著再相互對調,變成:『34QK』與『34YS』最後的字串為:
34QK34YS
建立數字對應表格
有了得到確切驗證碼的字串之後,從上面得到:『34QK34YS』對應到的是『9496』。不過,這樣還是沒有得到全部的字串對應數字的驗證碼,需要找出0~9所有的對應表。所以我們多重新整理幾次連結之後,擷取出有包含0~9所有字串可能。
接著建立對應表格如下
字串 | 字串對應的數字 |
---|---|
A0 | 0 |
24 | 1 |
IC | 2 |
EG | 3 |
QK | 4 |
MO | 5 |
YS | 6 |
UW | 7 |
B0 | 8 |
34 | 9 |
驗證方法
為了要驗證方法是否正確,我假設了一個驗證碼答案的數字為『1234』
則對應字串為:『24ICEGQK』,再反推先前推導出的驗證方法得到『IC24QKEG』
再把上面講到的方法反推,所得到的字串放到連結,去請求驗證碼圖片並得到的結果如下
所以,此取得驗證碼方法完成。
後記
驗證碼還是不要這麼容易被識別出比較好,不然就會造成這樣的結果。
我計畫做出可以偵測在網頁裡面,有沒有這個驗證碼連結。分成JavaScript與PHP版本。做好在更新文章內容吧XD