in JavaScript, Node.js, PHP, 校園鎖事

有趣驗證碼的分析

前言

之前在大學的時候,無意間發現學校的網站後台登入畫面,有驗證碼,當初沒有多想,就是跟一般的驗證碼相同,後來點開驗證碼的圖片連結之後,發現意外的有趣XD…

分析步驟

首先,我們先要拿到相關的連結,就以下面圖中的連結來說好了。

我們會看到登入那邊有一個小驗證碼,對驗證碼圖片開一個新分頁的連結,接著會到下圖所示。

接著,可以看到是一個叫做『authimg.php』的PHP程式在負責產生驗證碼,後面接的參數Code就是負責產生驗證碼裡面的數字。

乍看之下,並沒有什麼特別的,看起來就是一個很正常的亂數驗證碼,不過事實並非這樣。

刪減亂數字串

我試著從字串最後面開始刪減亂數字串之後,我們可以發現到,驗證碼裡面數字並不會跟著變動!不過背景跟數字擺放角度會變,當刪減到剩下長度為8以下的字串時候,可以發現到數字會減少,到長度剛好為8時,每兩個字元的字串正好是對應到一個數字,所以驗證碼可以得出前8個字元分別對應到4個驗證碼裡的數字。

得到確切驗證碼方法

知道是前8個字元對應4個驗證碼的數字之後,可以知道每2個字元對應到1個驗證碼中的數字,以上面連結中為例。驗證碼中數字為『9496』


QK34YS34241124MOQKICA0MOMOEG34

取前8個字元,則變成


QK34YS34

那剩下『QK』的時候,可能會以為數字是:9,但是顯示出來卻是:4

而字串『34』得出來卻是:9

後面的『YS』與『34』也是如此。

所以我們可以得到驗證碼設計的演算法步驟:

  1. 取Code參數值字串中前8個字元
  2. 前4個字串與後4個字串先分成兩組
  3. 二組字串內部分別兩兩一組之後互相對調兩者再合併
  4. 得到我們要的驗證碼

以『QK34YS34』為例。照步驟則拆成兩組,分別為:『QK34』與『YS34』,接著再相互對調,變成:『34QK』與『34YS』最後的字串為:


34QK34YS

建立數字對應表格

有了得到確切驗證碼的字串之後,從上面得到:『34QK34YS』對應到的是『9496』。不過,這樣還是沒有得到全部的字串對應數字的驗證碼,需要找出0~9所有的對應表。所以我們多重新整理幾次連結之後,擷取出有包含0~9所有字串可能。

接著建立對應表格如下

字串字串對應的數字
A00
241
IC2
EG3
QK4
MO5
YS6
UW7
B08
349

驗證方法

為了要驗證方法是否正確,我假設了一個驗證碼答案的數字為『1234』

則對應字串為:『24ICEGQK』,再反推先前推導出的驗證方法得到『IC24QKEG』

再把上面講到的方法反推,所得到的字串放到連結,去請求驗證碼圖片並得到的結果如下

所以,此取得驗證碼方法完成。

後記

驗證碼還是不要這麼容易被識別出比較好,不然就會造成這樣的結果。

我計畫做出可以偵測在網頁裡面,有沒有這個驗證碼連結。分成JavaScript與PHP版本。做好在更新文章內容吧XD

  • Stanley Chen

    我剛也在分析我們學校的登入驗證畫面
    也發現一樣有趣的事情
    把找到code貼上來google
    就看到你的文章了XDDDD

    • 李昀陞

      黑X馬的網頁都有類似的問題XD蠻多學校都用他們當作自己學校的首頁