15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало
10.10.2024

Как да активирате и деактивирате xmlrpc.php в WordPress (и защо е важно)

Файлът xmlrpc.php е основен компонент на WordPress, който излага XML-RPC API крайна точка, позволявайки на отдалечени приложения да се удостоверяват и да изпълняват операции на сървъра — публикуване на публикации, управление на коментари, задействане на pingback-и и други. Тъй като по подразбиране приема неудостоверени POST заявки и ги обработва преди повечето защитни слоеве да се активират, той е една от най-често злоупотребяваните повърхности за атака при всяка WordPress инсталация.

Ако не използвате мобилното приложение на WordPress, Jetpack или услуга на трета страна, която изрично изисква XML-RPC, деактивирането на xmlrpc.php е правилната позиция по подразбиране от гледна точка на сигурността. Ако разчитате на тези интеграции, можете да укрепите крайната точка, вместо да я премахнете изцяло.

Какво е xmlrpc.php и как работи

XML-RPC (Extensible Markup Language Remote Procedure Call) е протокол, който кодира извиквания на функции в XML и ги предава по HTTP. WordPress включва пълен XML-RPC сървър от версия 3.5, реализиран във файла xmlrpc.php, намиращ се в основната директория на WordPress.

Когато отдалечен клиент — мобилно приложение, настолен клиент за блогване или скрипт за автоматизация — изпрати POST заявка до https://yourdomain.com/xmlrpc.php, WordPress анализира XML съдържанието, удостоверява идентификационните данни, вградени в тялото на заявката, и изпълнява поисканото действие. Целият обмен се случва в един HTTP кръгов трип, което е едновременно неговата сила и основната му слабост от гледна точка на сигурността.

Основни XML-RPC методи, изложени от WordPress

  • wp.newPost / wp.editPost — отдалечено създаване и актуализиране на публикации
  • wp.getComments / wp.deleteComment — управление на коментари
  • wp.uploadFile — качване на медия на сървъра
  • pingback.ping — уведомяване на отдалечен сайт, че е бил свързан
  • system.multicall — групиране на множество извиквания на методи в една HTTP заявка

Методът system.multicall е особено опасен. Една HTTP заявка може да обедини стотици извиквания на wp.getUsersBlogs, всяко от които тества различна парола. Това позволява на атакуващ да извърши хиляди опити за удостоверяване, като генерира само един запис в сървърния журнал, заобикаляйки инструментите за ограничаване на скоростта, които броят отделните заявки.

Рискове за сигурността при оставен активен xmlrpc.php

Усилване на атаки с груба сила чрез system.multicall

Традиционните атаки с груба сила изпращат по една двойка идентификационни данни на HTTP заявка. С XML-RPC атакуващият обвива 500 опита за влизане в един system.multicall пакет. Стандартното правило на fail2ban или брояч на опити за влизане вижда една заявка; атакуващият получава 500 опита. Това не е теоретичен риск — той е най-честият XML-RPC експлойт, наблюдаван в реалността.

DDoS усилване чрез Pingback

WordPress автоматично обработва входящи pingback заявки чрез xmlrpc.php. Атакуващият може да изпрати специално изработена pingback.ping заявка до хиляди WordPress сайтове, инструктирайки всеки от тях да изпрати HTTP заявка до един целеви URL адрес. Жертвата получава масов поток от заявки, произхождащи от легитимни WordPress сървъри, което прави блокирането на базата на IP неефективно. Вашият сървър едновременно се превръща в жертва (изчерпване на ресурси) и неволен усилвател на атаката.

SSRF чрез Pingback

Механизмът за pingback може да бъде злоупотребен за Server-Side Request Forgery (SSRF). Атакуващият изпраща pingback.ping заявка, при която изходният URL сочи към вътрешен мрежов ресурс — например http://192.168.1.1/admin. WordPress сървърът извлича този URL от вътрешността на мрежовия периметър, потенциално излагайки вътрешни услуги, които не са публично маршрутизируеми.

Излагане на идентификационни данни при пренос

