# SSRF
## Материал для самостоятельного изучения
Содержание:
1. Описание уязвимости
2. Примеры уязвимого кода
3. Примеры атак и уязвимых приложений
### Описание уязвимости
Уязвимость получившая свой собственный идентификатор в OWASP Top 10 2021 - A10. Появляется в приложении, когда приходится получать доступ к ресурсу или объекту через идентификацию по URL. При неверной валидации может быть использована злоумышленником для подделки запросов и получения данных, которые находятся во внутренних для приложения ресурсах.
### Примеры уязвимого кода
nodeJS
```javascript
const express = require('express');
const router = express.Router()
const request = require('request');
router.post('/downlad-url', (req, res) => {
downloadURL(req.body.url, () =>{
res.send('Done')
})
});
const downloadURL = (url, onend) => {
const opts = {
uri: url,
method: 'GET',
followAllRedirects: true
}
request(opts)
.on('data', ()=>{})
.on('end', () => onend())
.on('error', (err) => console.log(err, 'controller.url.download.error'))
}
module.exports = router
```
Java

php
```php
<?php
if(isset($_GET['r'])) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['r']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
}
```
Приложения для митигации подоюных уязвимостей должны быть защищены сразу на нескольких уровнях. В первую очередь на уровне веб сервера, а уже затем на уровне приложения.
Сетевые ограничения:
- выведение сервера в отдельную сеть
- применение политики файрволла, которая не дает обращаться из сети интернет на
Ограничения в самом приложении:
- нормализация и обработка входных параметров от пользователя
- стандартизация формата URL и создание белых списков для доступа к URL
- отключение переадресации
- проверка списка белых адресов - нельзя доверять DNS, если только ресурс не принадлежит вам
### Примеры атак и уязвимых приложений
При поиске уязвимости злоумышленник в первую очередь постарается идентифицировать те части приложения, которые используются для обработки URL как параметра. Это параметр будет заменяться на доступ к локальным портам сервера и его локальным сетевым интерфейсам. В редких случаях может осуществляться доступ к хранилищам метаданных - эти хранилиза популярны для управления облачными инфаструктурами (AWS, Yandex, Alibaba).
Приложения будем исследовать на платформе portSwigger Academy.
#### Уязвимое приложение: https://portswigger.net/web-security/ssrf/lab-basic-ssrf-against-localhost
Идентифицируем уязвимый параметр. Это могут быть служебные заголовки веб сервера или параметры запроса. Для поиска информации воспользуемся функцией `Engagment Tools->Search`. Для конфигурации поиска нужно последовательно просмотреть данные в заголовках и теле запроса клиента.

Для первоначального теста используем данные:
- 127.0.0.1
- localhost

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

#### Уязвимое приложение: https://portswigger.net/web-security/ssrf/lab-basic-ssrf-against-backend-system
Приложение будет анализироваться аналогичным способом. Единственное отличие этого теста заключается в том, что для атаки будет использоваться не доступ к loopback интерфейсу, а доступ к локальной сети и, если повезет, к другому серверу. Для этого уявзимый параметр запроса нужно перебрать с помощью `Intruder`:

А затем настроить диапазон значений для использования:

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

#### Уязвимое приложение: https://portswigger.net/web-security/ssrf/lab-ssrf-with-blacklist-filter
Приложение содержит механизм, который уже долгое время стараются отладить на уровне приложений, библиотек и фреймворков. Пока что не удалось и поэтому можно обманывать приложения предоставляя данные, которые по определению символом являются валидными URL, но содержат конструкции, которые алгоритмы могут по-разному воспринимать.
Для получения примеров тестовых данных можно обратиться к разделу `Полезные ссылки`.
Будем использовать следующий тестовый набор данных - `http://127.1/%41dmin`:

В результате мы можем видеть корректную работу запроса:

