昨天登录后台发现wordpress2.84版本提示更新,这距离2.83版本的发布才几天而已的时间。是什么原因导致wp更新如此迅速了。到国外的网站和wp官方搜索了资料一看,原来是密码重置的漏洞。如果你的wp版本是2.83或低于2.83的,你就要注意了。千万别得罪人啊,特别是玩wp的人,小心他把你的邮箱给发爆了(开个玩笑,呵呵!)。
那么,这个漏洞的所在是?你不妨自己小测一下。(以下所有图片都是我个人测试所截的图,仅供大家参考,我的密码已经更改,漏洞也已经修复,请勿试图攻击我哦!)。
1.测试漏洞步骤:
访问:http://你的域名/wp-login.php?action=rp&key[]=(通过该链接可以直接跳过邮件论证而将博客的管理员密码重置),系统提示如图:
此时你可以看到你的邮箱中有新邮件了,内容如下:
至此,你的密码重置成功。恭喜你,你发现wordpress的漏洞了!!
2.漏洞源代码所在:
打开wp-login.php文件(wordpress的更目录),找到185行代码:如下:
1234567891011121314 |
function reset_password($key) { global $wpdb; $key = preg_replace('/[^a-z0-9]/i', '', $key); if ( empty( $key ) ) return new WP_Error('invalid_key', __('Invalid key')); $user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users WHERE user_activation_key = %s", $key)); if ( empty( $user ) ) return new WP_Error('invalid_key', __('Invalid key')); //后面的代码过长,在此省略.......} |
然后在转到275行:如下
123456789 |
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'login';$errors = new WP_Error(); if ( isset($_GET['key']) ) $action = 'resetpass'; // validate action so as to default to the login screenif ( !in_array($action, array('logout', 'lostpassword', 'retrievepassword', 'resetpass', 'rp', 'register', 'login')) && false === has_filter('login_form_' . $action) ) $action = 'login'; |
接下来转到369行:如下
123456789101112131415 |
break; case 'resetpass' :case 'rp' : $errors = reset_password($_GET['key']); if ( ! is_wp_error($errors) ) { wp_redirect('wp-login.php?checkemail=newpass'); exit(); } wp_redirect('wp-login.php?action=lostpassword&error=invalidkey'); exit(); break; |
3.解决的办法:
1. 立即升级到2.84版本;
2. 修改wp-login.php文件,将190行的代码,如下:
12 |
if ( empty( $key ) ) return new WP_Error('invalid_key', __('Invalid key')); |
修改为:
12 |
if ( empty( $key ) || is_array( $key ) ) return new WP_Error('invalid_key', __('Invalid key')); |