Insecure CAPTCHA(不安全的验证码)主要是绕过验证码的安全验证,一般都有逻辑漏洞。

Low

if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {

符合POST请求里带Change、step是2的条件,就可以直接跳过第一步的验证码。

通过Burp代理,修改step=2,就可以绕过第一步,从而再利用CSRF漏洞成功修改密码。

DVWA-2.0 - Insecure CAPTCHA(不安全的验证码)_sed

Medium

// Check to see if they did stage 1
if( !$_POST[ 'passed_captcha' ] ) {
$html .= "<pre><br />You have not passed the CAPTCHA.</pre>";
$hide_form = false;
return;
}

多加了一个​​passed_captcha​​​验证是否为真,通过修改POST,依然可以绕过。
payload:

step=2&password_new=123&password_conf=123&Change=Change&passed_captcha=1

High

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

满足一下任一条件就可以去修改密码:

1、验证码为真

2、​​g-recaptcha-response​​​为​​hidd3n_valu3​​​并且​​HTTP_USER_AGENT​​​为​​reCAPTCHA​​。

很明显,第二条可以通过Burp来绕过验证码。

DVWA-2.0 - Insecure CAPTCHA(不安全的验证码)_sed_02

Impossible

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