Mirtinos svetainės saugumo nuodėmės: ką sužinojome iš pažeidžiamumo skaitytuvo metų statistikos

Maždaug prieš metus mes, DataLine, pradėjome veiklą tarnyba ieškoti ir analizuoti IT programų pažeidžiamumą. Paslauga paremta Qualys debesies sprendimu, apie kurio veikimą mes jau pasakėme. Per metus dirbdami su sprendimu atlikome 291 skirtingų svetainių nuskaitymą ir sukaupėme statistiką apie įprastus žiniatinklio programų pažeidžiamumus. 

Žemiau esančiame straipsnyje tiksliai parodysiu, kokios svetainės saugumo spragos slypi už skirtingų kritiškumo lygių. Pažiūrėkime, kokius pažeidžiamumus skaitytuvas aptikdavo ypač dažnai, kodėl jie gali atsirasti ir kaip apsisaugoti. 

Mirtinos svetainės saugumo nuodėmės: ką sužinojome iš pažeidžiamumo skaitytuvo metų statistikos

„Qualys“ visas žiniatinklio programų spragas skirsto į tris kritiškumo lygius: žemą, vidutinį ir aukštą. Pažvelgus į pasiskirstymą pagal „sunkumą“, atrodo, kad viskas nėra taip blogai. Yra keletas pažeidžiamumų, kurių kritiškumas yra aukštas, dažniausiai visi yra nekritiniai: 

Mirtinos svetainės saugumo nuodėmės: ką sužinojome iš pažeidžiamumo skaitytuvo metų statistikos

Tačiau nekritiškas nereiškia nekenksmingas. Jie taip pat gali sukelti rimtą žalą. 