XML-RPC предава идентификационните данни в тялото на POST заявката като обикновен текст в XML обвивката. Ако вашият сайт не налага HTTPS, идентификационните данни са изложени на всеки наблюдател в мрежата. Дори при TLS, идентификационните данни са вградени в абсолютно всяка заявка — няма сесиен токен или OAuth поток, който да ограничи прозореца на излагане.

Кога трябва да оставите xmlrpc.php активен

Деактивирайте го по подразбиране, но го оставете активен, ако вашият работен процес наистина зависи от някое от следните:

  • Мобилно приложение на WordPress (iOS/Android): Официалното приложение използва XML-RPC за всички операции по управление на сайта при самостоятелно хостнати WordPress инсталации.
  • Плъгин Jetpack: Няколко модула на Jetpack — включително publicize, мобилни push известия и някои функции за статистика — комуникират чрез XML-RPC със сървърите на WordPress.com.
  • Настолни клиенти за блогване: MarsEdit, Windows Live Writer и подобни инструменти разчитат изключително на XML-RPC API.
  • Автоматизирани тръбопроводи за публикуване: IFTTT, Zapier и персонализирани скриптове, които публикуват съдържание в WordPress, често използват XML-RPC, когато REST API не е конфигуриран.
  • Pingback/trackback между WordPress сайтове: Ако известията за pingback между сайтове са част от вашия редакционен работен процес, деактивирането на xmlrpc.php ги заглушава.

Ако нито едно от тях не се отнася за вас, няма оперативна причина да оставяте крайната точка отворена.

xmlrpc.php срещу WordPress REST API

WordPress въведе REST API във версия 4.7 като модерна, базирана на токени замяна на XML-RPC. Разбирането на разликите ви помага да решите дали деактивирането на XML-RPC нарушава нещо критично.

Функцияxmlrpc.phpWordPress REST API
УдостоверяванеПотребителско име + парола при всяка заявкаПароли за приложения, OAuth, JWT
ТранспортСамо HTTP POSTHTTP GET, POST, PUT, PATCH, DELETE
Формат на съдържаниетоXMLJSON
ВъведенWordPress 1.5 (2005)WordPress 4.7 (2016)
Риск от груба силаВисок (system.multicall)По-нисък (на заявка, с възможност за ограничаване)
SSRF чрез pingbackДаНе
Поддръжка на мобилно приложениеДа (наследено)Да (текущо)
Зависимост от JetpackЧастичнаЧастична
Детайлни обхвати на разрешенияНеДа (пароли за приложения)
Препоръчан за нови интеграцииНеДа

Ако изграждате нова интеграция или мигрирате съществуваща, използвайте REST API. Моделът за удостоверяване е значително по-сигурен, а крайната точка е много по-лесна за одит и ограничаване на скоростта на инфраструктурно ниво.

Как да деактивирате xmlrpc.php в WordPress

Изберете метода, който съответства на нивото ви на достъп до сървъра и толерантността към риск. Методите са наредени от най-ниско до най-високо налагане на ниво сървър.

Метод 1: Деактивиране чрез плъгин (Най-бързо, без достъп до сървъра)

За среди със споделен хостинг или сайтове, при които предпочитате да не редактирате конфигурационни файлове на сървъра, плъгинът е най-достъпният вариант.

Препоръчани плъгини:

  • Disable XML-RPC-API — с единствена цел, минимален отпечатък, активира се незабавно
  • All In One WP Security and Firewall — по-широк пакет за сигурност с детайлни контроли за XML-RPC

Стъпки за Disable XML-RPC-API:

  1. Отидете на Плъгини > Добавяне на нов в таблото за управление на WordPress.
  2. Потърсете „Disable XML-RPC-API” и кликнете Инсталирай сега, след това Активирай.
  3. Не е необходима допълнителна конфигурация — плъгинът се закача за xmlrpc_enabled и незабавно връща false при активиране.

Стъпки за All In One WP Security and Firewall:

  1. След активиране на плъгина, отидете на WP Security > Firewall.
  2. Намерете секцията XML-RPC.
  3. Активирайте опцията за пълно блокиране на XML-RPC заявки.
  4. Запазете настройките.

