String SQL Injection Σε πρώτη φάση θα προσπαθήσουμε να παραβιάσουμε ως απλοί επισκέπτες το σύστημα, εισχωρώντας στο σύστημα ως διαχειριστές, παραβιάζο

Σχετικά έγγραφα
ΟΝΟΜΑΤΕΠΩΝΥΜΟ : Αντικείμενα: Βάσεις δεδομένων, σχέσεις μεταξύ πινάκων, ερωτήματα, φόρμες και αναφορές.

Σχεδίαση Βάσεων Δεδομένων

databases linux - terminal (linux / windows terminal)

Διαδικτυακές Εφαρμογές Ενότητα 7: Προσπέλαση ΒΔ με το JDBC

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ.

SELECT DISTINCT EIDOS_EISERXOMENOY, COUNT (EIDOS_EISERXOMENOY) AS "Αριθµός" FROM TESTOTA.REGISTRY GROUP BY EIDOS_EISERXOMENOY ORDER BY "Αριθµός" DESC

Κεφάλαιο 5. Δημιουργία φορμών για τη βάση δεδομένων DVDclub

MySQL + Γλώσσα Προγραμματισμού. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

2 η Εργαστηριακή Άσκηση

Τμήμα Πληροφορικής ΑΠΘ

FROM TESTOTA.REGISTRY

(1) Επιλέξτε την εντολή QUERIES για να μπείτε στο περιβάλλον δημιουργίας

MathGame. Οδηγίες Χρήσης. Τα Μαθηµατικά γίνονται παιχνίδι.

ΤΑΞΙΝΟΜΗΣΗ ΑΠΟΤΕΛΕΣΜΑΤΩΝ ΕΡΩΤΗΜΑΤΟΣ

Οδηγίες εγκατάστασης και λειτουργίας ERPeshop

ΟΔΗΓΙΕΣ ΧΡΗΣΗΣ LIVETRIP TRAVELLER

ΟΔΗΓΟΣ ΧΡΗΣΗΣ(ΜΑΝUΑL) ΔΙΑΧΕΙΡΙΣΤΗ-ΧΡΗΣΤΗ.

ΗΥ-360 Αρχεία και Βάσεις Δεδομένων Διδάσκων: Δ. Πλεξουσάκης. Φροντιστήριο SQL Examples ΙΙ Ξένου Ρουμπίνη

Πίνακας περιεχομένων. Περιεχόμενα ΕΓΓΡΑΦΗ ΝΕΟΥ ΧΡΗΣΤΗ 1 ΣΥΝΔΕΣΗ ΧΡΗΣΤΗ 4 ΔΙΑΧΕΙΡΙΣΤΙΚΟ ΧΡΗΣΤΗ ΤΑ ΣΤΟΙΧΕΙΑ ΜΟΥ 5 ΝΕΑ ΑΙΤΗΣΗ 6

Οδηγίες για την Ηλεκτρονική Υποβολή των Δηλώσεων Φορολογικής

Οδηγίες αρθρογράφησης στην ιστοσελίδα του 2ου ΓΕΛ Καματερού

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι. Ενότητα 5: SQL (Απλή SELECT) Ευαγγελίδης Γεώργιος. Τμήμα Εφαρμοσμένης Πληροφορικής ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι

Ασφάλεια Υπολογιστών Και Δικτύων. Προσομοίωση επίθεσης σε ευπαθές σε SQL Injection σύστημα και απόκτηση κονσόλας διαχειριστή

Joomla! with K2 - User Guide

MySQL + Γλώσσα Προγραμματισμού. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

HomeWork. Οδηγίες Χρήσης. Ένας δάσκαλος στο σπίτι.

Διαδικτυακό Περιβάλλον Διαχείρισης Ασκήσεων Προγραμματισμού

1 / 97

Ιατρική Πληροφορική. Δρ. Π. ΑΣΒΕΣΤΑΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΒΙΟΪΑΤΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ Τ.Ε.

1 / 87

Σχεδιασμός Βάσεων Δεδομένων

1. Εγγραφή στην πλατφόρμα διαδικτυακής μάθησης

