WordPress 2.8.4

Исправление уязвимости при сбросе пароля

Вчера вышел WordPress 2.8.4, исправляющий уязвимость при сбросе пароля пользователя. С помощью специально сформированного URL можно было сбросить пароль первому пользователю, который никогда не сбрасывал пароль (обычно это администратор). Удалённый доступ это не даёт, но, по словам разработчиков, всё же неприятно.

Те, кто не хотят качать двухмегабайтный архив ради исправления одной единственной ошибки, могут применить данный патч:

[-]
Download 2.8.3-2.8.4.diff
diff -uwdBrN 2.8.3/readme.html 2.8.4/readme.html
--- 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, могут воспользоваться данным патчем:

[-]
Download 2.7.diff
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. Исправляется только уязвимость, связанная со сбросом пароля.

Добавить в закладки

Связанные записи

Автор: Vladimir; опубликовано в: WordPress; метки: WordPress, патч, уязвимость
13
Авг
2009

RSS Комментарии к статье «WordPress 2.8.4» (16)  »

  1. Artemey

    Отличная статья много нового узнал +5

  2. Lukich

    Спасибо большое, Респект!

  3. Tatiana

    Автору большая благодарность

  4. Игорь

    Всем привет! Я извиняюсь что опять про кодировку но сам что-то ни как. Установил нужную мне тему сайта и пол заголовка стало в знаках вопроса. Везде на других страницах всё в порядке,только на главной такая фигня. В .htaccess стоит utf-8, дамп базы тоже utf-8 и utf8_general_ci нормально(нет кракозябров),
    мета выдаёт:/ /как-бы правильно.
    В чём-же может быть проблема ? Я с WordPress работаю в первые поэтому надеюсь на Вашу помощь.
    Версия WordPress 2.8.4. За ранее благодарен!

    • Игорь, нужно смотреть. Я не телепат, вслепую помочь, увы, не смогу.

      • Игорь

        Всем привет! Я нашёл в чём проблема. Если длина заголовка превышает 11 знаков,то начинается проблема и появляются знаки вопроса. Подскажите пожалуйста как(в каком файле) увеличить(разрешить) длину заголовка!

        vot.gif

        • Игорь,

          Если я не вижу Вашу тему, откуда я знаю, а каком файле что менять?

          Проблема в том, что используется функция substr(), использование которой небезопасно для UTF-8.

        • Замените вызов substr() на mb_substr(). Это всё, чем я могу на данный момент помочь.

          Либо обратитесь к автору темы за поддержкой.

  5. Craft

    Автор, а есть конкретная информация об уязвимости, хотелось бы увидеть код.

    • Google в помощь. Естественно, что код я приводить не буду. По патчу понятно, что изменилось, воссоздать URL для эксплуатации ошибки проще простого.

  6. Teodor

    Сейчас попробую, сразу отпишусь,как прошло

  7. Aksinya

    Спасибо за статью, много полезной информации :-)

    • Akisnya, ставить ссылки на смайлики бесполезно — мой плагин их не пропускает. А в результате сайт, который Вы пытались пропиарить, попал в блэклист.

  8. Pavel

    Прошу прощения за глупый вопрос, а каким образом установить этот патч на WP?
    Спасибо.

    • Pavel, я для такого использую команду patch. Если Вы с Линуксом не дружите, возьмите у Lecactus’а его патч (на главной странице; называется «Патч для обновления WordPress 2.8.2 до 2.8.4») — там будет ZIP-архив, который нужно развернуть поверх текущей установки.

Оставить комментарий к записи «WordPress 2.8.4»

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Изображения должны быть включены!

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя