目录
前言
登录验证安全
验证码复用
验证码绕过
客户端验证
验证码前端验证漏洞
短信验证码
无效验证
我们在上一篇文章中讲解了关于逻辑身份验证漏洞,今天我们接着来讲逻辑漏洞关于登录验证安全
BP实验
我们随便输入账号和密码,后台BP抓包:
这是我们刚刚抓到的数据包:
我们将其发送给Repetater模块:
重放发包,查看回显:
这里回显了你的密码错误,却没有回显你的验证码有没有错误,那是不是可能存在着验证码复用漏洞,我们再重放一次看看:
两次回显的结果一样,可以证明这里存在着验证码复用漏洞,这里的验证码并没有重复刷新,一直都是同一个:
那我们就可以去爆破了,将其发送到Intruder模块:
将爆破的密码添加payload:
然后添加字典:
爆破成功:
我们后台开启BP抓包,点击提交:
来看看我们后台抓到的数据包:
我们来仔细看看响应的部分,他回复给我们的状态响应为n, 意思就是不通过,那万一我们把他的状态响应改成y,会发生什么呢?
我们开启拦截:
然后拦截此次请求的响应:
然后点击发送:
然后我们可以看到,刚刚响应的包被我们拦截到了:
我们将其改成y,然后发送试试:
查看结果,存在验证码绕过漏洞:
(2) 点击获取验证码时,直接在返回包中返回验证码,通过抓包的来观察 reponse 包
可以看到直接在返回的数据包中泄露了验证码。
我们来看一下前端的源代码,这里运用了前端生成验证码,只要你点击他的验证码,他就通过createCode()函数生成一个验证码:
我们后台开启抓包,账号密码验证码这里随便输入,点击Login:
说明什么,说明这里很有可能是一个前端的验证。由于我们输入的验证码是错误的,所以连第一步前端校验都没有通过,客户端当然不会像服务器发包,那我们输入正确的验证码试试:
来看,由于前端验证码校验通过了,所以客户端向服务端发送了请求,我们自然而然也就抓到了数据包。
我们将其发送给重发器:
重发,回显如下:
那遇到这种情况说明什么,说明这个数据包已经通过了前端验证,没有通过前端验证,服务器是不会给你响应的。这里为了严谨,我们再来验证一下服务端有没有对这个验证码进行再一次的验证。
我们直接在验证码里加个字符,构造错误的验证码,然后查看回显,发现我们的回显结果还是一样的,而不是提示验证码错误,说明服务端没有对这个验证码进行再一次的验证。也进一步说明了这里只进行了前端验证。
那很明显,既然这里的数据包已经通过了前端的校验,并且后端也没有对这个验证码进行再一次的校验,把这里的验证码有没有已经无所谓了,我们可以在这个数据包的基础上直接进行爆破了,爆破的过程过于简单,我就不演示了。
我们再来看一下面对客户端验证漏洞情况的另外一种办法:
当我们输入验证码时,他不是会在这里弹出一个前端的js窗口吗?
那我们把这个验证码所匹配或者说所对应的js代码全部删掉试试,因为他是前端验证,而前端代码又是由我们用户可以直接进行操控的,我们当然可以删除前端代码咯,我们找到对应的代码,删掉它:
当我们再随便输入密码时他提示的就只是账号密码错误了,而不是验证码错误了:
接下来的操作也就是拿去爆破了。