Ιατρική Πληροφορική. Δρ. Π. ΑΣΒΕΣΤΑΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΒΙΟΪΑΤΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ Τ. Ε. Χρήσιμοι Σύνδεσμοι

Οδηγίες - Ρυθμίσεις Λογαριασμού Μέλους

, Evaluation of a library against injection attacks

GROUP BY, HAVING, COUNT, MIN, MAX, SUM, AVG, ROLLUP.

Employee Self Service. Εγχειρίδιο Χρήσης Εργαζομένου - Βασικές Δυνατότητες

Employee Self Service. Εγχειρίδιο Χρήσης Εργαζομένου - Βασικές Δυνατότητες

Βάσεις Δεδομένων Προχωρημένα Ερωτήματα SQL

Ηλεκτρονικές Υπηρεσίες

Εγχειρίδιο Χρήσης Εφαρμογής Συστήματος Διαχείρισης Λογισμικού

Αφού δώσουμε όνομα χρήση και password μπορούμε να επιλέξουμε ημερομηνία εισόδου στο σύστημα, εταιρία και υποκατάστημα

ΕΡΩΤΗΜΑΤΟΛOΓΙΟ ΣΧΟΛΕIΟΥ: ΕΓΧΕΙΡIΔΙΟ ΔΙΕΥΘΥΝΤΉ/ΝΤΡΙΑΣ. Doc.: CY7_CBA_ScQPrincipalManual.docx. Δημιουργήθηκε από: ETS, Core Α Contractor

ΠΛΗΡΟΦΟΡΙΑΚΟ ΣΥΣΤΗΜΑ ΔΙΑΧΕΙΡΙΣΗΣ ΚΑΤΑΣΚΕΥΗΣ ΚΑΙ ΑΝΑΚΑΙΝΙΣΗΣ ΑΚΙΝΗΤΩΝ


Ηλεκτρονικοί Υπολογιστές II

ΥΠΗΡΕΣΙΑ ΠΛΗΡΟΦΟΡΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΤΟΜΕΑΣ ΔΙΚΤΥΩΝ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ

Σύβακας Σταύρος ΠΕ19,MSc. IT ΣΥΒΑΚΑΣ ΣΤΑΥΡΟΣ ΕΡΩΤΗΜΑΤΑ

Οδηγίες Χρήσης της MySQL

Σχεδίαση Βάσεων Δεδομένων

Οδηγός Online Ανάλυσης ή/και Αξιολόγησης Έργου

Ηλεκτρονικοί Υπολογιστές ΙI. Βάσεις Δεδομένων. Ακαδημαϊκό Έτος Εργαστήριο 7. Διαφάνεια 1. Κάπαρης Αναστάσιος

BΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ ΕΞΕΤΑΣΗ ΦΕΒΡΟΥΑΡΙΟΥ 2005

Ειδικά Θέματα Παραμετροποίησης. Ασφάλεια Εφαρμογής Εναρμόνιση με τον κανονισμό GDRP. Data Communication A.E.

Εγχειρίδιο Συντονιστή Τηλεδιασκέψεων Υπηρεσίας e:presence

Προγραμματισμός ΙI (Θ)

TUTORIAL VERSION: 1.0

ΕΓΧΕΙΡΙ ΙΟ Ο ΗΓΙΩΝ. Ηλεκτρονική. Υπηρεσία Άντλησης Αποτελέσματος Πιστοποίησης Αναπηρίας

Διαδικτυακή Πύλη (web portal) ΟΔΗΓΟΣ ΧΡΗΣΗΣ System Συμβουλευτική Α.Ε

Οδηγός Σύνδεσης στο Ασύρματο Δίκτυο cs-wifi του Τμήματος Πληροφορικής του Πανεπιστημίου Κύπρου για Windows 7

ΕΡΩΤΗΜΑΤΟΛΟΓΙΟ. ΘΕΜΑ 1 Ο : (36 µονάδες) ΘΕΜΑ 2 Ο : (44 µονάδες)

ΕΓΧΕΙΡΙΔΙΟ ΟΔΗΓΙΩΝ ΧΡΗΣΤΗ. Ηλεκτρονική Υποβολή Α.Π.Δ.

«Οδηγίες χρήσης εφαρμογής Ενιαίου Συστήματος Πληρωμών»

