Web安全開發之驗證碼設計不當引發的撞庫問題


  感謝某電商平台安全工程師feiyu跟我一起討論這個漏洞的修復。以往在安全測試的過程中后台經常存在驗證碼不失效果造成的撞庫問題,甚至在一些銀行或者電商的登錄與查存頁面同樣存在這個問題,一旦造成撞庫無論對用戶賬號的安全性還是網站的負載都是巨大的挑戰。其實造成問題的原因並不復雜,主要是研發在開發過程中缺少對安全的認知,造成的疏忽。 

今天心血來潮自己寫了個驗證碼來模擬下出現的問題,首先我們從前端頁面開始分析:

<!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來生成。

  我們節選captacha.php的關鍵部分來分析:

$_SESSION['authcode']=$captch_code;

  我們把生成的captch_code以文字形式存在一個臨時的session中。

  並在前端表單提交后,在form.php中驗證POST的驗證碼是否與Session中的值一致。

<?php
   if(isset($_REQUEST['autocode'])){
      session_start();
      if(strtolower($_POST['autocode']) == $_SESSION['authcode']){
       echo 'right';
      }else{
      echo'wrong';
      }

   exit();
   }

?>

  萬事俱備,似乎一切都很完美,一個驗證碼(機器自動化識別不在本次討論范圍內,TT)。

  

  輸入正確返回right:

  

  輸入錯誤范圍wrong:

  

  好了,漏洞來了。我們放到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();
   }

?>                        

  效果如下:

  

  如有不正確,歡迎大家指正。謝謝

 

 

 

 

 

 

 

  

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM