Ssrf
SSRF(Server-Side Request Forgery) - это возможность передавать url, по которому впоследствии перейдет уязвимый сервер.
Статья разделена на поиск уязвимого параметра для передачи URL и уже непосредственно эксплуатацию.
Содержание
Поиск
Данная тема может появляться в разных тематиках и обозначаться разными ключевыми словами.
Прокси
Самое типичное - возможность использования скрипта как веб-прокси.
Если вы анализируете непосредственно HTTP запросы, то может быть следующее:
POST /proxy.php HTTP/1.1 Host: coolserver.com url=http://ipwnedyourscript.org
Скачивание файлов
Всем известный пример - скачивание аватарки по http без проверки типа файла.
Но так же это происходит и при скачивании файлов любых форматов:
Иногда это может перейти в другие уязвимости, например File Upload + LFI = RCE (или сразу shell upload). О них вы можете почитать в соответствующих статьях.
Данный случай рассматривается ТОЛЬКО в случае наличия фильтрации, не позволяющий запуск произвольного кода.
Эксплуатация
(что требуется для эксплуатации - что не должно фильтроваться)
Помощь при эксплуатации
Есть два случая - с автоматически приписывающемся префиксом и соответственно с изначальным его отсутствием.
Если у вас приписывается автоматически и вы знаете какой, то переходите в соответствующую вкладку префикса далее. Иначе пройдитесь по всем вкладкам и посмотрите, что может подойти именно к вашему скоупу.
Префикс http(s)
Разделим на возможности
1. Возможность получить сервер, доступ к которому есть только в локальной сети/для whitelist ip адресов
GET /proxy.php?url=(http://)whitelisted.com Host: cooolserver.com
2. Возможность направить прокси на наш сниффер и получить скрытые заголовки (в них иногда может спрятаться флаг или информация о сервере).
GET /proxy.php?url=192.168.1.1 HTTP/1.1 Host: cooolserver.com
3. Сканирование доступных портов
Сделать это удобнее всего с помощью burpsuite intruder:
Или реализовать скрипт/вручную, отсылая следующие строки по socket'ам:
HTTP:
GET /proxy.php?url=127.0.0.1:(1..65535) HTTP/1.1 Host: cooolserver.com
Python:
import requests
for x in range(1,65536):
r = requests.get( 'http://cooolserver.com/proxy.php?url=127.0.0.1:'+str(x) )
if r.text != '':print(x)
Perl
C/C++
Ruby
Префикс file
(обьяснение с примером)
Префикс tftp
(обьяснение с примером)
Префикс gopher
(обьяснение с примером)
Префикс dict
(обьяснение с примером)
Префикс rtsp
(обьяснение с примером)
(добавь еще префиксов)
Вектора атак
Чтение локальных файлов
(перечисляешь способы)
Скачивание файлов
(перечисляешь способы - не знаю точно возможен ли данный вектор)
Подключение к сервисам за фаерволом
(перечисляешь способы)
Сканирование портов
(перечисляешь способы + скрипты реализации)
Особенности ПО
Curl
(что поддерживает)
Requests
(что поддерживает)
(добавь свое - например робобраузеры)
Примеры из тасков
(примеры использования каких то векторов)
Райтапы
(ссылки)
Полезные ссылки
(ссылки)