感谢某电商平台安全工程师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(); } ?>
效果以下:
若有不正确,欢迎你们指正。谢谢