Populiariausi „nekritiniai“ pažeidžiamumai

  1. Mišraus turinio pažeidžiamumas.

    Svetainės saugumo standartas yra duomenų perdavimas tarp kliento ir serverio HTTPS protokolu, kuris palaiko šifravimą ir apsaugo informaciją nuo perėmimo. 

    Kai kurios svetainės naudoja mišrus turinys: kai kurie duomenys perduodami per nesaugų HTTP protokolą. Taip dažniausiai perteikiama pasyvus turinys – informacija, kuri turi įtakos tik svetainės rodymui: paveikslėliai, css stiliai. Tačiau kartais taip perduodama aktyvų turinį: scenarijai, valdantys svetainės elgesį. Tokiu atveju, naudodami specialią programinę įrangą, galite analizuoti informaciją su aktyviu turiniu, gaunamu iš serverio, modifikuoti savo atsakymus skrydžio metu ir priversti mašiną veikti taip, kaip nenumatė jo kūrėjai. 

    Naujesnės versijos naršyklės įspėja vartotojus, kad svetainės su mišriu turiniu yra nesaugios ir blokuoja turinį. Svetainių kūrėjai taip pat gauna naršyklės įspėjimus konsolėje. Pavyzdžiui, tai atrodo taip "Firefox"

    Mirtinos svetainės saugumo nuodėmės: ką sužinojome iš pažeidžiamumo skaitytuvo metų statistikos

    Kodėl tai pavojinga?: Užpuolikai naudoja nesaugų protokolą, kad perimtų vartotojo informaciją, pakeistų scenarijus ir jo vardu siųstų užklausas į svetainę. Net jei svetainės lankytojas neįvedė duomenų, tai jo neapsaugo nuo sukčiavimas – konfidencialios informacijos gavimas apgaulingais būdais. Pavyzdžiui, naudodami scenarijų galite nukreipti vartotoją į nesaugią svetainę, kuri prisidengia vartotojui pažįstama svetaine. Kai kuriais atvejais kenkėjiška svetainė atrodo net geriau nei originali, o vartotojas gali pats užpildyti formą ir pateikti konfidencialius duomenis. 

    Ką turėtų atsiminti žiniatinklio kūrėjas: Net jei svetainės administratorius įdiegė ir sukonfigūravo SSL/TLS sertifikatą, pažeidžiamumas gali atsirasti dėl žmogaus klaidos. Pavyzdžiui, jei viename iš puslapių įdėjote ne santykinę nuorodą, o absoliučią nuorodą iš http, be to, nenustatėte peradresavimų iš http į https. 

    Mišrų turinį svetainėje galite aptikti naudodami naršyklę: ieškokite puslapio šaltinio kodo, skaitykite pranešimus kūrėjo pulte. Tačiau kūrėjas turės ilgai ir nuobodžiai dirbti su kodu. Galite pagreitinti procesą naudodami automatinius analizės įrankius, pavyzdžiui: Patikrinkite SSL, nemokama Lighthouse programinė įranga arba mokama programinė įranga Screaming Frog SEO Spider.

    Be to, pažeidžiamumas gali atsirasti dėl problemų, susijusių su senuoju kodu – kodu, kuris buvo paveldėtas. Pavyzdžiui, jei kai kurie puslapiai generuojami naudojant seną šabloną, kuriame neatsižvelgiama į svetainių perėjimą prie https.    

  2. Slapukai be „HTTOnly“ ir „saugus“ vėliavėlių.

    Atributas „HTTOnly“ apsaugo slapukus nuo scenarijų, kuriuos užpuolikai naudoja naudotojo duomenims pavogti, apdorojimo. „Saugi“ vėliavėlė neleidžia siųsti slapukų aiškiu tekstu. Ryšys bus leidžiamas tik tuo atveju, jei slapukams siųsti naudojamas saugus HTTPS protokolas. 

    Abu atributai nurodyti slapuko ypatybėse:

    Set-Cookie: Secure; HttpOnly

    Kodėl tai pavojinga?: Jei svetainės kūrėjas nenurodė šių atributų, užpuolikas gali perimti vartotojo informaciją iš slapuko ir ja pasinaudoti. Jei autentifikavimui ir autorizavimui naudojami slapukai, jis galės užgrobti vartotojo seansą ir atlikti veiksmus svetainėje jo vardu. 

    Ką turėtų atsiminti žiniatinklio kūrėjas: Paprastai populiariose sistemose šie atributai nustatomi automatiškai. Tačiau vis tiek patikrinkite žiniatinklio serverio konfigūraciją ir nustatykite vėliavėlę: Set-Cookie HttpOnly; Saugus.

    Tokiu atveju atributas „HTTOnly“ padarys slapukus nematomus jūsų „JavaScript“.  

  3. Keliu pagrįsti pažeidžiamumai.

    Skaitytuvas praneša apie tokį pažeidžiamumą, jei randa viešai prieinamą failą arba svetainės katalogą su galimai konfidencialia informacija. Pavyzdžiui, aptinka atskirus sistemos konfigūracijos failus arba prieigą prie visos failų sistemos. Tokia situacija įmanoma, jei svetainėje neteisingai nustatytos prieigos teisės.

    Kodėl tai pavojinga?: Jei failų sistema „išlipa“, užpuolikas gali patekti į operacinės sistemos sąsają ir bandyti rasti aplankus su slaptažodžiais, jei jie saugomi aiškiu tekstu (nedarykite to!). Arba galite pavogti slaptažodžių maišą ir priverstinai priversti slaptažodį, taip pat pabandyti padidinti privilegijas sistemoje ir gilintis į infrastruktūrą.  

    Ką turėtų atsiminti žiniatinklio kūrėjas: Nepamirškite prieigos teisių ir sukonfigūruokite platformą, žiniatinklio serverį, žiniatinklio programą taip, kad nebūtų įmanoma „pabėgti“ iš žiniatinklio katalogo.

  4. Formos, skirtos įvesti neskelbtinus duomenis, kai įjungtas automatinis pildymas.

    Jei vartotojas dažnai pildo formas svetainėse, jo naršyklė išsaugo šią informaciją naudodama automatinio pildymo funkciją. 

    Svetainių formose gali būti laukų su neskelbtina informacija, pvz., slaptažodžiais arba kredito kortelių numeriais. Tokiems laukams verta išjungti formų automatinio pildymo funkciją pačioje svetainėje. 

    Kodėl tai pavojinga?: jei vartotojo naršyklėje saugoma neskelbtina informacija, užpuolikas gali ją perimti vėliau, pavyzdžiui, sukčiuodamas. Iš esmės šį niuansą pamiršęs interneto kūrėjas nustato savo vartotojus. 

    Ką turėtų atsiminti žiniatinklio kūrėjas: Šiuo atveju turime klasikinį konfliktą: patogumas prieš saugumą. Jei žiniatinklio kūrėjas galvoja apie vartotojo patirtį, jis gali sąmoningai pasirinkti automatinį užbaigimą. Pavyzdžiui, jei svarbu laikytis Žiniatinklio turinio prieinamumo gairės – rekomendacijos dėl turinio prieinamumo vartotojams su negalia. 

    Daugumoje naršyklių galite išjungti automatinį užbaigimą naudodami atributą autocompete="off", pvz.:

     <body>
        <form action="/lt/form/submit" method="get" autocomplete="off">
          <div>
            <input type="text" placeholder="First Name">
          </div>
          <div>
            <input type="text" id="lname" placeholder="Last Name" autocomplete="on">
          </div>
          <div>
            <input type="number" placeholder="Credit card number">
          </div>
          <input type="submit">
        </form>
      </body>

    Bet tai neveiks „Chrome“. Tai apeinama naudojant JavaScript, galima rasti recepto variantą čia

  5. X-Frame-Options antraštė nenustatyta svetainės kode. 

    Ši antraštė turi įtakos rėmelio, iframe, įterpimo ar objekto žymoms. Su jo pagalba galite visiškai uždrausti įterpti svetainę į rėmelį. Norėdami tai padaryti, turite nurodyti reikšmę X-Frame-Options: deny. Arba galite nurodyti X-Frame-Options: sameorigin, tada įterpimas į iframe bus galimas tik jūsų domene.

    Kodėl tai pavojinga?: Tokios antraštės nebuvimas gali būti naudojamas kenkėjiškose svetainėse paspaudimų užgrobimas. Šiai atakai užpuolikas sukuria permatomą rėmelį ant mygtukų ir apgauna vartotoją. Pavyzdžiui: sukčiai įrėmina socialinių tinklų puslapius svetainėje. Vartotojas mano, kad spusteli mygtuką šioje svetainėje. Vietoje to paspaudimas sulaikomas ir vartotojo užklausa siunčiama į socialinį tinklą, kuriame vyksta aktyvi sesija. Taip užpuolikai siunčia šlamštą vartotojo vardu arba gauna prenumeratorių ir teigiamų įvertinimų. 

    Jei šios funkcijos neišjungsite, užpuolikas gali įdėti jūsų programos mygtuką kenkėjiškoje svetainėje. Jis gali būti suinteresuotas jūsų persiuntimo programa arba jūsų vartotojais.  

    Ką turėtų atsiminti žiniatinklio kūrėjas: pažeidžiamumas gali atsirasti, jei žiniatinklio serveryje arba apkrovos balansavimo priemonėje yra nustatytos X-Frame-Options su prieštaraujančia reikšme. Tokiu atveju serveris ir balansavimo priemonė tiesiog perrašys antraštę, nes jie turi didesnį prioritetą, palyginti su užpakaliniu kodu.  

    Antraštės „X-Frame-Options“ neigimo ir tos pačios kilmės reikšmės trukdys „Yandex“ žiniatinklio peržiūros programai. Norėdami leisti žiniatinklio peržiūros programai naudoti iframe, nustatymuose turite parašyti atskirą taisyklę. Pavyzdžiui, nginx galite sukonfigūruoti taip:

    http{
    ...
     map $http_referer $frame_options {
     "~webvisor.com" "ALLOW-FROM http://webvisor.com";
     default "SAMEORIGIN";
     }
     add_header X-Frame-Options $frame_options;
    ...
    }
    
    

  6. PRSSI (Path-relative stylesheet import) pažeidžiamumas.  

    Tai yra svetainės stiliaus pažeidžiamumas. Taip nutinka, jei stilių failams pasiekti naudojamos santykinės nuorodos, pvz., href="/lt/somefolder/styles.css/". Užpuolikas pasinaudos tuo, jei ras būdą nukreipti vartotoją į kenkėjišką puslapį. Puslapis įterps santykinę nuorodą į savo URL ir imituos stilių iškvietimą. Gausite užklausą, pvz., badsite.ru/…/somefolder/styles.css/, kuri, prisidengdama stiliumi, gali atlikti kenkėjiškus veiksmus. 

    Kodėl tai pavojinga?: Sukčiai gali pasinaudoti šia spraga, jei rastų kitą saugos spragą. Dėl to galima pavogti vartotojo duomenis iš slapukų ar žetonų.

    Ką turėtų atsiminti žiniatinklio kūrėjas: X-Content-Type-Options antraštę nustatykite į: nosniff. Tokiu atveju naršyklė patikrins stilių turinio tipą. Jei tipas yra ne tekstas/css, naršyklė užklausą užblokuos.

