File Inclusion и Path Traversal. Разбираем две базовые веб-уязвимости

Содержание статьи

  • Включение файлов (File Inclusion)
  • Типы включения файлов
  • DVWA Level Low
  • Как узнать, где какие файлы? Как получить RCE?
  • Удаленное включение файлов (Remote File Inclusion, RFI)
  • Уязвимости, связанные с символом null byte (PHP 5)
  • Обход путей (Path Traversal)
  • Защита от уязвимостей
  • Валидация и фильтрация пользовательских данных
  • Использование функции realpath
  • Bazarr
  • Неизвестный баг
  • Анализ без установки
  • Поднимаем Bazarr
  • Отладка
  • Анализ CVE-2024-40348
  • Что интересного можно прочесть?
  • Выводы

Ба­ги, свя­зан­ные с вклю­чени­ем фай­лов (File Inclusion) и обхо­дом путей (Path Traversal), — одни из самых кри­тичес­ких в веб‑безопас­ности, пос­коль­ку поз­воля­ют читать и выпол­нять фай­лы. В этой статье мы с самого начала рас­смот­рим, как они работа­ют, и научим­ся их экс­плу­ати­ровать в рам­ках лабора­тор­ных работ, а потом пос­мотрим на недав­ний при­мер — уже совер­шенно реаль­ный. info

Эта статья ори­енти­рова­на в пер­вую оче­редь на нович­ков и рас­ска­зыва­ет о двух прос­тей­ших уяз­вимос­тях. Если этот уро­вень для тебя слиш­ком лег­кий, не спе­ши ухо­дить — про­лис­тай до раз­бора бага в Bazarr в кон­це статьи.

 

Включение файлов (File Inclusion)

Вклю­чение фай­лов (File Inclusion) — это тип уяз­вимос­ти, который воз­ника­ет, ког­да веб‑при­ложе­ние поз­воля­ет поль­зовате­лю заг­ружать и исполнять фай­лы. Такие уяз­вимос­ти осо­бен­но опас­ны, так как дают зло­умыш­ленни­ку воз­можность выпол­нить про­изволь­ный код на сер­вере.

Под вклю­чени­ем фай­лов обыч­но под­разуме­вают под­клю­чение внеш­них биб­лиотек или модулей (на англий­ском эта дирек­тива обыч­но называ­ется include — «вклю­чать»). В раз­ных язы­ках прог­рамми­рова­ния этот механизм реали­зован нем­ного по‑раз­ному. В этой статье мы будем рас­смат­ривать в основном при­меры на PHP, поэто­му давай под­робно раз­берем реали­зацию в этом язы­ке.

Вот что дела­ет интер­пре­татор PHP, ког­да находит дирек­тиву include:

  • Ищет файл в фай­ловой сис­теме: либо ука­зан­ный файл дол­жен най­тись в том же катало­ге, что и основная прог­рамма, либо каталог с под­клю­чаемым модулем дол­жен быть перечис­лен в перемен­ной окру­жения PATH.
  • Чи­тает файл: PHP счи­тыва­ет содер­жимое фай­ла. Обыч­но это HTML, CSS, JavaScript или код на PHP.
  • Вклю­чение: PHP берет содер­жимое фай­ла и бук­валь­но помеща­ет его в текущий скрипт пря­мо в том мес­те, где находит­ся опе­ратор вклю­чения.
  • Вы­пол­нение кода: как толь­ко код из вклю­чен­ного фай­ла будет помещен на мес­то, PHP про­дол­жит обра­бот­ку сце­нария, как если бы весь этот код был изна­чаль­но в том же фай­ле.

 

Типы включения файлов

Ло­каль­ное вклю­чение фай­лов (Local File Inclusion, LFI) про­исхо­дит, ког­да при­ложе­ние заг­ружа­ет фай­лы с сер­вера, при этом в про­цес­се выбора фай­ла исполь­зуют­ся дан­ные, которые ввел поль­зователь.

Эту уяз­вимость мож­но исполь­зовать для дос­тупа к кон­фиден­циаль­ной информа­ции — нап­ример, мож­но зап­росить файл с нас­трой­ками или с пароля­ми. А еще таким обра­зом мож­но запус­тить раз­мещен­ный на сер­вере скрипт.

Да­вай раз­берем прос­тей­ший при­мер:

<?php$file = $_GET['file'];include($file);?>

Здесь зло­умыш­ленник может передать в парамет­ре file путь к любому фай­лу на сер­вере, нап­ример:

http://xakep.loc/index.php?file=/etc/passwd

Это при­ведет к вклю­чению содер­жимого фай­ла /etc/passwd в ответ, который отоб­разит­ся в бра­узе­ре.

Даль­ше для демонс­тра­ции уяз­вимос­ти я буду исполь­зовать DVWA — «чер­тов­ски уяз­вимое веб‑при­ложе­ние». Это написан­ный на PHP тре­ниро­воч­ный стенд с раз­ными видами уяз­вимос­тей. Ска­чива­ем его:

