感謝某電商平臺安全工程師feiyu跟我一塊兒討論這個漏洞的修復。以往在安全測試的過程當中後臺常常存在驗證碼不失效果形成的撞庫問題,甚至在一些銀行或者電商的登陸與查存頁面一樣存在這個問題,一旦形成撞庫不管對用戶帳號的安全性仍是網站的負載都是巨大的挑戰。其實形成問題的緣由並不複雜,主要是研發在開發過程當中缺乏對安全的認知,形成的疏忽。 javascript
今天心血來潮本身寫了個驗證碼來模擬下出現的問題,首先咱們從前端頁面開始分析:php
<!DOCTYPE html> <html> <head> <meta chartset="utf-8"> </head> <body> <form method="post" action="form.php"> <p>驗證碼圖片:<img border="1" id="capthcha_img" onclick="this.src='captcha.php?r='+Math.random()" src="captcha.php?r="<?php echo rand();?> width="100" height="30" /> <a href="javascript:void(0)" onclick="document.getElementById('capthcha_img').src='captcha.php?r='+Math.random()">換一個</a></p> <p>輸入內容:<input type="text" name="autocode" value="" /></p> <p><input type="submit" value="提交" style="padding:6px 20px;"/></p> </form> </body> </html>
能夠看出驗證碼是經過captacha.php來生成。html
咱們節選captacha.php的關鍵部分來分析:前端
$_SESSION['authcode']=$captch_code;
咱們把生成的captch_code以文字形式存在一個臨時的session中。java
並在前端表單提交後,在form.php中驗證POST的驗證碼是否與Session中的值一致。安全
<?php if(isset($_REQUEST['autocode'])){ session_start(); if(strtolower($_POST['autocode']) == $_SESSION['authcode']){ echo 'right'; }else{ echo'wrong'; } exit(); } ?>
萬事俱備,彷佛一切都很完美,一個驗證碼(機器自動化識別不在本次討論範圍內,TT)。session
輸入正確返回right:dom
輸入錯誤範圍wrong:post
好了,漏洞來了。咱們放到burpsuite中愉快的玩耍一下,在提交驗證碼的過程當中抓包、截斷、重放一下數據包:測試
無限重放驗證碼它就是不失效。
怎麼修,這問題愁死我了,想了很久,終於有了點眉目。
其實很早之前咱們寫測試報告都說應該讓存有驗證碼Session在合適的時間失效,問題是如何實現。考慮了一下,能夠經過如下方法處理:
<?php if(isset($_REQUEST['autocode'])){ session_start(); if($_SESSION['authcode'] =='NULL'){ \\經過驗證碼是否爲空檢測驗證碼是否被提交過 echo'Invalid expired'; }elseif(strtolower($_POST['autocode']) == $_SESSION['authcode']){ echo 'right'; }else{ echo'wrong'; } $_SESSION['authcode']='NULL'; \\發起一次form提交後把session值置空 exit(); } ?>
效果以下:
若有不正確,歡迎你們指正。謝謝