渗透测试基础-验证码绕过和密码找回漏洞
只为对所学知识做一个简单的梳理,如果有表达存在问题的地方,麻烦帮忙指认出来。我们一起为了遇见更好的自己而努力💪!
验证码简介
既然说验证码绕过,那我们就来在简单了解一下什么是验证码?验证码有什么作用?
验证码(captcha)
completely automated public turing test to tell computers and humans apart
(全自动区分计算机和人类的图灵测试)
其用处就是:用于区分用户是计算机还是人的公共全自动程序
在很多情况下,机器在某方面是远远强于人类的,比如在网页留言的这样一个场景,如果人工输入和点击的方式来进行刷屏,5秒一条留言差不多了吧,快一点可能3秒一个。如果用机器来操作,1秒它能几十条都发好了,这样就可能会照成留言板块的异常,让别人不能正常使用。如果在以上场景,加入一个在留言时需要验证码的机制,这样人工来留言,基本所需时间还是差不多,可机器在不做其他方法绕过的情况下,可能就没办法像刚刚那样持续刷屏。
这里在介绍一下常见的验证码绕过方式
验证码可重复使用
2.验证码在客户端进行
3.验证码可识别
4.空验证码绕过
5.是否校验客户端可控
6. 错误超过一定次数才启用验证
7.验证码数量有限
8.验证码可预测
来实际看看各种案例
验证码可重复使用
这种情况较为常见,可以看看下面的网页
这里是一个靶场的后台,我们能看到这个地方是有验证码的防护机制,看看这个验证码重复使用是怎样的一个过程。
输入弱口令测试,账号:admin
密码:123456
验证码:1740
用Burp
抓住登录的数据包,放入 Repeater
模块,多次点发送数据包Go
,发现返回的数据包里面一直显示的是账号和密码不对,并没有说我验证码有问题, 那这里就基本确定是存在验证码重复利用的漏洞情况。
既然这里没有验证码的限制,直接数据包放入Intruder
模块,对密码进行爆破尝试
因为这里没有验证码的保护,我们很快就找到对应的密码。
验证码在客户端进行
验证码设置了但是并没有校验,乱输入验证码也能够成功的登录,这个就有点当摆设的意思了。
验证码可识别
这个就需要工具的帮助了,让工具来识别验证码的数字,或者其他类型的验证码,这里介绍一款验证码识别工具:PKAV-HTTP-Fuzzer
,网上很多使用教程和安装包。
既然是验证码可识别,那这里的防护方法可采用加强验证码的复杂度来抵挡,方法有:图片添加混淆线段
;图片内容辨别(可以是形状,物体,或生活常见物
);简单的数学题目
;滑块图形旋转对准阴影
等等方式
空验证码可绕过
还是已上面这个图来说,空验证码可绕过的情况就是:图片那里明明传了验证码字段和参数&ucode=8103
如果将这个数据删除了,可能后端就不对其做验证。他这里很可能是后端写了个 if
函数,当验证码存在时,或者不存在时所执行的事情,这里就属于逻辑漏洞了。
是否校验客户端可控制
在是传参里面可写入验证码字段,当在验证码里输入什么,验证码就是什么,如果验证码写1234
,那么这个验证码就不会改变,一直是1234
,这样就可以算做是没有验证码了。
错误一定次数才开启
既然是错误一定次数才开启,那它肯定是基于一定的数据来确定你已经尝试了多次了。这里 一种是基于Session
,一种是基于 IP
Session
是在Cookie
里面的,只要一直替换Cookie
的值就可以做到第一种的验证码绕过,而不提示需要输入验证码。
第二种是看你的 IP
号,一般是由X_FORWARDED_FOR
来获取我们的 IP
,当多次是这个 IP
时,就会要求验证码或者IP
封锁。这里只要代理轮询替换IP即可绕过。
验证码可预测
比如用时间戳来做验证码的 。时间戳在很多地方是能得到当前时间的具体数值的,比如这个网站:https://tool.lu/timestamp/
,(这个网站不但可得到当前的时间戳值,也能根据值,得到具体的时间是多少)。用时间戳作为验证码的话,我们可采用python编写相应工具,获取时间戳值,带入数据中爆破。
========================================================
密码找回漏洞
密码找回一般是用作于手机短信验证码,邮箱验证码这样,这种验证码的作用和前面的不一样,前面是为了区分是机器还是人,这个是为了确定用户身份,确定权限的。验证码发到手机或邮箱上,输入正确短信验证码就可以执行重置密码或其他操作。
这里常见的漏洞类型有:
验证码返回给客户端
2.业务流程缺陷
3.验证码无时间间隔限制
4.验证码可爆破
5.验证码在客户端生成
验证码返回给客户端
在进入密码找回页面,点击发送验证码的时候,服务器会根据数据库所储存的值,将验证码发送到对应的接收处,邮箱或者短信等。可是在发送验证码之后,会返回一个数据包,在返回的数据包里面居然会有着刚刚发送给用户的短信验证码。那这里只要知道被攻击者的手机或者邮箱号,就能做到任意密码重置。
验证码无时间限制
这个也好理解,就是验证码在接受到了之后,没有对时间和次数做出限制,与可重复利用是一个道理,正常使用的验证码应该满足两个基本条件,1.在使用过后,这条验证码将失效。
2.验证码的有效期应维持在5分钟以内。
验证码可控制
在注册用户时,抓了个数据包,看到里面有验证码的数据,将验证码的发送的对象改为其他用户,同时还能对验证码发送的内容进行编辑,这里如果冒充权威机构发送恶意短信,就会照成较为麻烦的事情发生。
========================================================
靶场演练(包含代码审计)
进入靶场,先进行一下网站目录扫描,扩大我们的攻击面
这里御剑扫描发现,网站存在一个robots.txt
的文件,其文件的主要用处就是让网络上的爬虫,不对robots.txt
里面存在的目录内容进行爬取,但是这个文件的存在并没有直接的限制能力,所有定性为爬虫的君子协议。
发现有一个登陆点。
测试发现这里的验证码是可重复利用的漏洞,爆破跑出了其密码为root,登录进去
这样我们就进入了后台,按说进了后台就可以找文件上传点了。但这里还有其他的做题方法。
我们先是访问一个文件名,并对其GET
传入x=m
,然后写入语句filename=‘nf.php’&content=<?php eval($_REQUEST[8]);?>
。这样,一个叫做nf.php
的木马文件就创建好了。接下来说一下原理,不过咱们这里得进入源码中,查看了发生了什么事情。
a_templetex.php
先看一下这个文件是如何编写的。
先看这样一个函数
file_put_contents($filenames,$contents)
这个函数的用法是,在某个文件里面写入某些数据,第一个参数是文件名,第二参数个是文件内容,如果第一个参数的文件没有的话,那么它会创建一个新的。
然后先看这个文件名,从下往上追溯,这里往上追是因为代码是从上往下执行的,得先知道怎么才会执行到刚刚的函数才可以。
看到在上面代码中就有变量 $filenames
,变量所等于的值是dir
,而这里的dir
是存放的文件位置,然后在后面加上一个文件名。在继续往上追。
这样就找到了源头,文件名是通过post
传进来的,说明是能控制的值
然后看下文件内容contents
的源头在哪
这里的iconv
,是为了编码用的,我们这不需要理会,在往上游查
这里也是用post
传进来的,也就是说,post
可以控制生成什么文件,可以控制文件里面写入什么内容。在看看怎么才能执行
当条件x=
满足时,下面的代码就可以执行了,那要怎么传x=m
呢 在往上看
GET
传参就能满足,所以这里就可以如上面那样做
先看一下,这个时候文件是不在的。
在这将数据包改为GET
数据包,然后在最下面加入文件名和文件内容
漏洞总结
验证码和密码找回漏洞其实在生活中挺多的,基本都是出在逻辑问题上,我们可以在测试的时候,多去关注数据包里面传输的内容,稍做改变可能就能找到一个漏洞。有关防护方法,上面都多多少少有提到,这里就不在赘述了。
《最好的防御,是明白其怎么实施的攻击》