---
# System prepended metadata

title: Web App Pentest - 0x08 Broken Access Control / SSTI / Race Condition
tags: [CSR - Web App Pentest]

---

---
title: Web App Pentest - 0x08 Broken Access Control / SSTI / Race Condition
tags: CSR - Web App Pentest
slideOptions:
  transition: 'fade'
  parallaxBackgroundImage: 'https://i.imgur.com/YClZ1aY.jpg'
---

<style>
.reveal {
  font-size: 36px;
}
</style>

# Web App Pentest 

## Broken Access Control
## SSTI
## Race Condition

---

Вопросы по заданиям?

---

## OWASP A01:2021-Broken Access Control 

Действия, разрешенные аутентифицированным пользователям, зачастую некорректно контролируются. Злоумышленники могут воспользоваться этими недостатками и получить несанкционированный доступ к учетным записям других пользователей или конфиденциальной информации, а также изменить пользовательские данные или права доступа.

---

## Определения

Идентификация — процесс определения, что за человек перед нами. 

Аутентификация — процесс подтверждения, что этот человек именно тот, за кого себя выдает. 

Авторизация — процесс принятия решения о том, что именно этой аутентифицированной персоне разрешается делать.

---

## Разграничение доступа в веб-приложениях

Можно выделить два уровня разграничения доступа:

* на функциональном уровне (обычно используется ролевая модель разграничения);
* на уровне объектов (обычно используется избирательная модель доступа);

---

## Разграничение доступа на функциональном уровне

system-admin:
* /admin/create-user
* /admin/delete-user

manager:
* /manager/create-company
* /manager/assign-user-to-company

user:
* /user/create-comment
* /user/send-message-to-manager

---

## Разграничение доступа на уровне объектов

Пример - система ДБО.

У пользователя есть несколько карт.

Для оплаты счета пользователь вызывает метод 
`/makePayment`, передавая ему одним из параметров `card_id`

Веб-приложение должно проверять что этот конкретный пользователь может пользоваться этой конкретной картой.

---

## Broken Access Control

Собирательная уязвимость, основными двумя частями которой являются:

* Missing Functional Level Access Control (MFLAC)
* Insecure Direct Object Reference (IDOR)

---

## IDOR

Базовый пример:

http://example.com/profile?userId=543

А почему бы не попробовать 

http://example.com/profile?userId=544 ?

---

## Примеры

bWAPP
* IDOR: Change Secret
* IDOR: Order Tickets


---

## MFLAC

system-admin:
* /admin/create-user
* /admin/delete-user

manager:
* /manager/create-company
* /manager/assign-user-to-company

user:
* /user/create-comment
* /user/send-message-to-manager

---

## MFLAC

А доступны ли пользователю с определенной ролью функции, которые ему не должны быть доступны.

---

## Тестирование на BAC

Плагин для Firefox `Multi-Account Containers`

Позволяет иметь рядом в браузере вкладки, аутентифицированные под разными пользователями.

<Демонстрация>

---

## Задание

Спецификация для приложения

https://hackmd.io/Z6V2jfp8T0Kf_zUAh6iUbg

---

## Поиск входных точек

Если кода нет, у нас ограниченная учетка, но мы предполагаем что MFLAC может иметь место, то нам нужно найти корректные имена URL или параметров.

* Можно анализировать javascript
* Словари для подбора:
https://github.com/assetnote/kiterunner
https://github.com/chrislockard/api_wordlist
https://github.com/sorokinpf/ApiWordlistGenerator

---

## Реализация и рекомендации

Разграничение доступа на функциональном уровне можно сделать с помощью фреймворков.

Для реализации разграничения доступа на уровне объектов необходимо делать проверку в каждой функции.

<Демонстрация кода>


---

## Рекомендации

* Реализовать контроль доступа единообразно во всем веб-приложении
* Использовать непредсказуемые идентификаторы объектов
* Для защиты от IDOR рекомендуется писать тесты пытающиеся получить доступ к чужим данным.

---

## SSTI

---

## Шалблоны HTML-страниц

Шаблоны используются разработчиками для создания HTML-страниц.