Kritiniai pažeidžiamumai

  1. Puslapis su slaptažodžio lauku perduodamas iš serverio nesaugiu kanalu (HTML forma su slaptažodžio lauku (-ais) teikiama per HTTP).

    Atsakymas iš serverio per nešifruotą kanalą yra pažeidžiamas „Žmogus viduryje“ atakų. Užpuolikas gali perimti srautą ir įsiterpti tarp kliento ir serverio, kai puslapis keliauja iš serverio į klientą. 

    Kodėl tai pavojinga?: Sukčiai galės pakeisti puslapį ir nusiųsti vartotojui formą, skirtą konfidencialiems duomenims, kurie pateks į užpuoliko serverį. 

    Ką turėtų atsiminti žiniatinklio kūrėjas: kai kurios svetainės siunčia vartotojams vienkartinį kodą el. paštu / telefonu, o ne slaptažodžiu. Šiuo atveju pažeidžiamumas nėra toks kritiškas, tačiau mechanizmas apsunkins vartotojų gyvenimą.

  2. Formos su prisijungimo vardu ir slaptažodžiu siuntimas nesaugiu kanalu (Prisijungimo forma nepateikiama per HTTPS).

    Tokiu atveju iš vartotojo į serverį nešifruotu kanalu siunčiama forma su prisijungimo vardu ir slaptažodžiu.

    Kodėl tai pavojinga?: Skirtingai nuo ankstesnio atvejo, tai jau yra kritinis pažeidžiamumas. Lengviau perimti neskelbtinus duomenis, nes tam net nereikia rašyti kodo. 

  3. „JavaScript“ bibliotekų su žinomais pažeidžiamumas naudojimas.

    Nuskaitymo metu dažniausiai naudojama biblioteka buvo „jQuery“ su daugybe versijų. Kiekviena versija turi bent vieną ar net daugiau žinomų spragų. Poveikis gali būti labai skirtingas, atsižvelgiant į pažeidžiamumo pobūdį.

    Kodėl tai pavojinga?: Yra žinomų pažeidžiamumų išnaudojimų, pavyzdžiui:

    Mirtinos svetainės saugumo nuodėmės: ką sužinojome iš pažeidžiamumo skaitytuvo metų statistikos

    Ką turėtų atsiminti žiniatinklio kūrėjas: Reguliariai grįžkite į ciklą: ieškokite žinomų pažeidžiamumų – pataisykite – patikrinkite. Jei pasenusias bibliotekas naudojate sąmoningai, pavyzdžiui, norėdami palaikyti senesnes naršykles arba sutaupyti pinigų, ieškokite galimybės ištaisyti žinomą pažeidžiamumą. 

  4. Scenarijus tarp svetainių (XSS). 
    Cross-Site Scripting (XSS) arba kelių svetainių scenarijų kūrimas yra ataka prieš žiniatinklio programą, dėl kurios į duomenų bazę patenka kenkėjiškų programų. Jei Qualys randa tokį pažeidžiamumą, tai reiškia, kad potencialus užpuolikas gali arba jau įvedė savo js scenarijų į svetainės kodą, kad galėtų atlikti kenkėjiškus veiksmus.

    Saugomas XSS pavojingesnis, nes scenarijus įterpiamas į serverį ir vykdomas kiekvieną kartą, kai naršyklėje atidaromas užpultas puslapis.

    Atsispindi XSS lengviau atlikti, nes kenkėjiškas scenarijus gali būti įterptas į HTTP užklausą. Programa gaus HTTP užklausą, duomenų nepatikrins, supakuosis ir nedelsdama išsiųs. Jei užpuolikas sulaiko srautą ir įterpia scenarijų, pvz

    <script>/*+что+то+плохое+*/</script> 

    tada kliento vardu bus išsiųsta kenkėjiška užklausa.

    Ryškus XSS pavyzdys: js sniffers, kurie imituoja puslapius, kuriuose reikia įvesti CVC, kortelės galiojimo datą ir pan. 

    Ką turėtų atsiminti žiniatinklio kūrėjas: antraštėje Content-Security-Policy naudokite atributą script-src, kad priverstumėte kliento naršyklę atsisiųsti ir vykdyti kodą tik iš patikimo šaltinio. Pavyzdžiui, script-src „self“ į baltąjį sąrašą įtraukiami tik mūsų svetainės scenarijai. 
    Geriausia praktika yra įterptinis kodas: leisti tik įterptąjį JavaScript naudojant nesaugią įterptąją reikšmę. Ši reikšmė leidžia naudoti eilutinį js/css, bet nedraudžia įtraukti js failų. Kartu su script-src 'self' išjungiame išorinių scenarijų vykdymą.

    Būtinai užregistruokite viską naudodami report-uri ir pažiūrėkite į bandymus tai įdiegti svetainėje.

  5. SQL injekcijos.
    Pažeidžiamumas rodo galimybę įterpti SQL kodą į svetainę, kuri tiesiogiai pasiekia svetainės duomenų bazę. SQL įterpimas galimas, jei duomenys iš vartotojo nėra tikrinami: nėra tikrinamas jų teisingumas ir iš karto panaudojamas užklausoje. Pavyzdžiui, taip nutinka, jei svetainėje esanti forma netikrina, ar įvestis atitinka duomenų tipą. 

    Kodėl tai pavojinga?: Jei užpuolikas įveda SQL užklausą į šią formą, jis gali sugriauti duomenų bazę arba atskleisti konfidencialią informaciją. 

    Ką turėtų atsiminti žiniatinklio kūrėjas: nepasitikėkite tuo, kas ateina iš naršyklės. Turite apsisaugoti tiek kliento, tiek serverio pusėje. 

    Kliento pusėje parašykite lauko patvirtinimą naudodami „JavaScript“. 

    Integruotos funkcijos populiariose sistemose taip pat padeda išvengti įtartinų simbolių serveryje. Taip pat serveryje rekomenduojama naudoti parametrizuotas duomenų bazių užklausas.

    Nustatykite, kur tiksliai sąveikauja su duomenų baze žiniatinklio programoje. 

    Sąveika atsiranda tada, kai gauname bet kokią informaciją: užklausą su id (id pakeitimu), naujo vartotojo sukūrimą, naują komentarą ar naujus įrašus duomenų bazėje. Čia gali įvykti SQL injekcijos. Net jei ištrinsime įrašą iš duomenų bazės, SQL injekcija yra įmanoma.

