WordPress 2.8.4

Vladimir
Опубликовано в: WordPress

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

Вчера вышел 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. Исправляется только уязвимость, связанная со сбросом пароля.

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

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

13
Авг
2009

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

  1. Artemey says:

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

  2. Lukich says:

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

  3. Tatiana says:

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

  4. Игорь says:

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

    • Vladimir says:

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

      • Игорь says:

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

        vot.gif

        • Vladimir says:

          Игорь,

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

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

        • Vladimir says:

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

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

  5. Craft says:

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

    • Vladimir says:

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

  6. Teodor says:

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

  7. Aksinya says:

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

    • Vladimir says:

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

  8. Pavel says:

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

    • Vladimir says:

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

Подписаться на RSS-ленту комментариев к статье «WordPress 2.8.4» Trackback URL: http://blog.sjinks.org.ua/wordpress/616-wordpress-2-8-4/trackback/

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

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

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

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