sudo bash -c "$(curl --fail --show-error --silent --location https://raw.githubusercontent.com/IamCarron/DVWA-Script/main/Install-DVWA.sh)" 

DVWA Level Low

Спер­ва нам нуж­но выб­рать уро­вень, для это­го заходим в DVWA Security, выбира­ем там Low и нажима­ем Submit. Затем нажима­ем File Inclusion.

На­вер­ху перечис­лены фай­лы: file1.php, file2.php, file3.php. Если клик­нуть на какой‑то из них, он откро­ется, и адрес стра­ницы будет таким: {url}/?page=file1.php.

Ес­ли нажать на кноп­ку View Source вни­зу спра­ва, то откро­ется исходный код при­ложе­ния.

По­чему здесь нет include? Исходник, который мы видим, при­нима­ет имя фай­ла через URL, и в коде при­ложе­ния оно добав­ляет­ся как параметр для include, выг­лядит это так:

file: vulnerabilities/fi/index.php:if( isset( $file ) ) include( $file );else { header( 'Location:?page=include.php' ); exit;}

Уяз­вимость здесь в том, что в качес­тве име­ни фай­ла без вся­кой про­вер­ки берет­ся передан­ный бра­узе­ром параметр. Мы можем впи­сать в page наз­вание дру­гого фай­ла на сер­вере и таким обра­зом пос­мотреть его содер­жимое.

http://xakep.loc/DVWA/vulnerabilities/fi/?page=/etc/passwd

Прав­да, в реаль­ной жиз­ни дело поч­ти никог­да не в чте­нии /etc/passwd — фай­ла со спис­ком поль­зовате­лей ОС на веб‑сер­вере. Чаще все­го раз­вити­ем ата­ки ста­новит­ся либо RCE (уда­лен­ное выпол­нение кода на сер­вере), либо получе­ние дру­гих чувс­тви­тель­ных дан­ных, хра­нящих­ся на сер­вере. Это могут быть бэкапы, кон­фиги и про­чее. Нап­ример, в DVWA есть файл database/sqli.db.dist с дан­ными поль­зовате­лей.

 

Как узнать, где какие файлы? Как получить RCE?

Боль­шую помощь нам ока­жут филь­тры PHP. В этом язы­ке так называ­ются обра­бот­чики потоков дан­ных. Они поз­воля­ют читать, записы­вать и пре­обра­зовы­вать информа­цию.

Обер­тки потоков (wrappers) — это набор про­токо­лов, которые PHP исполь­зует для обра­бот­ки дан­ных из раз­ных источни­ков и хра­нилищ. Эти обер­тки опре­деля­ют, как дан­ные будут дос­тупны и как с ними вза­имо­дей­ство­вать. При­меры обер­ток:

  • file://: — дает дос­туп к фай­лам на локаль­ной фай­ловой сис­теме;
  • data://: — поз­воля­ет PHP обра­баты­вать дан­ные, закоди­рован­ные непос­редс­твен­но в URL. Под­держи­вает нес­коль­ко схем:
    • data://text/plain — поз­воля­ет вклю­чать дан­ные в тек­сто­вом фор­мате;
    • data://image/png;base64 — поз­воля­ет вклю­чать дан­ные изоб­ражения в фор­мате Base64;
  • php://: — дает дос­туп к внут­ренним потокам PHP. Име­ет нес­коль­ко схем, но нас инте­ресу­ет толь­ко одна:
    • php://filter — поз­воля­ет при­менять филь­тры к потоку дан­ных. Филь­тры могут исполь­зовать­ся для пре­обра­зова­ния дан­ных по мере их чте­ния или записи для кодиро­вания, декоди­рова­ния, сжа­тия или рас­паков­ки.

По­пуляр­ные филь­тры:

  • convert.base64-encode — кодиру­ет дан­ные в Base64;
  • convert.base64-decode — декоди­рует дан­ные, закоди­рован­ные в Base64;
  • string.rot13 — при­меня­ет к дан­ным кодиров­ку ROT13.

Пос­ле филь­тра дол­жен быть ука­зан resource — источник, к которо­му будет при­менять­ся дей­ствие.

Вот для при­мера самый прос­той филь­тр:

http://xakep.loc/DVWA/vulnerabilities/fi/?page=file:///etc/passwd

Здесь в парамет­ре page ука­зано file:///etc/passwd, что зас­тавля­ет сер­вер обра­баты­вать зна­чение как абсо­лют­ный путь к фай­лу на локаль­ной фай­ловой сис­теме.

Пе­рей­дем к более инте­рес­ному филь­тру — data://. Внут­ри него мы можем написать код, который будет исполнен. Давай напишем однос­троч­ник, показы­вающий вывод фун­кции phpinfo. Это поможет узнать нас­трой­ки интер­пре­тато­ра PHP, который работа­ет на сер­вере.

Мо­жем отпра­вить вот такой зап­рос:

http://xakep.loc/DVWA/vulnerabilities/fi/?page=data:text/plain,<?php phpinfo(); ?>

В ответ мы дол­жны получить резуль­тат выпол­нения кода на PHP — как на скрин­шоте.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *