Логотип DVWA
Вступ
У цій статті ми розглянемо задачу включення файлів (File Inclusion) в DVWA та пройдемо всі рівні безпеки. Крок за кроком ми вирішимо кожен рівень, вивчимо захист, що використовується, і зрозуміємо, як його обійти.
Що таке включення файлів?
Включення файлів — це вразливість, при якій додаток дозволяє користувачам вибирати, які файли завантажувати. Якщо це не забезпечено належним чином, хакери можуть використати це для завантаження чутливих файлів або навіть виконання шкідливого коду.
Аналіз вихідного коду з низьким рівнем безпеки
Вихідний код з низьким рівнем безпеки
Код отримує значення з параметра сторінки в URL за допомогою методу GET і присвоює його змінній $file, яка потім завантажується та відображається на веб-сторінці. Відсутність перевірки або санітизації робить це вразливим до атак включення файлів.
Ця вразливість дозволяє атакуючому вказати будь-який файл на сервері, маніпулюючи параметром сторінки в URL. Оскільки введення не перевіряється належним чином, атакуючий може контролювати, який файл буде завантажений, включаючи файли поза визначеним каталогом.
Наприклад, атакуючий може використовувати послідовність ../../../../../../ для підйому в структурі каталогів, виходячи за межі призначеного каталогу та отримуючи доступ до вищих рівнів директорій. Це може дозволити їм дістатися до чутливих файлів, таких як /etc/passwd.
Маніпулювання URL для доступу до файлу /etc/passwd
У цьому випадку ми залишаємо каталог /var/www/html, який зазвичай є кореневим каталогом веб-сервера, і переходимо до домашнього каталогу сервера. Звідти ми потрапляємо в каталог /etc і отримуємо доступ до файлу passwd, який містить чутливу інформацію про систему, використовуючи техніку подолання відносного шляху. Це приклад атаки Local File Inclusion (LFI), коли ми використовуємо вразливість для включення локальних файлів на сервері.
Як результат, вміст файлу /etc/passwd тепер відображається.
Перегляд вмісту файлу /etc/passwd
Тепер давайте розглянемо Remote File Inclusion (RFI). Ця вразливість дозволяє атакуючому включати файли з віддалених серверів, що може дозволити їм виконати шкідливий код.
Ми побачимо, як це можна використовувати в нашому випадку.
Спочатку ми створимо файли test і shell.php, як показано нижче.
Перегляд вмісту файлів test і shell.php
Нам потрібно відкрити простий HTTP сервер Python, щоб зробити файл доступним через мережу.
Запуск HTTP сервера за допомогою Python
Після запуску HTTP сервера Python, вставте http://192.168.44.171:8000/test в параметр URL сторінки, щоб відкрити вміст файлу test.
Доступ до файлу test через Python HTTP сервер
Це спрацювало, і вміст файлу тепер відображається.
Перегляд вмісту файлу test на машині жертви
GET запит для файлу test також відображається у консолі python -m http.server.
Перегляд отримання файлу test на Python HTTP сервері
Тепер ми протестуємо з файлом shell.php, який відкриває зворотний shell, підключаючи сервер до IP та порту атакуючого, дозволяючи віддалений контроль над сервером.
Ми введемо URL файлу shell.php в параметр сторінки, щоб активувати зворотний shell.
Доступ до shell.php через Python HTTP сервер
За допомогою команди nc ми можемо слухати вхідне з'єднання з зворотного shell і взаємодіяти з сервером віддалено.
Отримання shell через Netcat
Аналіз вихідного коду середнього рівня безпеки
Вихідний код середнього рівня безпеки
Після перегляду коду я помітив, що він використовує функцію str_replace для видалення http:// і https://, замінюючи їх на порожній рядок. Це дозволяє ефективно позбутися цих префіксів з будь-якого вводу. Аналогічно, ../ і ..\ також замінюються на порожній рядок.
Однак, якщо ми використовуємо …/./, то ../ в середині замінюється на порожній простір, і залишкові значення стискаються до ../, що дозволяє нам використовувати цей підхід для навігації.
..././ ---> ../
Отже, для атаки LFI ми будемо використовувати цей шлях
..././..././..././..././..././etc/passwd
Навігація до /etc/passwd в URL
Як бачите, це спрацювало відмінно, і нам вдалося отримати доступ до вмісту файлу /etc/passwd.
Перегляд вмісту файлу /test/passwd на машині жертви
Тепер давайте перейдемо до RFI.
Ми застосуємо ту саму техніку, вставивши http:// в URL, ось так hthttp://tp://, що безперешкодно перетворюється на http:// для обходу перевірки.
hthttp://tp:// ---> http://
Доступ до файлу test через Python HTTP сервер
Це спрацювало, як показано нижче, де ми чітко бачимо вміст файлу test.
Перегляд "This is an RFI Test" на машині жертви
Тепер давайте протестуємо з файлом shell.
Доступ до файлу shell через Python HTTP сервер
Як бачите, це також спрацювало, і ми успішно отримали shell.
Отримання shell на машині жертви
Аналіз вихідного коду високого рівня безпеки
Вихідний код високого рівня безпеки
Після перегляду коду я виявив, що він генерує помилку, якщо файл не починається з file і не є include.php.
Щоб вирішити це, ми використаємо протокол file://, який дозволяє нам читати локальні файли з системи замість веб-сервера.
Маніпулювання URL з file:// для відображення вмісту /etc/passwd
Для RFI це неможливо через реалізовані заходи безпеки, які ефективно запобігають будь-яким спробам.
Висновок
Ми пройшли через виклик File Inclusion крок за кроком, починаючи з простих проблем і поступово долаючи бар'єри безпеки, підкреслюючи процес експлуатації цих вразливостей.
Перекладено з: Exploring DVWA : A Walkthrough of The File Inclusion Challenge (Part 4)