Έλεγχος εισόδου, μυστικά και ελάχιστα δικαιώματα — DedSec Project
Ασφάλεια εισόδου — αποτροπή διαφυγής από αρχεία και σωστή HTML Σενάριο και κριτήρια επιτυχίας Κατά την προεπισκόπηση ενός συμπιεσμένου αρχείου επιτρέπονται μόνο σχετικές διαδρομές POSIX με…
Ασφάλεια εισόδου — αποτροπή διαφυγής από αρχεία και σωστή HTML
Σενάριο και κριτήρια επιτυχίας
Κατά την προεπισκόπηση ενός συμπιεσμένου αρχείου επιτρέπονται μόνο σχετικές διαδρομές POSIX με κανονικά, μη κενά τμήματα. Απορρίπτονται απόλυτες διαδρομές, ανάβαση σε γονικό κατάλογο, ανάστροφες κάθετοι, σύνταξη μονάδας δίσκου και αμφίσημα κενά ή τελείες. Ξεχωριστά, αν εμφανίζεις κείμενο χρήστη ως περιεχόμενο HTML, πρέπει να κάνεις κατάλληλη κωδικοποίηση εξόδου. Πρόκειται για δύο διαφορετικούς ελέγχους.
Εκτελέσιμο εργαστήριο
Αποθήκευσε ως 14_security.py και εκτέλεσε με Python 3 και την ενσωματωμένη βιβλιοθήκη. Τα δεδομένα είναι τεχνητά, χωρίς πρόσβαση σε προσωπικά αρχεία ή δίκτυο.
from pathlib import PurePosixPath
from html import escape
def safe_member(name):
if not isinstance(name, str) or not name or "\\ " in name:
raise ValueError("invalid member")
if "\\" in name or ":" in name or name.startswith("/"):
raise ValueError("nonportable or absolute path")
parts = name.split("/")
if any(part in ("", ".", "..") for part in parts):
raise ValueError("unsafe component")
result = PurePosixPath(name)
if result.is_absolute():
raise ValueError("absolute path")
return result
assert str(safe_member("docs/ελληνικά.md")) == "docs/ελληνικά.md"
assert escape('<script>alert(1)</script>') == '<script>alert(1)</script>'
for bad in ("../secret", "docs/../../x", "/etc/passwd",
"C:\\Users\\item", "docs//x", "docs/./x"):
try: safe_member(bad)
except ValueError: pass
else: raise AssertionError("unsafe archive path accepted")
print("PASS archive-path and HTML context boundaries")
Τεχνική ερμηνεία
Η PurePosixPath κανονικοποιεί ορισμένα τμήματα, επομένως πρώτα ελέγχουμε το αρχικό κείμενο και μετά δημιουργούμε αντικείμενο διαδρομής. Ένας λεξικός έλεγχος δεν αρκεί για πλήρως ασφαλή εξαγωγή: πραγματικά εργαλεία πρέπει να ελέγχουν συμβολικούς και σκληρούς συνδέσμους, τη δημιουργία καταλόγων, ταυτόχρονες αλλαγές και όρια πλήθους και μεγέθους. Η html.escape είναι χρήσιμη για κείμενο HTML, όχι για σύνταξη SQL, εντολές κελύφους ή συμβολοσειρές JavaScript.
Περιορισμένες δοκιμές
Δοκίμασε όλες τις ύποπτες διαδρομές και βεβαιώσου ότι επιτρέπεται το έγκυρο ελληνικό όνομα. Πρόσθεσε ποσοστιαία κωδικοποιημένα τμήματα και όρισε αν η αποκωδικοποίηση γίνεται πριν τον έλεγχο. Σύγκρινε εισαγωγή κειμένου σε στοιχείο HTML με εισαγωγή μέσα σε κώδικα JavaScript. Επέκτεινε την ανάλυση σε συμπιεσμένα αρχεία με τεράστια τελική ανάπτυξη.
Διάγνωση
Αν μία διαδρομή φαίνεται ασφαλής μετά την κανονικοποίηση αλλά απορρίπτεται, εξέτασε πρώτα την αρχική μορφή. Μην αφαιρείς σιωπηλά τμήματα ../ γιατί μπορούν να δημιουργηθούν επικαλύψεις ονομάτων. Για κάθε διαφορετικό προορισμό εξόδου χρειάζεται δική του πολιτική κωδικοποίησης.