CVE漏洞中文网

0DayBank一个专门收集整理全球互联网漏洞的公开发布网站
  1. 首页
  2. 漏洞列表
  3. 正文

passwords must match

2018年11月20日 504点热度 0人点赞 0条评论

passwords must match
FB招聘站
分类阅读
专栏
公开课
FIT 2019
企业服务
用户服务
搜索
投稿
登录
注册
新手指南:DVWA-1.9全级别教程之Insecure CAPTCHA lonehand2016-11-23金币奖励+10共689929人围观 ,发现 17 个不明物体 WEB安全新手科普
*本文原创作者:lonehand,转载须注明来自FreeBuf.COM

目前,最新的DVWA已经更新到1.9版本(http://www.dvwa.co.uk/),而网上的教程大多停留在旧版本,且没有针对DVWA high级别的教程,因此萌发了一个撰写新手教程的想法,错误的地方还请大家指正。

DVWA简介

DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。

DVWA共有十个模块,分别是

Brute Force(暴力(破解))

Command Injection(命令行注入)

CSRF(跨站请求伪造)

File Inclusion(文件包含)

File Upload(文件上传)

Insecure CAPTCHA (不安全的验证码)

SQL Injection(SQL注入)

SQL Injection(Blind)(SQL盲注)

XSS(Reflected)(反射型跨站脚本)

XSS(Stored)(存储型跨站脚本)

需要注意的是,DVWA 1.9的代码分为四种安全级别:Low,Medium,High,Impossible。初学者可以通过比较四种级别的代码,接触到一些PHP代码审计的内容。

1.png

DVWA的搭建

Freebuf上的这篇文章《新手指南:手把手教你如何搭建自己的渗透测试环境》(http://www.freebuf.com/sectool/102661.html)已经写得非常好了,在这里就不赘述了。

之前模块的相关内容

Brute Force

Command Injection

CSRF

File Inclusion

File Upload

本文介绍Insecure CAPTCHA模块的相关内容,后续教程会在之后的文章中给出。

Insecure CAPTCHA

Insecure CAPTCHA,意思是不安全的验证码,CAPTCHA是Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自动区分计算机和人类的图灵测试)的简称。但个人觉得,这一模块的内容叫做不安全的验证流程更妥当些,因为这块主要是验证流程出现了逻辑漏洞,谷歌的验证码表示不背这个锅。

1.png

reCAPTCHA验证流程

这一模块的验证码使用的是Google提供reCAPTCHA服务,下图是验证的具体流程。

1.png

服务器通过调用recaptcha_check_answer函数检查用户输入的正确性。

recaptcha_check_answer($privkey,$remoteip, $challenge,$response)

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

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

$error是返回的错误代码。

(ps:有人也许会问,那这个模块的实验是不是需要科学上网呢?答案是不用,因为我们可以绕过验证码)

下面对四种级别的代码进行分析。

Low

服务器端核心代码:

is_valid ) {
// What happens when the CAPTCHA was entered incorrectly
$html .= "


The CAPTCHA was incorrect. Please try again.

";
$hide_form = false;
return;
}
else {
// CAPTCHA was correct. Do both new passwords match?
if( $pass_new == $pass_conf ) {
// Show next stage for the user
echo "


You passed the CAPTCHA! Click the button to confirm your changes.




";
}
else {
// Both new passwords do not match.
$html .= "

Both passwords must match.

";
$hide_form = false;
}
}
}

if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {
// Hide the CAPTCHA form
$hide_form = true;

// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ];

// Check to see if both password match
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = mysql_real_escape_string( $pass_new );
$pass_new = md5( $pass_new );

// Update database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysql_query( $insert ) or die( '

' . mysql_error() . '

' );

// Feedback for the end user
echo "

Password Changed.

";
}
else {
// Issue with the passwords matching
echo "

Passwords did not match.

";
$hide_form = false;
}

mysql_close();
}

