2008年11月15日 星期六

驗證碼判斷的盲點以及破解測試:以無名現有的漏洞為例

前陣子在寫程式的時候,發現了一個常被忽略的盲點。

後來想了一下有沒有類似的情況,就去無名測試了一次。

這次測試的是無名的驗證碼。


原理


一般的留言都有驗證碼,大部份是以session來做,把驗證碼的解答放在session裡

所以判斷的程式會這樣寫

[code language="php"]

if($_SESSION['captcha']==$_POST['captcha'])    //當session的資料 和 post過來的資料相同時
$verify=true;
else
$verify=false;
[/code]

這樣就會造成所謂的漏洞,因為有可能session裡沒有值,post過來也沒有值,在NULL==NULL的情況,就會成立。

所以要改成這樣

[code language="php"]

if( !empty($_SESSION['captcha'])  && $_SESSION['captcha']==$_POST['captcha']) //先判斷session是否為空值
$verify=true;
else
$verify=false;

[/code]

破解測試


我這裡是用firefox3 + firebug + web developer來進行測試,以這個來模擬程式。(不然會花太久時間)

就以很有氣質的彎彎的為例吧!

在文章的正下方有驗證碼。

由於驗證碼是儲存在session裡,所以我們要先把session給清掉。

怎麼清呢?由於session是cookie based的一套系統,清掉的方法就是把cookie裡的sessionid給刪掉。

我們用web developer

在Web developer bar -> Cookies -> View Cookie -> delete cookie



如此一來,在換一頁的時候,session就不見了。

接著,開啟firebug,把驗證碼輸入欄位(input)的name改掉。

原本叫magic,把它改成magic2好了

另外發現有個長得像session id的東西,叫magicUUID,也把它更名一下..叫magicUUID2好了。



接著隨便輸入個驗證碼,怕它javascript會檢查是否有輸入。

接著,送出留言,成功留言!

雖然無名有這項漏洞,但他們還是在Yahoo 999的保護傘之下。