
PoC для CVE-2025-22783
Плагин WordPress
Component name SEO Plugin by Squirrly SEO
Vulnerable version <= 12.4.01
Component slug squirrly-seo
Component link https://wordpress.org/plugins/squirrly-seo/
Vulnerability class A3: Injection
Vulnerability type SQL Injection
Contributor +
Плагин SEO Plugin by Squirrly SEO позволяет улучшить SEO вашего сайта с помощью функции внутренней перелинковки, которая позволяет выбирать исходные и целевые страницы на основе определённых ключевых слов. Вы можете управлять ключевыми словами, исходными страницами, целевыми страницами и статусом каждой ссылки на странице управления внутренними ссылками (/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks).
В версиях 12.4.01 и ниже плагина Squirrly SEO вы можете искать созданные внутренние ссылки на странице управления внутренними ссылками. Уязвимость SQL-инъекции возникает, когда поисковые запросы, введённые пользователями (Contributor+), передаются напрямую в запросы к базе данных без проверки.
Хотя результаты поиска не отображаются напрямую на странице управления внутренними ссылками, информацию из базы данных можно извлечь с помощью техник Time-based SQL Injection, таких как функция SLEEP.
Войдите на целевой сайт с учётной записью, имеющей права Contributor или выше, на котором установлен плагин Squirrly SEO версии 12.4.01 или ниже.
Затем, когда вы обратитесь к URL ниже, поскольку условие оператора IF '1=1' в полезной нагрузке SQL-инъекции всегда истинно, функция SLEEP(5) выполнится, и страница загрузится через 5 секунд.
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=1,SLEEP(5),1)),2,3,4,5,6,7%23
С другой стороны, если вы измените условие оператора IF на '1=2', страница загрузится немедленно, поскольку результат будет ложным.
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=2,SLEEP(5),1)),2,3,4,5,6,7%23
На странице управления внутренними ссылками (/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks) плагина Squirrly SEO при поиске внутренних ссылок выполняется запрос к базе данных путём вызова функции getSqInnerlinks в файле /wp-content/plugins/squirrly-seo/models/Qss.php.

Здесь видно, что переменная $query_where напрямую вставляется в SQL-запрос. Давайте рассмотрим, как формируется значение переменной $query_where:
$search содержит поисковый запрос, введённый при поиске внутренних ссылок, а функция sanitize_text_field используется для обработки пользовательских данных.$search используется как часть условного выражения и сохраняется в переменной $query_where.$query_where добавляются дополнительные условия, а через функцию apply_filters применяются фильтры.Таким образом, хотя поисковый запрос, введённый пользователями при поиске внутренних ссылок, обрабатывается функцией sanitize_text_field, эта функция не может предотвратить атаки с использованием SQL-инъекций. Специальные символы, используемые в SQL-запросах (одинарные кавычки ('), комментарии (#) и т.д.), не фильтруются, и когда переменная $search, содержащая полезную нагрузку SQL-инъекции, передаётся в запрос к базе данных без надлежащего экранирования, возникает уязвимость SQL-инъекции.
⚠️ Реализованный PoC-код входит в систему с учётной записью администратора, чтобы создать учётную запись с минимальными правами (Contributor+), необходимыми для воспроизведения уязвимости, а затем запускает уязвимость с использованием этой учётной записи.

Затем выполните следующую команду, чтобы запустить PoC-код.
Required modulerequests
python poc.py