Bendrosios rekomendacijos

Neišradinėk dviračio iš naujo – naudokite patikrintus rėmus. Paprastai populiarios sistemos yra saugesnės. .NET – ASP.NET MVC ir ASP.NET Core, Python – Django arba Flask, Ruby – Ruby on Rails, PHP – Symfony, Laravel, Yii, JavaScript – Node.JS-Express.js, Java - pavasario MVC.

Sekite pardavėjo atnaujinimus ir reguliariai atnaujinkite. Jie suras pažeidžiamumą, tada parašys išnaudojimą, padarys jį viešai prieinamą ir viskas pasikartos. Prenumeruokite stabilių versijų naujinimus iš programinės įrangos pardavėjo.

Patikrinkite prieigos teises. Serverio pusėje visada elkitės su savo kodu taip, lyg jį nuo pirmos iki paskutinės raidės parašė jūsų nekenčiamiausias priešas, norintis sulaužyti jūsų svetainę, pažeisti jūsų duomenų vientisumą. Be to, kartais tai yra tiesa.

Naudokite klonus, bandymų vietas ir tada naudokite juos gamybai. Tai, pirma, padės išvengti klaidų ir klaidų produktyvioje aplinkoje: produktyvi aplinka atneša pinigų, paprasta produktyvi aplinka yra labai svarbi. Pridedant, taisant ar uždarant bet kokią problemą, verta dirbti bandomojoje aplinkoje, tada patikrinti rastus funkcionalumus ir spragas, o tada planuoti darbą su gamybine aplinka. 

Apsaugokite savo žiniatinklio programą naudodami Žiniatinklio programos ugniasienė ir integruoti ataskaitas iš pažeidžiamumo skaitytuvo. Pavyzdžiui, DataLine naudoja Qualys ir FortiWeb kaip paslaugų paketą.

Šaltinis: www.habr.com

Добавить комментарий