Λίγα λόγια από το συγγραφέα Κεφάλαιο 1: Βάσεις δεδομένων και Microsoft Access Κεφάλαιο 2: Microsoft Access

Εγχειρίδιο Χρήστη Εκπαιδευόμενου. Πλατφόρμα ΠΡΟΧΩΡΩ elearning

1. ΑΝΟΙΞΤΕ ΤΟΝ ΠΙΝΑΚΑ CUSTOMER ΚΑΙ ΣΤΟ ΜΕΝΟΥ ΕΠΙΛΕΞΤΕ

Βάσεις Περιβαλλοντικών Δεδομένων

ΘΕΜΑΤΑ. Θέμα 1 ο Σύμφωνα με τους παραπάνω πίνακες και τη θέση που έχουν τα ξένα κλειδιά βρείτε τους

Τεχνολογία Πολιτισμικού Λογισμικού

Οδηγίες - Ρυθμίσεις Λογαριασμού Μέλους

ΕΡΓΟ: «Ανάπτυξη Εφαρμογής Μητρώου και Εκπαίδευση» ΠΑΡΑΔΟΤΕΟ Έλεγχος Συστήματος & Λογισμικού Μητρώου ΑμεΑ

Οδηγός Online Κατοχύρωσης

ΠΡΟΓΡΑΜΜΑ ΑΠΟΜΑΚΡΥΣΜΕΝΗΣ ΕΙΣΑΓΩΓΗΣ ΒΑΘΜΟΛΟΓΙΩΝ ΑΠΟ ΔΙΔΑΣΚΟΝΤΕΣ

