>
Сентябрь 2017
Пн Вт Ср Чт Пт Сб Вс
« Авг    
 123
45678910
11121314151617
18192021222324
252627282930  

Чтение файлов с помощью MYSQL клиента

Всем привет. Как часто ты натыкаешься на скрипты администрирования MySQL? Лично я — постоянно. То Adminer проскочит, то старичок Sypex dumper промелькнет на периметре. Или, может быть, тебе попался скрипт, который может импортировать данные из сторонней БД? В общем, если у тебя есть возможность коннекта из приложения к своему серверу MySQL, то считай, что у тебя в кармане как минимум читалка файлов.

Техника, о которой я хочу сейчас рассказать, — это особенность протокола MySQL. Поэтому фиксить ее, сам понимаешь, никто не торопится. Шутка ли, эксплуатация этой фичи находится в паблике с 2013 года.

В MySQL есть конструкция LOAD DATA LOCAL INFILE ‘filename’, с помощью которой можно импортировать в таблицу локальные (клиентские) файлы. Нам нужно посмотреть, как же она работает на пакетном уровне. Для этого я вооружился tcpdump’ом, чтобы лучше их слышать, и Wireshark’ом, чтобы лучше их видеть. Присоединился к тестовому MySQL, выполнил команду LOAD DATA LOCAL INFILE ‘/etc/passwd’ INTO TABLE test FIELDS TERMINATED BY ‘n’;, посмотрел результат импорта и вежливо попрощался с сервером.

Теперь все внимание на Wireshark. Авторизацию и прочие нежности опустим и сразу перейдем к пакету с запросом, точнее к ответу от сервера на него:

Оп! Следующим пакетом клиент возвращает содержимое файла /etc/passwd. Получается так, что сервер просто говорит клиенту: «0xFB Вообще-то я здесь для того, чтобы увидеть содержимое %filename%». И клиент послушно выполняет команду.

В этом и есть суть «уязвимости». Нам нужно создать фейковый MySQL-сервер, который бы авторизовывал клиента, отправлял пакет FB с интересующим именем файла и выводил ответ от клиента.

Исходный код такого сервера можешь найти в GitHub. Это форк сервера от Gifts (за что ему огромное спасибо), заточенный под современные версии MySQL. В исходнике можно указать путь до файла, который нужно прочитать, и порт фейк-сервера.

Теперь несколько слов о PHP и драйвере для работы с MySQL — mysqlnd. Если используется такой драйвер, а он по умолчанию используется с PHP 5.4, то при чтении файлов можно применять врапперы PHP. И читалка медленно превращается в почти полноценную SSRF.

Если в приложении для работы с БД используется PDO, то фича, к сожалению, не работает. В нем по умолчанию отключено выполнение LOAD DATA LOCAL INFILE.

Если приложение написано на Python и в качестве клиента выступает модуль MySQLdb, то чтение файлов также невозможно, если при соединении не указан аргумент local_infile. Однако при использовании mysql. connector все работает прекрасно.

Стоит также отметить, что все сказанное актуально и для MariaDB, так как протоколы общения в данном случае идентичны.

Ну вот и все на сегодня. Исследуй эту тему, возможно наткнешься на чтото интересное. Желаю удачных аудитов!

Share Button
[Всего голосов: 6    Средний: 4.3/5]

Вам может быть интересно также:

Last updated by at .

Leave a Reply

You can use these HTML tags

<a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">