Insecure CAPTCHA(不安全的验证码)

时间:2024-04-09 17:23:03

Insecure CAPTCHA

前言

这里我觉得主要是要理解谷歌验证码这个流程,因为这是一个逻辑漏洞,要是换成别的验证方式,这次的漏洞也就不一定有效了,主要还是理解这个验证码的一个流程吧
Insecure CAPTCHA(不安全的验证码)
我在别人的博客看到了这张图,我也是通过这张图来理解这个验证流程的。下面简单说下我的理解

首先用户访问网页,触发页面的验证码的js模块,向谷歌服务器发起请求,谷歌服务器将验证码发给用户。用户输入验证码发送数据回去,这里发给的是访问网站的服务器,网站的服务器拿到验证码后,再去访问谷歌的服务器,谷歌的服务器会判断验证码是否正确,再将结果返回给网站服务器。

这里服务器会用到recaptcha_check_answer函数

参数privkeyprivatekeyprivkey是服务器申请的private key ,remoteip是用户的ip,challengerecaptchachallengefieldchallenge 是recaptcha_challenge_field 字段的值,来自前端页面 ,response是 recaptcha_response_field 字段的值。函数返回ReCaptchaResponse class的实例,ReCaptchaResponse 类有2个属性 :

$is_valid是布尔型的,表示校验是否有效,

$error是返回的错误代码。

然后这里再说下dvwa这里的配置,点进dvwa的靶场,可以看到需要配置
Insecure CAPTCHA(不安全的验证码)
就像我们上面说到的recaptcha_check_answer函数需要我们提供privkey

点击下面的链接,就会跳转到谷歌的登录页面,这里我就不去登录申请key了,我自己用docker搭的靶场设的是个内网环境,不想再去配了,最主要我看别人的博客说申请好像也存在问题,最最主要它不影响我们的去实验,但不能体验到它正常操作的一个流程,我感觉对挖掘它的漏洞是增加了难度的
Insecure CAPTCHA(不安全的验证码)
这里我们登录dvwa的后台,按照它提示找到相应的路径下的文件,然后找到如下图所示的两个key,随意的输入些值保存
Insecure CAPTCHA(不安全的验证码)
这时候我们再去访问网页,可以看到验证码虽然没法显示(毕竟我们是瞎填的而且也访问不了外网…),但是能正常使用了
Insecure CAPTCHA(不安全的验证码)

练习

Low

这里我们还是直接来看代码
Insecure CAPTCHA(不安全的验证码)
Insecure CAPTCHA(不安全的验证码)
我也不怎么会php,但它主要有两个if函数,将整体分成了两部分,大概就是第一部分检查验证码返回表单,第二部分接受用户的表单再来进行修改

这里很明显我们直接跳过一个if判断就能绕过验证码了
Insecure CAPTCHA(不安全的验证码)
可以抓包看到提交的数据里面有一个step数据,这里我们直接将其改为2,就能绕过验证阶段了
Insecure CAPTCHA(不安全的验证码)
可以看到密码被成功修改了
Insecure CAPTCHA(不安全的验证码)
当我不改数据直接访问的时候就会如上图所示,因为这里访问不了谷歌的服务器所以会报上面的错误。

这里没有一个完整体验还是感觉欠缺了点什么,不能抓包分析一下正常的一个流程

这里在实际应用中还可以集合CSRF来进行,特别是这种修改密码的不说要输入以前的密码,至少得要cookie吧,所以可以结合CSRF来进行攻击。我看了下别人的博客,这里用csrf进行攻击时会有重定向,返回密码修改成功的页面…这个让被攻击者会意识到遭到了攻击

下面是别人做的简单的csrf攻击页面,详见参考1

<input type=“hidden” name=“step” value=“2”

Medium

这里midium级别还是进行了分步的判断了,但可以看到下图,它多了一个判断
Insecure CAPTCHA(不安全的验证码)
这其实就没什么意思了,和Low级别大同小异了,只是多改一个值
Insecure CAPTCHA(不安全的验证码)
可以看到上图我将step改成了2,并在末尾加上了它需要的检查的值且赋值为true

然后我们就成功的修改了密码,绕过了验证码

CSRF和Low级别的利用没什么差别

High

High级别还是做了些改动,首先已经不是两个if的判断了,可以看下图
Insecure CAPTCHA(不安全的验证码)
这里的resp就是谷歌服务器返回的数据,没有课操作空间,但是它判断验证是否失败是用的

if ( $resp || ( $_POST[ 'g-recaptcha-response' ] == 'hidd3n_valu3' && $_SERVER[ 'HTTP_USER_AGENT' ] == 'reCAPTCHA' ) )

这样一句话要判断为true才会说验证失败,前面!resp为true,但它用的&&来连接…所以我们只要保证后面为false就能绕过了…搞不懂用&&是什么鬼逻辑…

这就很好搞了啊,

属性g-recaptcha-response 的值不能是hidd3n_valu3 并且请求头部的 HTTP_USER_AGENT 不能是 reCAPTCHA就会判断为false…
Insecure CAPTCHA(不安全的验证码)
如上图把USER_AGENT 改为reCAPTCHA,然后在post里添加&g-recaptcha-response=hidd3n_valu3

ok,这样就能发现成功的修改了密码

Impossible

这里没有分成两部分了,然后对谷歌服务器的返回值进行单独的校验,这样就修补了逻辑漏洞,而且还要求输入以前的密码(csrf基本over)
Insecure CAPTCHA(不安全的验证码)
当然这里还加入了Anti-CSRF token 机制防御CSRF攻击,和PDO技术防护sql注入

总结

这里的不安全验证码,我认为在现实中应该很难碰到?但是我觉得这里主要是想让我们体验什么是逻辑漏洞吧,特别是high级别中&&这些符号可能搞混而且还不会影响程序的运行,这样的逻辑漏洞可能存在的几率就会比较高。

这里把dvwa以前的十个模块的内容就搞定了,还剩3个新出的模块了,提前撒花✿✿ヽ(°▽°)ノ✿

参考

  1. 新手指南:DVWA-1.9全级别教程之Insecure CAPTCHA
  2. DVWA 黑客攻防演练(六)不安全的验证码 Insecure CAPTCHA