В WordPress 4.8.3 устранена уязвимость, которая может привести к подстановке SQL-кода

В системе управления web-контентом WordPress выявлена уязвимость, позволяющая выполнить произвольные SQL-запросы на сервере. Уязвимость устранена в выпуске 4.8.3.

Проблема связана с генерацией функцией $wpdb→prepare () запросов, допускающих совершение атак через подстановку SQL-запросов из-за отсутствия экранирования последовательности »%s» функцией esc_sql (). Утверждается, что базовая часть WordPress напрямую не подвержена атаке, но уязвимость может проявиться в плагинах и темах оформления при наличии двойного вызова prepare в сочетании с подстановками через »%s». Например, если в коде

       $value_clause = $wpdb->prepare( " AND meta_value = %s", $meta_value );       $object_ids = $wpdb->get_col( $wpdb->prepare( "SELECT $type_column FROM $table WHERE meta_key = %s $value_clause", $meta_key ) );  

в качестве значения $meta_value пользователь передаст строку » %s », а $meta_key — массив ['dump', ' OR 1=1 /*'], то благодаря двойной подстановке через оператор »%s» в первом prepare () вместо %s c учётом добавленного экранирования кавычками будет подставлена строка » '%s' », в во втором prepare () эта строка приведёт к подстановке второго элемента массива из $meta_key. В итоге будет подготовлен SQL-запрос:

     SELECT type FROM table WHERE meta_key = 'dump' AND meta_value = '' OR 1=1 /*'  

Примечательно, что более общая уязвимость, связанная с подстановкой SQL-кода через манипуляцию значениями с символом »%», вначале была исправлена в версии 4.8.2, но для сохранения совместимости с кодом плагинов была оставлена возможность использования последовательности »%s», что не устранило проблему, а лишь потребовало изменения метода атаки. 20 сентября, спустя день после релиза 4.8.2, разработчикам был продемонстрирован иной способ атаки, но выявившему проблему исследователю потребовалось 5 недель, чтобы доказать наличие уязвимости и добиться выпуска исправления.

© OpenNet