dooble
07.03.2019, 14:07
Эти два механизма известны давно и в хакерской среде используются для чтения файлов на сервере, например:
Code:
select load_file('/etc/passwd');
use anyDatabase;
CREATE TEMPORARY TABLE `tt` (`name` TEXT);
LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE tt;
SELECT * FROM tt;
Обе конструкции в итоге прочитают /etc/passwd.
Не буду делать по ним полное описание, остановлюсь только на их различии.
Принципиальное различие меду ними состоит в том, что load_file() [далее LF] выполняется в контексте сервера MySQL, а load data local infile [LDLI] - в контексте клиента MySQL.
Отсюда разница в эксплуатации:
LF читает файлы с правами mysql, а LDLI с правами php (обычно это права веб-сервера, здесь и далее рассматривается случай работы из скриптов сайта, например из phpMyAdmin).
Возможно чмоды выставлены так, что у mysql нет прав на чтение скриптов сайта а php не может прочитать за пределами open_basedir.
Кстати про open_basedir и LDLI, на рдоте и в хакере писали, что LDLI обходит open_basedir, но у меня такое ни разу не прокатывало, вот по крайней мере на php, как модуль Apache, тестил на многих серверах - "open_basedir restriction in effect. Unable to open file".
Второй важный момент, когда скрипты сайта и MySQL расположены на разных серверах.
В этом случае LF будет читать файлы там, где сервер MySQL, а LDLI с сервера, где лежат скрипты сайта.
Code:
select load_file('/etc/passwd');
use anyDatabase;
CREATE TEMPORARY TABLE `tt` (`name` TEXT);
LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE tt;
SELECT * FROM tt;
Обе конструкции в итоге прочитают /etc/passwd.
Не буду делать по ним полное описание, остановлюсь только на их различии.
Принципиальное различие меду ними состоит в том, что load_file() [далее LF] выполняется в контексте сервера MySQL, а load data local infile [LDLI] - в контексте клиента MySQL.
Отсюда разница в эксплуатации:
LF читает файлы с правами mysql, а LDLI с правами php (обычно это права веб-сервера, здесь и далее рассматривается случай работы из скриптов сайта, например из phpMyAdmin).
Возможно чмоды выставлены так, что у mysql нет прав на чтение скриптов сайта а php не может прочитать за пределами open_basedir.
Кстати про open_basedir и LDLI, на рдоте и в хакере писали, что LDLI обходит open_basedir, но у меня такое ни разу не прокатывало, вот по крайней мере на php, как модуль Apache, тестил на многих серверах - "open_basedir restriction in effect. Unable to open file".
Второй важный момент, когда скрипты сайта и MySQL расположены на разных серверах.
В этом случае LF будет читать файлы там, где сервер MySQL, а LDLI с сервера, где лежат скрипты сайта.