?>
可以看到,服务器将改密操作分成了两步,第一步检查用户输入的验证码,验证通过后,服务器返回表单,第二步客户端提交post请求,服务器完成更改密码的操作。但是,这其中存在明显的逻辑漏洞,服务器仅仅通过检查Change、step 参数来判断用户是否已经输入了正确的验证码。

漏洞利用

1.通过构造参数绕过验证过程的第一步

首先输入密码,点击Change按钮,抓包:

1.png

(ps:因为没有翻墙,所以没能成功显示验证码,发送的请求包中也就没有recaptcha_challenge_field、recaptcha_response_field两个参数)

更改step参数绕过验证码:

1.png

修改密码成功:

1.png

2.由于没有任何的防CSRF机制,我们可以轻易地构造攻击页面,页面代码如下(详见CSRF模块的教程)。

当受害者访问这个页面时,攻击脚本会伪造改密请求发送给服务器。

1.png

美中不足的是,受害者会看到更改密码成功的界面(这是因为修改密码成功后,服务器会返回302,实现自动跳转),从而意识到自己遭到了攻击。

1.png

Medium

服务器端核心代码:

is_valid ) {
// What happens when the CAPTCHA was entered incorrectly
$html .= "


The CAPTCHA was incorrect. Please try again.

";
$hide_form = false;
return;
}
else {
// CAPTCHA was correct. Do both new passwords match?
if( $pass_new == $pass_conf ) {
// Show next stage for the user
echo "


You passed the CAPTCHA! Click the button to confirm your changes.





";
}
else {
// Both new passwords do not match.
$html .= "

Both passwords must match.

";
$hide_form = false;
}
}
}

if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {
// Hide the CAPTCHA form
$hide_form = true;

// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ];

// Check to see if they did stage 1
if( !$_POST[ 'passed_captcha' ] ) {
$html .= "


You have not passed the CAPTCHA.

";
$hide_form = false;
return;
}

// Check to see if both password match
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = mysql_real_escape_string( $pass_new );
$pass_new = md5( $pass_new );

// Update database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysql_query( $insert ) or die( '

' . mysql_error() . '

' );

// Feedback for the end user
echo "

Password Changed.

";
}
else {
// Issue with the passwords matching
echo "

Passwords did not match.

";
$hide_form = false;
}

mysql_close();
}

?>
可以看到,Medium级别的代码在第二步验证时,参加了对参数passed_captcha的检查,如果参数值为true,则认为用户已经通过了验证码检查,然而用户依然可以通过伪造参数绕过验证,本质上来说,这与Low级别的验证没有任何区别。

漏洞利用

1.可以通过抓包,更改step参数,增加passed_captcha参数,绕过验证码。

抓到的包:

1.png

更改之后的包:

1.png

更改密码成功:

1.png

2.依然可以实施CSRF攻击,攻击页面代码如下。

当受害者访问这个页面时,攻击脚本会伪造改密请求发送给服务器。

1.png

不过依然会跳转到更改密码成功的界面。

1.png

High

服务器端核心代码:

is_valid && ( $_POST[ 'recaptcha_response_field' ] != 'hidd3n_valu3' || $_SERVER[ 'HTTP_USER_AGENT' ] != 'reCAPTCHA' ) ) {
// What happens when the CAPTCHA was entered incorrectly
$html .= "


The CAPTCHA was incorrect. Please try again.

";
$hide_form = false;
return;
}
else {
// CAPTCHA was correct. Do both new passwords match?
if( $pass_new == $pass_conf ) {
$pass_new = mysql_real_escape_string( $pass_new );
$pass_new = md5( $pass_new );

// Update database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "' LIMIT 1;";
$result = mysql_query( $insert ) or die( '

' . mysql_error() . '

' );

// Feedback for user
echo "

Password Changed.

";
}
else {
// Ops. Password mismatch
$html .= "

Both passwords must match.

";
$hide_form = false;
}
}

mysql_close();
}
// Generate Anti-CSRF token
generateSessionToken();

