Исправление уязвимости при сбросе пароля
Вчера вышел WordPress 2.8.4, исправляющий уязвимость при сбросе пароля пользователя. С помощью специально сформированного URL можно было сбросить пароль первому пользователю, который никогда не сбрасывал пароль (обычно это администратор). Удалённый доступ это не даёт, но, по словам разработчиков, всё же неприятно.
Те, кто не хотят качать двухмегабайтный архив ради исправления одной единственной ошибки, могут применить данный патч:
--- 2.8.3/readme.html 2009-08-03 02:18:57.000000000 +0300
+++ 2.8.4/readme.html 2009-08-12 03:41:44.000000000 +0300
@@ -8,7 +8,7 @@
<body>
<h1 id="logo" style="text-align: center">
<img alt="WordPress" src="wp-admin/images/wordpress-logo.png" />
- <br /> Version 2.8.3
+ <br /> Version 2.8.4
</h1>
<p style="text-align: center">Semantic Personal Publishing Platform</p>
@@ -29,7 +29,7 @@
<h1>Upgrading</h1>
<p>Before you upgrade anything, make sure you have backup copies of any files you may have modified such as <code>index.php</code>.</p>
-<h2>Upgrading from any previous WordPress to 2.8.3:</h2>
+<h2>Upgrading from any previous WordPress to 2.8.4:</h2>
<ol>
<li>Delete your old WP files, saving ones you've modified.</li>
<li>Upload the new files.</li>
diff -uwdBrN 2.8.3/wp-includes/version.php 2.8.4/wp-includes/version.php
--- 2.8.3/wp-includes/version.php 2009-08-03 02:18:57.000000000 +0300
+++ 2.8.4/wp-includes/version.php 2009-08-12 03:41:44.000000000 +0300
@@ -8,7 +8,7 @@
*
* @global string $wp_version
*/
-$wp_version = '2.8.3';
+$wp_version = '2.8.4';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
diff -uwdBrN 2.8.3/wp-login.php 2.8.4/wp-login.php
--- 2.8.3/wp-login.php 2009-06-04 01:15:22.000000000 +0300
+++ 2.8.4/wp-login.php 2009-08-11 09:03:45.000000000 +0300
@@ -161,7 +161,7 @@
$message .= get_option('siteurl') . "\r\n\r\n";
$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
$message .= __('To reset your password visit the following address, otherwise just ignore this email and nothing will happen.') . "\r\n\r\n";
- $message .= site_url("wp-login.php?action=rp&key=$key", 'login') . "\r\n";
+ $message .= site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "\r\n";
$title = sprintf(__('[%s] Password Reset'), get_option('blogname'));
@@ -182,15 +182,18 @@
* @param string $key Hash to validate sending user's password
* @return bool|WP_Error
*/
-function reset_password($key) {
+function reset_password($key, $login) {
global $wpdb;
$key = preg_replace('/[^a-z0-9]/i', '', $key);
- if ( empty( $key ) )
+ if ( empty( $key ) || !is_string( $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($login) || !is_string($login) )
+ return new WP_Error('invalid_key', __('Invalid key'));
+
+ $user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users WHERE user_activation_key = %s AND user_login = %s", $key, $login));
if ( empty( $user ) )
return new WP_Error('invalid_key', __('Invalid key'));
@@ -370,7 +373,7 @@
case 'resetpass' :
case 'rp' :
- $errors = reset_password($_GET['key']);
+ $errors = reset_password($_GET['key'], $_GET['login']);
if ( ! is_wp_error($errors) ) {
wp_redirect('wp-login.php?checkemail=newpass');
Те, у кого стоит WordPress 2.7, могут воспользоваться данным патчем:
--- 2.8.3/wp-login.php 2009-06-04 01:15:22.000000000 +0300
+++ 2.8.4/wp-login.php 2009-08-11 09:03:45.000000000 +0300
@@ -161,7 +161,7 @@
$message .= get_option('siteurl') . "\r\n\r\n";
$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
$message .= __('To reset your password visit the following address, otherwise just ignore this email and nothing will happen.') . "\r\n\r\n";
- $message .= site_url("wp-login.php?action=rp&key=$key", 'login') . "\r\n";
+ $message .= site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "\r\n";
$title = sprintf(__('[%s] Password Reset'), get_option('blogname'));
@@ -182,15 +182,18 @@
* @param string $key Hash to validate sending user's password
* @return bool|WP_Error
*/
-function reset_password($key) {
+function reset_password($key, $login) {
global $wpdb;
$key = preg_replace('/[^a-z0-9]/i', '', $key);
- if ( empty( $key ) )
+ if ( empty( $key ) || !is_string( $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($login) || !is_string($login) )
+ return new WP_Error('invalid_key', __('Invalid key'));
+
+ $user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users WHERE user_activation_key = %s AND user_login = %s", $key, $login));
if ( empty( $user ) )
return new WP_Error('invalid_key', __('Invalid key'));
@@ -370,7 +373,7 @@
case 'resetpass' :
case 'rp' :
- $errors = reset_password($_GET['key']);
+ $errors = reset_password($_GET['key'], $_GET['login']);
if ( ! is_wp_error($errors) ) {
wp_redirect('wp-login.php?checkemail=newpass');
Патч нормально ложится на стандартный WordPress 2.7. Исправляется только уязвимость, связанная со сбросом пароля.
Отличная статья много нового узнал +5
Спасибо большое, Респект!
Автору большая благодарность
Всем привет! Я извиняюсь что опять про кодировку но сам что-то ни как. Установил нужную мне тему сайта и пол заголовка стало в знаках вопроса. Везде на других страницах всё в порядке,только на главной такая фигня. В .htaccess стоит utf-8, дамп базы тоже utf-8 и utf8_general_ci нормально(нет кракозябров),
мета выдаёт:/ /как-бы правильно.
В чём-же может быть проблема ? Я с WordPress работаю в первые поэтому надеюсь на Вашу помощь.
Версия WordPress 2.8.4. За ранее благодарен!
Игорь, нужно смотреть. Я не телепат, вслепую помочь, увы, не смогу.
Всем привет! Я нашёл в чём проблема. Если длина заголовка превышает 11 знаков,то начинается проблема и появляются знаки вопроса. Подскажите пожалуйста как(в каком файле) увеличить(разрешить) длину заголовка!
vot.gif
Игорь,
Если я не вижу Вашу тему, откуда я знаю, а каком файле что менять?
Проблема в том, что используется функция substr(), использование которой небезопасно для UTF-8.
Замените вызов
substr()
наmb_substr()
. Это всё, чем я могу на данный момент помочь.Либо обратитесь к автору темы за поддержкой.
Автор, а есть конкретная информация об уязвимости, хотелось бы увидеть код.
Google в помощь. Естественно, что код я приводить не буду. По патчу понятно, что изменилось, воссоздать URL для эксплуатации ошибки проще простого.
Сейчас попробую, сразу отпишусь,как прошло
Спасибо за статью, много полезной информации
Akisnya, ставить ссылки на смайлики бесполезно — мой плагин их не пропускает. А в результате сайт, который Вы пытались пропиарить, попал в блэклист.
Прошу прощения за глупый вопрос, а каким образом установить этот патч на WP?
Спасибо.
Pavel, я для такого использую команду
patch
. Если Вы с Линуксом не дружите, возьмите у Lecactus’а его патч (на главной странице; называется «Патч для обновления WordPress 2.8.2 до 2.8.4») — там будет ZIP-архив, который нужно развернуть поверх текущей установки.Спасибо большое!!!