DedSec Project

Παραμετροποίηση SQL — DedSec Project

Παράμετροι SQL — ξεχωρίζουμε τη δομή ερωτήματος από τις τιμές Το πραγματικό πρόβλημα Ένας χρήστης αναζητά τοπικές σημειώσεις με βάση τον τίτλο. Το κείμενο αναζήτησης πρέπει να…

Παράμετροι SQL — ξεχωρίζουμε τη δομή ερωτήματος από τις τιμές

Το πραγματικό πρόβλημα

Ένας χρήστης αναζητά τοπικές σημειώσεις με βάση τον τίτλο. Το κείμενο αναζήτησης πρέπει να αντιμετωπίζεται αποκλειστικά ως δεδομένο, όχι ως κομμάτι της σύνταξης SQL. Ακόμη και ένας συνηθισμένος τίτλος με απόστροφο μπορεί να χαλάσει ένα ερώτημα που δημιουργείται με συγκόλληση κειμένου. Κατάλληλη συμβολοσειρά μπορεί να αλλάξει τη συνθήκη αναζήτησης. Οι παράμετροι διατηρούν σταθερή τη σύνταξη του ερωτήματος και παρέχουν τις τιμές χωριστά. Η επικίνδυνη σύγκριση του παραδείγματος γίνεται μόνο σε προσωρινή βάση SQLite στη μνήμη.

Εκτελέσιμο πείραμα Python 3

Αποθήκευσε ως sqlite_parameters_lab.py και εκτέλεσε python3 sqlite_parameters_lab.py. Οι δύο δοκιμαστικές σημειώσεις είναι τεχνητές και ο κώδικας εκτελεί μόνο SELECT.

import sqlite3
db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE notes (id INTEGER PRIMARY KEY, title TEXT NOT NULL)")
db.executemany("INSERT INTO notes(title) VALUES (?)",
               [("alpha",), ("beta",)])
probe = "alpha' OR 1=1 --"
count = db.execute(
    "SELECT COUNT(*) FROM notes WHERE title = ?", (probe,)
).fetchone()[0]
assert count == 0
# Demonstration ONLY: never compose application SQL like this.
insecure_sql = "SELECT COUNT(*) FROM notes WHERE title = '" + probe + "'"
assert db.execute(insecure_sql).fetchone()[0] == 2
assert db.execute(
    "SELECT title FROM notes WHERE title = ?", ("alpha",)
).fetchone()[0] == "alpha"
print("PASS: literal parameter vs vulnerable concatenation")

Γιατί οι παράμετροι λειτουργούν

Στο SELECT ... WHERE title = ? ολόκληρη η δοκιμαστική συμβολοσειρά αντιμετωπίζεται ως τίτλος και δεν βρίσκει καμία εγγραφή. Η ανασφαλής συγκόλληση ενσωματώνει το ίδιο κείμενο στη γραμματική της SQL, αλλάζει τη συνθήκη WHERE και εμφανίζει και τις δύο εγγραφές. Η σωστή δέσμευση χειρίζεται επίσης ελληνικούς χαρακτήρες και αποστρόφους χωρίς χειροκίνητη διαφυγή. Οι παράμετροι δεν χρησιμοποιούνται στη θέση ονομάτων πινάκων ή στηλών ORDER BY· αυτά πρέπει να επιλέγονται από συγκεκριμένη λίστα επιτρεπόμενων αναγνωριστικών. Ακόμη και σωστά παραμετροποιημένο ερώτημα χρειάζεται ελέγχους δικαιωμάτων.

Ασκήσεις και διάγνωση

  1. Αναζήτησε απλό τίτλο και ελληνικό τίτλο που περιέχει απόστροφο. Η παραμετροποίηση πρέπει να τους διαχειρίζεται ως τιμές.
  2. Μόνο στη δοκιμαστική βάση άλλαξε προσωρινά την ασφαλή κλήση σε συγκόλληση κειμένου και κατέγραψε τη διαφορετική συμπεριφορά.
  3. Προσπάθησε να χρησιμοποιήσεις παράμετρο ως όνομα πίνακα. Εξήγησε τη διαφορά αναγνωριστικού και τιμής και φτιάξε επιλογέα με δύο μόνο επιτρεπόμενες στήλες.
  4. Δείξε γιατί ένα παραμετροποιημένο UPDATE χρειάζεται και σωστό WHERE και δικαίωμα μεταβολής. Η αποφυγή εισαγωγής σύνταξης δεν εξασφαλίζει εξουσιοδότηση.

Παραδοτέα: PASS, αποτελέσματα ασφαλούς και ανασφαλούς δοκιμής, επιτρεπόμενα αναγνωριστικά και όρια δικαιωμάτων.