Ограничение: Блокирането чрез плъгин се задейства в контекста на изпълнение на WordPress PHP. Сървърът все още стартира PHP, зарежда WordPress и обработва заявката преди да я отхвърли. При тежка атака това консумира CPU и памет. За сайтове с голям трафик под активна атака, използвайте вместо това метода с .htaccess или Nginx.

Метод 2: Деактивиране чрез .htaccess (Apache — блокиране на ниво сървър)

Блокирането на ниво .htaccess предотвратява изпълнението на PHP за заявки, насочени към xmlrpc.php. Това е значително по-ефективно при натоварване.

  1. Свържете се със сървъра си чрез FTP, SFTP или файловия мениджър на хостинга и отворете файла .htaccess в основната директория на WordPress (обикновено public_html/.htaccess).
  2. Добавете следния блок. Поставете го преди стандартните правила за пренасочване на WordPress:
# Block all access to xmlrpc.php
<Files "xmlrpc.php">
    Order Deny,Allow
    Deny from all
</Files>
  1. Запазете файла.

За да проверите дали блокирането е активно, изпълнете тест от вашата локална машина:

curl -s -o /dev/null -w "%{http_code}" -X POST https://yourdomain.com/xmlrpc.php

Трябва да получите отговор 403. Отговор 200 или 405 означава, че блокирането все още не е в сила.

Краен случай — ако все още се нуждаете от pingback от конкретни доверени IP адреси, можете да ги добавите в белия списък:

<Files "xmlrpc.php">
    Order Deny,Allow
    Deny from all
    Allow from 192.0.2.10
</Files>

Метод 3: Деактивиране чрез конфигурация на Nginx

Ако вашият сървър работи с Nginx (обичайно в среди за VPS Хостинг), файловете .htaccess нямат ефект. Добавете блока директно в конфигурацията на сървърния блок на вашия сайт.

# Block xmlrpc.php at the Nginx level
location = /xmlrpc.php {
    deny all;
    access_log off;
    log_not_found off;
    return 444;
}

Директивата return 444 затваря TCP връзката без да изпраща HTTP отговор, което е по-ефективно от 403, тъй като предотвратява получаването на каквато и да е обратна връзка от клиента на атакуващия. След редактиране, презаредете Nginx:

sudo nginx -t && sudo systemctl reload nginx

Поставете този location блок вътре в блока server {}, преди директивите за try_files или обработка на PHP.

Метод 4: Деактивиране чрез functions.php (WordPress Filter Hook)

Този метод използва WordPress филтър за деактивиране на XML-RPC на ниво приложение. Той е по-малко ефективен от блокирането на ниво сървър, но е полезен, когато нямате директен достъп до сървъра и искате решение, базирано на код, без зависимост от плъгин.

  1. Отидете на Външен вид > Редактор на теми в таблото за управление на WordPress или достъпете файла директно чрез SFTP на wp-content/themes/your-theme/functions.php.
  2. Добавете следното в края на файла:
// Disable XML-RPC completely
add_filter( 'xmlrpc_enabled', '__return_false' );
  1. Запазете файла.

Важна уговорка: Този филтър деактивира удостоверените XML-RPC методи, но не блокира метода pingback.ping и не предотвратява достъпа до файла. Сървърът все още обработва заявката до момента, в който WordPress оценява филтъра. За пълна защита, комбинирайте това с блока .htaccess или Nginx.

Ако използвате дъщерна тема, винаги добавяйте персонализиран код в functions.php на дъщерната тема, а не в родителската тема. Актуализациите на родителската тема ще презапишат вашите промени.

Метод 5: Селективно деактивиране — блокиране само на Pingback

Ако се нуждаете от XML-RPC за Jetpack или мобилно публикуване, но искате да премахнете вектора за DDoS усилване, можете да деактивирате само метода за pingback, като запазите останалата функционалност на API.

// Disable only the pingback method, keep XML-RPC otherwise functional
add_filter( 'xmlrpc_methods', function( $methods ) {
    unset( $methods['pingback.ping'] );
    unset( $methods['pingback.extensions.getPingbacks'] );
    return $methods;
} );

