Не удалось прогрузить медиа
Обычно большинство моих статей заканчиваются каким-либо успехом, но тут к сожалению будет абсолютно не так. Я все так же занимаюсь шопами, карточками (UNO), и тому подобное, и бывает попадаются такие магазины, которые абсолютно без прав, ну, а апнуть, прям так хочется. Именно такой кандидат у нас сегодня на рассмотрении, я расскажу и разберу, что я пробовал сделать для того чтоб подняться по правам, так скажем моя мини-методичка по каким пунктам можно пробежаться. Приступаем к делу, что мы вообще имеем? А мы имеем 1300 ордеров оплаченных карточкой УНО за март месяц, и аккаунт Shop Manager (плачевно).
Не удалось прогрузить медиа
И никаких прав у нас нет, вот реально, ни-ху-а-ху-а..- Лишь доступ к уже существующим плагинам, и видно юзеров, больше особо ничего. Прав не хватало, чтоб хотяб свой снифф повешать на некоторое время, вкратце, зажаты в абсолютной камере для придурковатых, скованные еще дополнительно ремнями в смирительной рубашке. Первое, что я пошел делать, это смотреть юзеров-админов, и так как я вижу их почты, и логины, то могу пройтись по утечкам, и может быть если бы да кабы, да во рту росли грибы - был бы не рот, а целый огород.
Не удалось прогрузить медиа
Я прогнал абсолютно каждую почту по утечкам, абсолютно каждый логин. Да, мне отдавало пароли, но при попытке зайти под таким пассом - меня слали далеко и куда подальше. Так называемые уто(е)чки я просто смотрю в телеграм боте, тут уж кто на что горазд, рекламы и подобного где я искал, и вот так все по кругу, бесконечно, посмотрел еще другие категории прав, типо SEO Manager, Developer и прочее, но там совсем акков не было.
Не удалось прогрузить медиа
Но опять же, импакта это не дало, но проверить такое всегда стоит чуть-ли не сразу. Тогда я пошел смотреть какие плагины вообще там есть?!..- Прямого доступа к листу с плагинами у меня не было, и надо было отталкиваться от того что прав у меня тоже (практически) нет.
Не удалось прогрузить медиа
Подвигаться тут, нереально, видим лишь Yoast SEO (который бессмысленно долбить, >10kk инсталлов, уязы возможно, но надеяться на SQLi или privesc сразу несуразно), Woo Pricing & Discounts, CTX Feed, пару кастомных плагинов от самих Resin Pro, и вполне на этом всё. Первым делом, я поскакал на
поиск плагинов. Закачал себе эти два Woo Pricing, и CTX Feed, провел суммарно часа полтора, и ничего, абсолютно ничего, что мне могло бы помочь, я не нашел. После ковырялся еще дальше, и в верхнем баре я заметил такую штучку.
Не удалось прогрузить медиа
Bear Bulk Editor, по стандарту такого нет, значит это плагин, и его я точно таким же образом скачал и начал смотреть, и тут уже нашел хоть что-то, думал я, думал, что сейчас апнусь, захвачу весь мир (шоп), и начну стрелять с пулемета тыр-тыр-тыр-тыр..- Конец вы уже знаете, но давайте рассмотрим, что мы тут нашли, и зачем мы это тут нашли. Первое, что бросилось в глаза при аудите этого плагина - фильтрация продуктов. Когда ты вбиваешь текст в поиск по товарам, плагин шлёт AJAX-запрос на woobe_filter_products, а дальше твоё значение летит в функцию posts_txt_where() в файле ext/filters/filters.php. И вот тут начинается магия:
Code:
<?php
$where .= " AND (LOWER({$skey}) REGEXP '{$search_text}')";
Не удалось прогрузить медиа
Да-да, значение $search_text просто идет в SQL-запрос. Без $wpdb->prepare(), без экранирования кавычек тупо вставляется как есть. Казалось бы, всё, мы победили, берём и инжектим что хотим. Но не так быстро, мой ковбой. WordPress по умолчанию оборачивает все входящие данные через wp_magic_quotes(), это addslashes() на стероидах, и наши одинарные кавычки превращаются в \'. Инъекция мертва? Нет. Потому что в этом же плагине данные проходят через parse_str(), и если мы закодируем наш пейлоад дважды (double URL encoding), то первый раз PHP раскодирует при получении POST-данных, второй раз parse_str() раскодирует внутри. А wp_magic_quotes() отрабатывает
между первым и вторым раскодированием. То есть кавычки, которые WordPress видит это ещё %2527, а не '. WordPress пожимает плечами, мол, тут нечего экранировать. А потом parse_str() раскодирует это в чистенькую одинарную кавычку. Бинго. Итоговый пейлоад для Boolean-Based Blind выглядит так:
Code:
.*' AND (условие) AND 'x' REGEXP '.*
Кавычки балансируются, REGEXP синтаксис не ломается, и мы получаем возможность проверять любые булевы условия. Если условие истинно, нам возвращаются товары, если ложно, то ничего. Простенькая слепая инъекция. Написал PoC, и начал вытаскивать данные.
Не удалось прогрузить медиа
Работает. Данные идут. Я уже потирал ручки и представлял, как сейчас вытащу хэш админа из wp_users, крякну (ну или нет), зайду, и дело в шляпе.
Не удалось прогрузить медиа
Чтобы прочитать данные из другой таблицы, нужен подзапрос. А подзапрос, это скобки. SELECT ... FROM wp_users WHERE ... тут без круглых скобок никак. И вот тут плагин нас изящно посылает:
Code:
<?php
$search_text = str_replace('(', '\(', $search_text);
$search_text = str_replace(')', '\)', $search_text);
$search_text = str_replace('[', '\[', $search_text);
$search_text = str_replace('{', '\{', $search_text);
Все скобки экранируются бэкслешами прямо перед вставкой в запрос. Никаких подзапросов, никаких функций (даже CHAR() или CONCAT() не вызвать), ничего что требует круглых скобок. Мы заперты в контексте WHERE условия и можем читать только то, что уже лежит в этой таблице, и системные переменные через @@. Я перепробовал, как по-мне, буквально все, но довести до ума так и не смог. Скуля то есть, скулю то нашли, а толку то от такой скули? Товары читать? Не особо, выглядит так будто я пришел на перестрелку с макаровым, но забыл взять с собой обойму, и теперь у меня кусок железа, вроде есть, а вроде и нахера он мне.
Не удалось прогрузить медиа
Что мы имеем по итогу? Рабочую SQLi в Bear Bulk Editor, Boolean-Based Blind, с байпасом wp_magic_quotes через двойное URL-кодирование, звучит красиво, на бумажке выглядит грозно, а по факту говно на палочке. Скобки зарезаны, подзапросы невозможны, из другой таблицы ничего не вытащить, а читать @@version и @@hostname в бесконечном цикле, ну такое, развлечение на пару минут. Вот так бывает. Не каждый шоп, это история успеха. Иногда ты сидишь, смотришь на 1300 ордеров за стеклом, и понимаешь что между тобой и ними, одна сраная скобка, которую кто-то додумался заэкранировать. Даже не из соображений безопасности скорее всего, а просто чтоб REGEXP не ломался. Но статью я всё равно написал, потому что фейлы тоже надо показывать. Не всё должно заканчиваться красивым root@пабеда:~# . Может теперь, кто-то не будет опускать руки при виде Shop Manager, ибо все вполне реально, и подниматься это не так и тяжело, как кажется. Всем пока, не болейте! (пардон, что не поприветствовался)