?>
可以看到,服务器的验证逻辑是当$resp(这里是指谷歌返回的验证结果)是false,并且参数recaptcha_response_field不等于hidd3n_valu3(或者http包头的User-Agent参数不等于reCAPTCHA)时,就认为验证码输入错误,反之则认为已经通过了验证码的检查。

漏洞利用

搞清楚了验证逻辑,剩下就是伪造绕过了,由于$resp参数我们无法控制,所以重心放在参数recaptcha_response_field、User-Agent上。

第一步依旧是抓包:

1.png

更改参数recaptcha_response_field以及http包头的User-Agent:

1.png

密码修改成功:

1.png

Impossible

服务器端核心代码

if( isset( $_POST[ 'Change' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

// Hide the CAPTCHA form
$hide_form = true;

// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_new = stripslashes( $pass_new );
$pass_new = mysql_real_escape_string( $pass_new );
$pass_new = md5( $pass_new );

$pass_conf = $_POST[ 'password_conf' ];
$pass_conf = stripslashes( $pass_conf );
$pass_conf = mysql_real_escape_string( $pass_conf );
$pass_conf = md5( $pass_conf );

$pass_curr = $_POST[ 'password_current' ];
$pass_curr = stripslashes( $pass_curr );
$pass_curr = mysql_real_escape_string( $pass_curr );
$pass_curr = md5( $pass_curr );

// Check CAPTCHA from 3rd party
$resp = recaptcha_check_answer( $_DVWA[ 'recaptcha_private_key' ],
$_SERVER[ 'REMOTE_ADDR' ],
$_POST[ 'recaptcha_challenge_field' ],
$_POST[ 'recaptcha_response_field' ] );

// Did the CAPTCHA fail?
if( !$resp->is_valid ) {
// What happens when the CAPTCHA was entered incorrectly
echo "


The CAPTCHA was incorrect. Please try again.

";
$hide_form = false;
return;
}
else {
// Check that the current password is correct
$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
$data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );
$data->execute();

// Do both new password match and was the current password correct?
if( ( $pass_new == $pass_conf) && ( $data->rowCount() == 1 ) ) {
// Update the database
$data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );
$data->bindParam( ':password', $pass_new, PDO::PARAM_STR );
$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
$data->execute();

// Feedback for the end user - success!
echo "

Password Changed.

";
}
else {
// Feedback for the end user - failed!
echo "

Either your current password is incorrect or the new passwords did not match.
Please try again.

";
$hide_form = false;
}
}
}

// Generate Anti-CSRF token
generateSessionToken();

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

1.png

*本文原创作者:lonehand,转载须注明来自FreeBuf.COM

lonehand
lonehand
9 篇文章
等级: 4级
||
上一篇:30秒攻破任意密码保护的PC:深入了解5美元黑客神器PoisonTap下一篇:暗网有一半以上的数据都是合法的!包括7%的色情网站
这些评论亮了