Добавете това в functions.php на вашата дъщерна тема или в плъгин, специфичен за сайта. Това е препоръчаната конфигурация за сайтове, които използват Jetpack, но не се нуждаят от получаване на pingback-и.

Как да активирате отново xmlrpc.php

Обръщането на някой от горните методи възстановява достъпа до XML-RPC:

  • Метод с плъгин: Деактивирайте или изтрийте блокиращия плъгин от Плъгини > Инсталирани плъгини.
  • Метод с .htaccess: Премахнете блока <Files "xmlrpc.php"> от .htaccess и запазете.
  • Метод с Nginx: Премахнете блока location = /xmlrpc.php от конфигурацията на сървъра и презаредете Nginx с sudo systemctl reload nginx.
  • Метод с functions.php: Премахнете реда add_filter( 'xmlrpc_enabled', '__return_false' ) и запазете.

След повторно активиране, проверете дали крайната точка отговаря правилно:

curl -s -X POST https://yourdomain.com/xmlrpc.php 
  -H "Content-Type: text/xml" 
  --data '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName><params></params></methodCall>'

Валиден XML отговор, изброяващ наличните методи, потвърждава, че крайната точка е активна.

Укрепване на xmlrpc.php без деактивирането му

Ако деактивирането не е опция, приложете тези мерки за намаляване на повърхността за атака:

Наложете HTTPS: Уверете се, че вашият сайт използва валиден TLS сертификат. Ако все още не сте го направили, конфигурирайте такъв чрез вашия хостинг доставчик — SSL сертификати предотвратяват прихващането на идентификационни данни при пренос.

Ограничете скоростта на ниво защитна стена или CDN: Конфигурирайте вашия WAF (Cloudflare, ModSecurity) да ограничава POST заявките до xmlrpc.php до максимум 5–10 на минута на IP.

Блокирайте system.multicall конкретно:

add_filter( 'xmlrpc_methods', function( $methods ) {
    unset( $methods['system.multicall'] );
    return $methods;
} );

Това елиминира вектора за усилване на атаки с груба сила, като запазва цялата останала функционалност на XML-RPC.

Ограничете по IP: Ако достъпвате XML-RPC само от известни IP адреси (диапазонът на IP адресите на оператора на вашето мобилно приложение или статичен офис IP), добавете тези адреси в белия списък в .htaccess или Nginx и откажете всички останали.

Наблюдавайте журналите за достъп: Редовно проверявайте журналите на сървъра за повтарящи се POST заявки до xmlrpc.php. Скок в POST заявките със статус 200 към този файл е надежден индикатор за продължаваща кампания с груба сила.

В среда с VPS с cPanel или друг управляван панел, можете да конфигурирате правила за ModSecurity директно от контролния панел, за да наложите тези ограничения без ръчно редактиране на файлове.

Избор на правилния метод: Матрица за решения

Вашата ситуацияПрепоръчан метод
Споделен хостинг, без достъп до сървъраПлъгин (Disable XML-RPC-API)
Apache сървър, пълен достъп до файловеБлок в .htaccess
Nginx сървър (VPS/Dedicated)Nginx location блок
Нуждаете се от Jetpack, но не от pingbackСелективен филтър в functions.php
Нуждаете се от пълен XML-RPC (мобилно приложение)Укрепване с ограничаване на скоростта + блокиране на system.multicall
При активна атака с груба силаNginx `return 444` + правило за сървърна защитна стена
Управляван WordPress на cPanel VPSПравило ModSecurity чрез cPanel WAF

За производствени сайтове, хостнати на Dedicated сървъри, блокирането на ниво сървър чрез Nginx или Apache винаги е за предпочитане пред решение, базирано на плъгин, тъй като предотвратява изпълнението на PHP изцяло за злонамерени заявки, елиминирайки натоварването на CPU, което блокирането чрез плъгин причинява при продължителна атака.