ΟΔΗΓΟΣ ΧΡΗΣΗΣ ΥΠΗΡΕΣΙΑΣ [ΥΠΗΡΕΣΙΑ 2 ΑNAΠΤΥΞΗ

Βάσεις δεδομένων. (7 ο μάθημα) Ηρακλής Βαρλάμης

Διαδικασία σύνδεσης στην εφαρμογή TAVL

Περιεχόμενα. Βάσεις Δεδομένων Προχωρημένα Ερωτήματα SQL. Συνένωση Σχέσεων στην SQL2 (3) Συνένωση Σχέσεων στην SQL2. (Join Relations Feature in SQL)

Οδηγός Σύνδεσης στο Ασύρµατο ίκτυο cs-wifi του Τµήµατος Πληροφορικής του Πανεπιστηµίου Κύπρου για Windows XP

Εγχειρίδιο Λειτουργίας Τράπεζας Χρόνου

Οδηγίες Χρήσης της MySQL

Ksyla.gr Σύντομη περιγραφή λειτουργίας

Βασικές λειτουργίες διαδανεισμού μέσα από το σύστημα SmILLe

Εγχειρίδιο Χρήσης της Υπηρεσίας Υποστήριξης Χρηστών (Helpdesk) της Βιβλιοθήκης & Κέντρου Πληροφόρησης του Πανεπιστημίου Αιγαίου

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΕΛΕΓΧΟΜΕΝΗ ΠΡΟΣΒΑΣΗ ΣΤΙΣ ΤΗΛΕΦΩΝΙΚΕΣ ΣΥΣΚΕΥΕΣ ΟΔΗΓΟΣ ΧΡΗΣΗΣ ΓΙΑ ΥΠΗΡΕΣΙΑ ΠΛΗΡΟΦΟΡΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΣ-ΕΔ/94

Για την εισαγωγή προϊόντων

Πίνακας Εικόνων. 22/04/2014 Έκδοση 3.0.1

Οδηγίες χρήσης εφαρμογής Ε.Ο.Π.Υ.Υ - Σύστημα Ηλεκτρονικής Προέγκρισης Φαρμάκων για Θεράποντες Ιατρούς

Βάσεις Δεδομένων Σύνθετα SQL queries

Ελληνικό Αρχείο όγκων Ήπατος, Παγκρέατος, Χοληφόρων (Hellenic Registry of the HPB cancers)

Φύλλο εργασίας 1 Εισαγωγή στη Ρομποτική

ΟΔΗΓΟΣ ΧΡΗΣΗΣ ΥΠΗΡΕΣΙΑΣ [ΥΠΗΡΕΣΊΑ 9 ΣΎΣΤΗΜΑ

Σελίδα 2


Εγχειρίδιο λειτουργιών χρήστη (αποφοίτου) στο Mathiteia4u

Συνοπτικός Οδηγός Χρήσης του Moodle για τον Καθηγητή

K9 Γονικός έλεγχος. Εισαγωγή

Basic Missions

Κεφάλαιο 9 Συναθροίσεις

Σχεδιασμός Βάσεων Δεδομένων

Οδηγός βάσεων δεδομένων

Transcript:

WebGoat To WebGoat αποτελεί μία τοπική πλατφόρμα testing και εκμάθησης για θέματα ασφαλείας διαδικτύου. Εντός του project υπάρχουν (κατηγοριοποιημένα) τεράστια κενά ασφαλείας τα οποία ο χρήστης καλείται αρχικά να ανακαλύψει και έπειτα να καλύψει. Για τις ανάγκες της παρούσας εργασίας χρησιμοποιήσαμε την έκδοση WebGoat 5.2 Developer Version την οποία και τρέξαμε μέσω του περιβάλλοντος του Eclipse. SQL Injection Γνωστή και συνήθης μέθοδος των hacker για παραβίαση ιστοσελίδων με κενά ασφαλείας είναι τα sql injection. O hacker προσπαθεί μέσω queries που θέτει στη βάση δεδομένων της ιστοσελίδας, να την τρυπήσει και να αποκτήσει πρόσβαση σε ιδιωτικά δεδομένα ή διαχειριστικές δυνατότητες που δεν του αναλογούν νόμιμα. Παράδειγμα SQL Injection στο WebGoat Η σελίδα που θα επιχειρήσουμε να ασφαλίσουμε από κενά ασφαλείας στην συγκεκριμένη εργασία, είναι η υποθετική σελίδα μελών μίας υποθετικής εταιρίας οικονομικών η οποία μπορεί να παραβιαστεί με δύο τρόπους: τόσο με String SQL Injection, όσο και με Numeric SQL Injection. Στην παρακάτω εικόνα, μπορούμε να δούμε την κεντρική φόρμα σύνδεσης των μελών. Όπως βλέπουμε στην αμέσως επόμενη εικόνα, διατίθεται ένα dropdown menu με το όνομα και τον ρόλο του.

String SQL Injection Σε πρώτη φάση θα προσπαθήσουμε να παραβιάσουμε ως απλοί επισκέπτες το σύστημα, εισχωρώντας στο σύστημα ως διαχειριστές, παραβιάζοντας τον λογαριασμό του διαχειριστή Neville Bartholomew μέσω String SQL Injection. Για τις ανάγκες του hacking που θα επιχειρήσουμε, θα χρειαστούμε το πρόσθετο εργαλείο Tamper Data το οποίο δίνει τη δυνατότητα για προβολή, καταγραφή και τροποποίηση εξερχόμενων http αιτημάτων και μπορεί να χρησιμοποιηθεί ως ένα εργαλείο pen-test ελέγχου κενών ασφαλείας ιστοσελίδων και διαδικτυακών εφαρμογών. Επιλέγουμε λοιπόν, να συνδεθούμε ως Neville Bartholomew και πριν πατήσουμε Login επιλέγουμε Start Tamper στο Tamper Data (μενού Εργαλεία του Firefox). Πατώντας λοιπόν Login το Tamper Data μας ζητά τις παραμέτρους που θέλουμε να βάλουμε στα πεδία και μάλιστα όχι κρυπτογραφημένα. Εδώ λοιπόν, εμείς, θα χρησιμοποιήσουμε μία αρκετά συνήθη τακτική hacking κατά την οποία θα επιστρέψουμε ως ερώτημα στη βάση (στο πεδίο του κωδικού) μία πάντοτε αληθή συνθήκη (δηλαδή ότι 1 = 1) κατά την οποία το σύστημα (εφόσον είναι ανασφαλές και δεν έχει μεριμνήσει επί τούτου) θα δεχτεί ως αληθή και αποδεκτή, οπότε και εμείς θα συνδεθούμε στον λογαριασμό του διαχειριστή, χωρίς να γνωρίζουμε καν τον κωδικό! Συγκεκριμένα, θα δώσουμε στο πεδίο password την τιμή «1 or 1 = 1» και ως αποτέλεσμα είναι να περάσει στο πεδίο του κωδικού αυτό ακριβώς το string. Το γιατί πέρασε θα το δούμε παρακάτω.

Στην παρακάτω εικόνα βλέπουμε ότι όντως καταφέραμε (χωρίς καν να διαθέτουμε λογαριασμό στο σύστημα) να συνδεθούμε με λογαριασμό διαχειριστή με τον οποίο μπορούμε να κάνουμε ότι θέλουμε (ακόμα και να διαγράψουμε) τους λογαριασμούς των στελεχών της εταιρίας. Numeric SQL Injection Ο δεύτερος τρόπος με τον οποίον θα προσπαθήσουμε να παραβιάσουμε το σύστημα, είναι να συνδεθούμε με απλό ρόλο εργαζομένου και μέσα από εκεί να δούμε το προφίλ κάποιου διαχειριστή, στο οποίο υπό κανονικές συνθήκες δεν θα είχαμε πρόσβαση μέσω Numeric SQL Injection.

Αρχικά συνδεόμαστε με τον λογαριασμό μας: Υποτίθεται ότι είμαστε ο Larry (με κωδικό πρόσβασης Larry ) και θέλουμε να δούμε τα στοιχεία του αφεντικού μας (Neville Bartholomew) με σκοπό να τα υποκλέψουμε (ακόμα και τον αριθμό της πιστωτικής του κάρτας). Εφόσον συνδεθούμε, έχοντας επιλεγμένο το προφίλ μας, κάνουμε ξανά Start Tamper και επιλέγουμε View Profile. Υπό κανονικές συνθήκες, θα έπρεπε να δούμε το προφίλ μας, μέσω του Tamper Data όμως θα προσπαθήσουμε να ορίσουμε δικές μας παραμέτρους ούτως ώστε να εισχωρήσουμε σε άλλο προφίλ!

Λειτουργώντας με παρόμοιο τρόπο, θα ορίσουμε μία μονίμως αληθή συνθήκη, αυτή τη φορά στο πεδίο employee_id. Συγκεκριμένα, θα επιστρέψουμε στη βάση το ερώτημα «101 or 1=1 order by salary desc» το οποίο, έχοντας υποθέσει ότι υπάρχει το πεδίο salary στη βάση (δηλαδή ο μισθός), με φθίνουσα ταξινόμηση θα μας επιστρέψει τον κύριο Bartholomew ο οποίος έχει και τον μεγαλύτερο μισθό στην εταιρία. Όντως, παρακάτω βλέπουμε ότι καταφέραμε με επιτυχία συνδεδεμένοι ως απλοί εργαζόμενοι- να δούμε το προφίλ του διαχειριστή του συστήματος, στο οποίο υπάρχουν σημαντικά και ευαίσθητα προσωπικά στοιχεία. Μάλιστα, μας δίνεται ακόμα και δυνατότητα τροποποίησης του προφίλ αυτού!

Διάγνωση προβλήματος κενών ασφαλείας Για να ανακαλύψουμε τα κενά ασφαλείας του κώδικα αυτής της σελίδας θα πρέπει να ανατρέξουμε στα αρχεία Login.java και ViewProfile.java αντίστοιχα. Στον κώδικα αυτών των αρχείων θα πρέπει να δούμε σε ποιο σημείο γίνεται η διασύνδεση με τη βάση, πως γίνεται η διασύνδεση αυτή με ποιο τρόπο περνάει ο κώδικας το query στην βάση δεδομένων τι παραμέτρους επιτρέπει ο κώδικας να περάσουν και να διορθώσουμε τις ατέλειες. Login.Java Στις γραμμές 125-131 και 160-166 του συγκεκριμένου αρχείου βλέπουμε τον παρακάτω κώδικα: String query = "SELECT * FROM employee WHERE userid = " + userid + " and password = '" + password + "'"; // System.out.println("Query:" + query); Statement answer_statement = WebSession.getConnection(s).createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet answer_results = answer_statement.executequery(query); Όπως βλέπουμε μέσα στο SQL Query δεν χρησιμοποιεί παραμέτρους, ενώ αφήνει οποιοδήποτε string να περάσει, κάτι που είναι εντελώς ανασφαλές. Έτσι κι εμείς προηγουμένως μέσα στα «αυτάκια» ( ) κατορθώσαμε να περάσουμε το string που θέλαμε (Το τελικό ερώτημα που θα καταλάβει η βάση, θα είναι δηλαδή SELECT * FROM employee WHERE userid = 101 and password = 1 or 1=1. ViewProfile.Java Στις γραμμές 100-108 του αρχείου, βλέπουμε τον παρακάτω κώδικα: String query = "SELECT employee.* " + "FROM employee,ownership WHERE employee.userid = ownership.employee_id and " + "ownership.employer_id = " + userid + " and ownership.employee_id = " + subjectuserid; Statement answer_statement = WebSession.getConnection(s)

.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_READ_ONLY); ResultSet answer_results = answer_statement.executequery(query); Επίσης στις γραμμές 151-157 τον παρακάτω κώδικα: String query = "SELECT * FROM employee WHERE userid = " + subjectuserid; Statement answer_statement = WebSession.getConnection(s).createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet answer_results = answer_statement.executequery(query); Οι γραμμές αυτές αποτελούν κώδικα της μεθόδου getemployeeprofile που επιστρέφει το προφίλ του συνδεδεμένου χρήστη. Ουσιαστικά συμβαίνει ότι και πριν, απλά εδώ περιμένει να του δώσει κάποιο νούμερο. Επίλυση κάλυψη κενών ασφαλείας Για να καλύψουμε αυτά τα κενά ασφαλείας, θα πρέπει να κλειδώσουμε τον κώδικα μας από το να δέχεται οποιασδήποτε μορφής παραμέτρους, φιλτράροντας τις εισερχόμενες τιμές. Παρακάτω είναι ο διορθωμένος κώδικας για την πρώτη περίπτωση (string injection), τον οποίο και θα εξηγήσουμε στη συνέχεια. String query = "SELECT * FROM employee WHERE userid =? and password =?"; Connection connection = WebSession.getConnections(s); PreparedStatement statement = connection.preparestatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); statement.setstring(1, userid); statement.setstring(2, password); ResultSet answer_results = statement.executequery(); Όπως βλέπουμε στο SQL Query εκεί που ήταν τα «αυτάκια» τώρα υπάρχουν τα «ερωτηματικά». Ο κώδικας πάει και παίρνει τις δοθείσες τιμές από το statement και τις αντικαθιστά στα 1 και 2 (πρώτο και δεύτερο ερωτηματικό). Εντός του statement εμπεριέχονται μέθοδοι ελέγχου που κόβουν τις παραμέτρους, όπως αυτές που είδαμε πριν.