ArthurKiller (7级)窃.格瓦拉驻FreeBuf办事处回复
@ lonehand 作者辛苦了,加我QQ,发大红包给你~连载那么多,不发红包我看不下去了 :wink:
)29(亮了

lonehand (4级)23333333333回复
@ 旧梦哥 凭自己本事骗的钱,为什么要还
)11(亮了

henry_forever (1级)回复
还差4个就可以召唤神龙了~
)10(亮了

ArthurKiller (7级)窃.格瓦拉驻FreeBuf办事处回复
作者连载真长,已经关注ing
)8(亮了

lonehand (4级)23333333333回复
@ ArthurKiller DVWA有十个模块,正好方便我刷等级= =,混脸熟
)8(亮了
发表评论已有 17 条评论

euphrat1ca (1级) 2016-11-23回复 1楼
感谢哟~(^U^)ノ~YO

亮了(7)

ArthurKiller (7级) 窃.格瓦拉驻FreeBuf办事处 2016-11-23回复 2楼
作者连载真长,已经关注ing

亮了(8)

lonehand (4级) 23333333333 2016-11-23回复
@ ArthurKiller DVWA有十个模块,正好方便我刷等级= =,混脸熟

亮了(8)

henry_forever (1级) 2016-11-23回复 3楼
还差4个就可以召唤神龙了~

亮了(10)

lonehand (4级) 23333333333 2016-11-23回复
@ henry_forever 写得真快吐了

亮了(8)

ArthurKiller (7级) 窃.格瓦拉驻FreeBuf办事处 2016-11-23回复
@ lonehand 作者辛苦了,加我QQ,发大红包给你~连载那么多,不发红包我看不下去了 :wink:

亮了(29)

帽儿 (1级) 2016-11-23回复 4楼
沙发沙发

亮了(7)

旧梦哥 (1级) 2016-11-23回复 5楼
老哥稳 留卡号吧 打多打少是个缘

亮了(8)

lonehand (4级) 23333333333 2016-11-23回复
@ 旧梦哥 凭自己本事骗的钱,为什么要还

亮了(11)

wangweiak (1级) 2016-11-23回复 6楼
要是有高级一点的教程就好了,说实话,这些太基础了点

亮了(6)

lonehand (4级) 23333333333 2016-11-24回复
@ wangweiak 没办法啊,DVWA本来就是针对新手的渗透环境啊

亮了(6)

Schweik7 (1级) 2017-04-16回复 7楼
特意注册账号来感谢大佬的无私分享~

亮了(0)

Naivexf (1级) 2017-05-10回复 8楼
6666 感谢老哥

亮了(0)

FrostDescent 2018-04-18回复 9楼
请问无法控制$resp参数的话,high级别的密码修改是怎么成功的呢 我试了一下并不行啊

亮了(0)

隳名城 (2级) 2018-04-22回复
@ FrostDescent 不可能的。我按照作者改的,改了就成功了

亮了(0)

star1937 (1级) 2018-05-03回复 10楼
评论一下,证明我来过

亮了(0)

xiaopo (3级) 2018-07-05回复 11楼
通过这个判断就行了,if( !$resp->is_valid ) ,high级别简直多此一举,yuange说得对啊,安全是个条件语句。

亮了(0)
昵称
请输入昵称
必须您当前尚未登录。登陆?注册邮箱
请输入邮箱地址
必须(保密)表情插图
有人回复时邮件通知我
lonehand
lonehand

23333333333

9
文章数
53
评论数
最近文章
新手指南:DVWA-1.9全级别教程(完结篇,附实例)之XSS
2016.12.25

新手指南:DVWA-1.9全级别教程之SQL Injection(Blind)
2016.12.04

新手指南:DVWA-1.9全级别教程之SQL Injection
2016.11.27

浏览更多
相关阅读
新手指南:DVWA-1.9全级别教程之SQL Injection新手指南:DVWA-1.9全级别教程之Command Injection新手指南:DVWA-1.9全级别教程之Insecure CAPTCHA新手指南:DVWA-1.9全级别教程之Brute Force新手指南:DVWA-1.9全级别教程之File Inclusion
特别推荐

关注我们 分享每日精选文章

活动预告
11月

FreeBuf精品公开课·双11学习狂欢节 | 给努力的你打打气
已结束
10月

【16课时-连载中】挖掘CVE不是梦(系列课程2)
已结束
10月

【首节课仅需1元】挖掘CVE不是梦
已结束
9月

【已结束】自炼神兵之自动化批量刷SRC
已结束
FREEBUF免责声明协议条款关于我们加入我们广告及服务寻求报道广告合作联系我们友情链接关注我们
官方微信
新浪微博腾讯微博Twitter赞助商
Copyright © 2018 WWW.FREEBUF.COM All Rights Reserved 沪ICP备13033796号
css.php 正在加载中...0daybank

标签: 暂无
最后更新:2018年11月20日

小助手

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

COPYRIGHT © 2024 www.pdr.cn CVE漏洞中文网. ALL RIGHTS RESERVED.

鲁ICP备2022031030号

联系邮箱:wpbgssyubnmsxxxkkk@proton.me