Автоматизация поиска может быть произведена через плагин для burp - Collaborator Everywhere. Для его использования необходимо объявлять scope. Иначе данные не начинают поступать во все возможные параметры.
Плагин самостоятельно проставляет данные для заголовков, параметров URL. Для каждого места инйекции используется уникальный URL, который генерируется автоматически через Burp Collaborator.
Попробуем автоматизировать процесс поиска уязвимости через плагин. Для этого нужно пройти на уязвимое приложение и выполнить конфигурацию scope:

После этого поиск узвимости будет проводить автоматически. Полученные данные можно отследивать либо на вкладке `Target`, либо на вкладке `Dashboard` в разделе `Issues`.

### Полезные ссылки
- https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html
- https://www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf
- https://cheatsheetseries.owasp.org/assets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet_SSRF_Bible.pdf
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery
# XXE
Содержание:
1. Описание уязвимости
2. Примеры уязвимого кода
3. Примеры атак и уязвимых приложений
### Описание уязвимости
Уязвимость может возникать в приложении при недостаточной настройке парсера формата XML. Уязвимость располагается в A05:2021 Owasp TOP 10.
### Примеры уязвимого кода
C# - на самом деле уязвимость будет работать или нет зависит от версии .Net. Нужно использовать одну из самых последних, либо отключать DTD на уровне исходников.
```C#
using Microsoft.AspNetCore.Mvc;
using System;
using System.Xml;
namespace WebFox.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class XxeTest1 : ControllerBase
{
[HttpGet("{xmlString}")]
public void DoXxe(String xmlString)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
}
}
}
```
nodeJS
```javascript
const express = require('express')
const libxmljs = require('libxml')
const db = require('db');
const router = express.Router()
router.post('/upload-products', (req, res) => {
const XMLfile = req.files.products.data;
const products = libxmljs.parseXmlString(XMLfile, {noent:true,noblanks:true})
products.root().childNodes().forEach(product => {
let newProduct = new db.Product()
newProduct.name = product.childNodes()[0].text()
newProduct.description = product.childNodes()[3].text()
newProduct.save()
});
res.send('Thanks')
})
module.exports = router
```
php
```php
<?php
require_once('../_helpers/strip.php');
libxml_disable_entity_loader (false);
$xml = strlen($_GET['xml']) > 0 ? $_GET['xml'] : '<root><content>No XML found</content></root>';
$document = new DOMDocument();
$document->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD);
$parsedDocument = simplexml_import_dom($document);
echo $parsedDocument->content;
```
### Примеры атак и уязвимых приложений
Поиск уязвимости со стороны атакующего может быть осуществлен, если был идентифицирован запрос, который имеет формат SOAP или XML.
#### Уязвимое приложение: https://portswigger.net/web-security/xxe/lab-exploiting-xxe-to-retrieve-files
В приложении запрос очень просто идентифицировать. Попробуем добавить стандартных тестовых данных.

Есть положительный ответ от сервера, теперь можно использовать данные для дальнейшего исследования системы или проведения атаки SSRF.
#### Уязвимое приложение: https://portswigger.net/web-security/xxe/lab-exploiting-xxe-to-perform-ssrf
Так как XML дает возможность использовать удаленные ресурсы для получения данных для включения в документ, поэтому атака будет выглядеть вот так:

Для получения данных здесь используется облачное хранилище метаданных.
#### Уязвимое приложение:https://portswigger.net/web-security/xxe/blind/lab-xxe-with-out-of-band-interaction
Иногда может не получиться достать данные на интерфейс приложения. В этом случае можно пробовать получать данные через вторичные каналы связи. В этом задании можно сгенерировать новый URL в burp Collabolator и ждать запроса от приложения.

::: warning
Адекватной автоматизации для уязвимости нет, так как каждый раз нужно подбирать наименования данных, которые используются для атаки.
:::
### Полезные ссылки
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20Injection
- https://owasp.org/Top10/A05_2021-Security_Misconfiguration/#references