Η παραπάνω εικόνα είναι το αποτέλεσμα προσπάθειας String SQL Injection, με τον ίδιο ακριβώς τρόπο όπως πριν, η οποία όμως απέτυχε παταγωδώς κατόπιν της ανανέωσης και ασφάλισης του κώδικα μας. Ακολούθως θα ασφαλίσουμε την σελίδα και για Numeric SQL Injection. Παρακάτω παρατίθεται ο κώδικας, ο οποίος εξηγείται αμέσως μετά. String query = "SELECT employee.* " + "FROM employee,ownership WHERE employee.userid = ownership.employee_id and " + "ownership.employer_id =? and ownership.employee_id =?"; Connection connection = WebSession.getConnections(s); PreparedStatement statement = connection.preparestatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); statement.setint(1, Integer.parseInt(userId)); statement.setint(2, Integer.parseInt(subjectUserId)); ResultSet answer_results = statement.executequery();

Με παρόμοιο τρόπο, όπως και πριν, περνάνε οι αριθμητικές τιμές που δίνει ο χρήστης (στον παλιό ανασφαλή κώδικα μπορούσε να περάσει και string). Η παρακάτω εικόνα είναι το αποτέλεσμα αποτυχημένης προσπάθειας Numeric SQL Injection, κατόπιν της ασφάλισης του κώδικας μας.