Server-Side load_file() vs Local Data Load Infile

Discussion in 'База Знаний' started by dooble, 7 Mar 2019.

  1. dooble

    dooble Members of Antichat

    Joined:
    30 Dec 2016
    Messages:
    147
    Likes Received:
    398
    Reputations:
    103
    Эти два механизма известны давно и в хакерской среде используются для чтения файлов на сервере, например:
    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 с сервера, где лежат скрипты сайта.
     
  2. grimnir

    grimnir Reservists Of Antichat

    Joined:
    23 Apr 2012
    Messages:
    1,108
    Likes Received:
    752
    Reputations:
    200