2021-04-01,Insecure CAPTCHA

不安全的验证码(验证流程)
在验证的过程中,出现的逻辑漏洞

CAPTCHA是神魔
Completely Automated Public Turing Test to Tell Computers and Humans Apart
全自动区分计算机和人类的图灵测试

2021-04-01,Insecure CAPTCHA

low

根据源码中的注释可以很容易看懂他在干啥
1.检查用户输入的验证码,POST提交,正确之后显示表单
2.用户输入完表单之后,再用POST提交

但是看这里

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

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

它仅仅是根据Change和step参数来判断步骤

通过抓包修改step=2可以直接绕过第一个步骤

还有一个思路,就是CSRF的攻击页面

medium

在第二个步骤里,添加了一个参数passed_captcha

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

抓包之后添加passed_captcha=true,step改为2,和low一样,没啥区别

high

	// Check CAPTCHA from 3rd party
	$resp = recaptcha_check_answer(
		$_DVWA[ 'recaptcha_private_key' ],
		$_POST['g-recaptcha-response']
	);

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

新加入了一个逻辑,当$resp为false,而且
g-recaptcha-response 不是 hidd3n_valu3 或 HTTP_USER_AGENT 不是 reCAPTCHA
时,验证失败
我不知道为啥这里用了“||”
也就是说我们只要满足其中一个就可以

很明显,$resp是谷歌返回给服务器的验证结果,我们无法控制,只能操作下面的两个
抓包,更改参数recaptcha_response_field以及http包头的User-Agent和它一样即可

impossible

	if( !$resp ) {
		// What happens when the CAPTCHA was entered incorrectly
		$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
		$hide_form = false;
	}
	else {

判断验证的代码都在else里,也就是说,没有谷歌返回的验证结果,什么都白扯
终于在最后,两个步骤合成了一个步骤
此外,还加了一个password_current要求用户输入之前的密码

随便想想

也许前几天接触的漏洞比较少,一般靶场练完就完事了
但是吧,如果多想想,比如之前那一套文件上传+包含的组合,也不戳
CSRF能不能用到这里来,获取了token之后,用python发送修改密码的请求,可能impossible不太行

如何把这个利用到短信轰炸漏洞中?

在挖洞的时候怎么发现逻辑漏洞?
比如抓包时看看参数的值是0,1,2这种,再怎么去向下配合?
如果有源码泄露岂不是更好找出来。

如果high难度,medium难度看不见源码怎么办?
可以先自己试一下,打个验证码进入part2
(呜呜呜没法接收验证码)

记得有次学长讲SQL时写了个C++判断密码的程序
当时他用int,问我输入a会发生什么
我当时脑子一抽回答了个密码错误,没注意定义类型(和当时在学python也有点关系)
有时候即便你会,你也会错,
唯一能保证的是,不再犯类似的错误,Web里不会一个就记下来一个
就像是不断填充自己的“字典”一样

that’s end

上一篇:如何通过 Serverless 轻松识别验证码?


下一篇:django验证码模块使用