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

URL записи