Практически контролен списък с ключови изводи

  • Проверете дали някой активен плъгин или услуга в стека ви действително изисква XML-RPC, преди да го деактивирате — проверете Jetpack, мобилни приложения и всякакви инструменти за автоматизация на публикуването.
  • Ако не съществува зависимост, приложете блокирането на ниво сървър (.htaccess или Nginx), а не плъгин — то е по-ефективно и оцелява при деактивиране на плъгини.
  • Ако трябва да оставите XML-RPC активен, безусловно премахнете system.multicall и pingback.ping чрез филтъра xmlrpc_methods — тези два метода представляват огромното мнозинство от злоупотребите с XML-RPC.
  • Винаги налагайте HTTPS на всеки WordPress сайт, който приема удостоверени заявки, включително XML-RPC.
  • След прилагане на блокиране, проверете с curl, че крайната точка връща 403 или прекъсва връзката — не приемайте, че конфигурацията е правилна без тестване.
  • В среди с Nginx-базиран VPS или dedicated сървър, използвайте return 444 вместо deny all, за да избегнете предоставянето на каквато и да е обратна връзка на HTTP ниво на атакуващите.
  • Регистрирайте и наблюдавайте POST заявките до xmlrpc.php — внезапен скок е ранно предупреждение за кампания за пълнене с идентификационни данни или DDoS усилване.
  • Ако управлявате множество WordPress сайтове, помислете за централизиране на тази конфигурация на ниво сървър или CDN, вместо да прилагате правила за плъгини за всеки сайт поотделно.

За сайтове, които се нуждаят от надеждно отдалечено управление без рисковата повърхност на XML-RPC, мигрирането на интеграциите към WordPress REST API с пароли за приложения е правилният дългосрочен път. REST API осигурява отмяна на токени, обхватни разрешения и стандартна HTTP семантика, която е много по-лесна за защита и одит.

Ако настройвате нова WordPress среда и искате чиста, сигурна основа от самото начало, VPS контролни панели с предварително конфигуриран ModSecurity ви дават WAF защита на ниво сървър без необходимост от ръчно създаване на правила.

Често задавани въпроси

Деактивирането на xmlrpc.php нарушава ли работата на WordPress REST API?

Не. REST API (/wp-json/) е напълно отделна крайна точка със собствено удостоверяване и маршрутизиране. Блокирането на xmlrpc.php няма абсолютно никакъв ефект върху функционалността на REST API. Двете системи са архитектурно независими.

Деактивирането на xmlrpc.php ще наруши ли работата на Jetpack?

Зависи от това кои модули на Jetpack използвате. Jetpack постепенно мигрира функции към REST API, но някои по-стари модули — включително определени функции за publicize и известия — все още комуникират чрез XML-RPC. Проверете страницата за отстраняване на грешки на Jetpack на Jetpack > Табло > Отстраняване на грешки, за да видите дали XML-RPC свързаността е посочена като изискване, преди да го деактивирате.

Методът с .htaccess или методът с functions.php е по-сигурен?

Методът с .htaccess е значително по-сигурен при условия на атака. Той блокира заявката на слоя на уеб сървъра преди зареждането на PHP, консумирайки минимални ресурси. Филтърът functions.php се задейства в контекста на изпълнение на PHP на WordPress, което означава, че сървърът все още зарежда WordPress за всяка блокирана заявка — което е скъпо при атака с голям обем.

Може ли атакуващ все още да злоупотреби с xmlrpc.php, ако го деактивирам само чрез WordPress филтъра?

Частично. Филтърът xmlrpc_enabled предотвратява удостоверените извиквания на методи, но файлът остава публично достъпен и сървърът все още обработва входящите заявки. Крайната точка за pingback може да остане частично функционална в зависимост от версията на WordPress. За пълна защита, комбинирайте филтъра с блокиране на ниво сървър.

Как да проверя дали xmlrpc.php е достъпен в момента на моя сайт?

Изпълнете следната команда от вашия локален терминал, като замените домейна с вашия:

curl -s -o /dev/null -w "%{http_code}" -X POST https://yourdomain.com/xmlrpc.php

Отговор 200 означава, че крайната точка е отворена. Отговор 403 или прекъсване на връзката (000) потвърждава, че е блокирана. Можете също да използвате онлайн инструмента на xmlrpc.eritreo.it, за да тествате конкретно уязвимостта при pingback.

15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало