1.Insecure CAPTCHA 不安全的验证码
CAPTCHA是Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自动区分计算机和人类的图灵测试)的简称,是一种区分用户是计算机和人的公共全自动程序。使用CAPTCHA可以防止攻击者暴力破解密码、刷单等,保证用户是人类(无法快速反复发送请求)。攻击者绕过CAPTCHA验证后,可以使用恶意脚本操控计算机反复发送请求或者在异地实现绕过验证的CSRF攻击。
CAPTCHA漏洞利用的是验证码验证机制的逻辑漏洞,CAPTCHA验证流程如下图
2.实验演示
在DVWA页面左侧选择Insecure CAPTCHA。
目标是绕过验证机制修改当前用户的密码。
做这个实验需要在https://www.google.com/recaptcha注册key,注册时reCAPTCHA type选择v2 Invisible,Domains填自己的域名,本地实验就填127.0.0.1
以下是注册成功的。
$_DVWA[ ‘recaptcha_public_key’ ] = ‘6Lc5ix8mAAAAAKSkac5813ecMsE2MxHkg6TO-BC5’;
$_DVWA[ ‘recaptcha_private_key’ ] = ‘6Lc5ix8mAAAAADV8ktTSHSe3nBbOjWqz3AFdoXjo’;
修改config.inc.php文件相应内容为以上内容,然后重启服务。
使用http://127.0.0.1/DVWA/vulnerabilities/captcha/ 访问,显示如下图。
即可开始实验了。
若配置未成功会显示ERROR for site owner: Invalid key type。
2.1.low
DVWA Security设置为low
代码审计
看源码可以看到,开发人员将该密码修改操作分成了两步,第一步通过验证码验证是否机器人且验证两次密码输入是否一样,验证通过后,服务器返回表单,第二步,要求用户确认修改密码,客户端提交post请求,服务器完成更改密码的操作。但是,这其中存在明显的逻辑漏洞,服务器仅仅通过检查Change、step 参数来判断用户是否已经输入了正确的验证码。
启动burp抓包,修改密码为123,点击change
burp抓到的包,step=1
放包,跳转到第二步,用户确认修改密码,点击change。
burp抓到的包,step=2
放包,密码修改成功。
攻击过程,把第二次抓到的包发送到repeater,把password_new,password_conf修改为攻击者想设置的密码12345,然后send,修改密码成功,绕过了验证码。
2.2.medium
DVWA Security设置为Medium,开发人员在session设置状态变量,跟踪用户在提交数据之前是否成功完成了验证码。因为状态变量在客户端,它也可以被攻击者修改。
代码审计
通过源码知道,medium相比low就是在第二步多了passed_captcha验证。同low攻击一样,把第二次抓到的包发送到repeater,把password_new,password_conf修改为攻击者想设置的密码12345,再设置passed_captcha=true然后send,修改密码成功,绕过了验证码。
2.3.high
DVWA Security设置为High,开发把修改密码的两步合并为一步了。
代码审计
通过源码发现,在验证码验证通过与否时,如果g-recaptcha-response’,HTTP_USER_AGENT验证通过,也相当于验证码通过。
$_POST[ ‘g-recaptcha-response’ ] == ‘hidd3n_valu3’
$_SERVER[ ‘HTTP_USER_AGENT’ ] == ‘reCAPTCHA’
$resp参数我们无法控制,我们可以修改参数recaptcha_response_field、User-Agent。
启动burp抓包。
发送到repeater,
在host下添加User_Agent: reCAPTCHA ,修改g-recaptcha-response为hidd3n_valu3
放包,修改成功。
2.4.impossible
DVWA Security设置为Impossible Level。加入了Check Anti-CSRF token 防御CSRF攻击,使用了PDO技术防御SQL注入,还必须输入旧密码才能修改密码,暂时无法破解。