Разработчики единожды делают шаблон, потом в определенные его места подставляются необходимые данные и шаблон передается пользователю.

---

## Шаблоны HTML-страниц

Существует значительное количество различных шаблонизаторов для разных языков/фреймворков.

---

## Шаблоны HTML-страниц

Шаблоны реализуют свой собственный язык.

Язык шаблонов может позволять выполнять не только вывод информации, но и её обработку, фильтрацию, итерирование по спискам и т.д.

В некоторых языках шаблонов существует возможность выполнения опасных операций.

---

## Шаблоны HTML-страниц

Примеры:
* jinja2 (BAC)
* TWIG (https://github.com/marvin/php-twig-example/blob/master/index.php) 
* Razor (https://docs.microsoft.com/ru-ru/aspnet/core/razor-pages/?view=aspnetcore-3.0&tabs=visual-studio#the-home-page)


---

## SSTI

---

## Server Side Template Injection

Уязвимость, при эксплуатации которой данные атакующего внедряются в шаблон перед его рендером, что приводит к возможности использования любых функций шаблонизатора.

---

## Server Side Template Injection

Возможности атакующего зависят от шаблонизатора:
* выполнение произвольного кода
* чтение локальных файлов
* доступ к переменным в доступной зоне видимости

---

## Server Side Template Injection

Portswigger Academy:

https://portswigger.net/web-security/server-side-template-injection 

---

## Server Side Template Injection

Готовые вектора в некоторых шаблонизаторах есть на PayloadAllTheThings

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection 

---

## Server Side Template Injection

tplmap - приложение для автоматизированной эксплуатации уязвимостей SSTI.

https://github.com/epinna/tplmap 

---

## Server Side Template Injection

Если вектора нет в PayloadAllTheThings и нагуглить не удается, то надо браться за документацию.

---

## Server Side Template Injection

Примеры:
```
docker run -p 8083:80 -d cth123123/twig_ssti
```
https://github.com/BlackFan/ctfs/tree/master/volgactf_2020_quals/newsletter 

Portswigger - 1 пример

---

## Упражнение

Portswigger 2 и 4.

---

## Race condition

---

## Race condition

### Состояние гонки

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

---

## Race condition

Пример с переводом денег

---

![](https://i.imgur.com/whwxEYu.png =430x)

---

![](https://i.imgur.com/uTYyFxf.png =850x)

---

![](https://i.imgur.com/uMQ8CU9.png =850x)

---

![](https://i.imgur.com/ST5JMqc.png =850x)


---

![](https://i.imgur.com/CHCtWvC.png =850x)

---

![](https://i.imgur.com/SlMXzcK.png =850x)

---

![](https://i.imgur.com/KKdD4ye.png =850x)

---

![](https://i.imgur.com/cYkK5Ff.png =850x)

---

## Race condition

Способ защиты - синхронизация. Один поток "захватывает" (acquire) объект синхронизации. Пока он не "отпущен" (release), другие потоки не могут обращаться к защищаемым ресурсам.

---

## Race condition

Синхронизация может быть выполнена:
- программно;
- на уровне сессий;
- на уровне БД;

---

## Race condition

Синхронизация на уровне БД.

Используются транзакции и конструкции `FOR SHARE`, `FOR UPDATE` и другие .

---

## Race condition

Встречается также в других случаях, например, при проверке одноразовых паролей OTP.

---

## Race condition

Для одновременной отправки запросов можно также использовать плагин Burp `Turbo Intruder`: 

https://portswigger.net/research/turbo-intruder-embracing-the-billion-request-attack

Скрипт:
https://github.com/PortSwigger/turbo-intruder/blob/master/resources/examples/race.py

---

## Race condition

Пример реальной накрутки бонусов в Starbucks:
https://habr.com/ru/post/258449/

---

## Race condition

Также возникают в случаях с файлами. Файл на ФС находится не долго и атакующему нужно успеть к нему обратится.

Актуально для File Upload/LFI.

---

## Задания

- Burp Academy: Horizontal Privilege Escalation
https://portswigger.net/web-security/access-control 
- на CTFd (http://ttesting.ru:8080)
- тест для самопроверки в LMS.

---

