Ar išjungta Joomla! tikrai išjungta?

PDFSpausdintiEl. paštas

Sekmadienis, 05 Birželis 2011 21:11 Parašė Andrius Balsevičius Peržiūrų: 445

( 3 Balsai )

Šio straipsnio autorius yra Nicholas K. Dionysopoulos, rašantis straipsnius apie saugumą Joomla! Community Magazine. Originalų straipsnį anglų k. rasite čia - "How off-line is Joomla!'s off-line mode?".

Sąžiningas vagis
Joomla! tinklapis turi gerą nuostatą laikinai jį išjungti vykdant įvairius tinklapio priežiūros darbus - pvz. atnaujinant Joomla! branduolį ar kokį nors jos priedą, ir netgi siūlomas oficialioje dokumentacijoje kaip laikina apsisaugojimo priemonė, jei jūsų tinklapis buvo nulaužtas. Tačiau vis dėlto: ar šis laikino išjungimo būdas tikrai yra patikimas, ar jame yra spragų, dėl kurių vertėtų susirūpinti?

Kaip turbūt spėjate iš pavadinimo, Joomla! tinklapis, išjungtas standartiniu būdu, nėra jau toks išjungtas. Tiesą sakant,  tai tiesiog iliuzionisto triukas, atliktas taip pat, kaip tai darytų bet kuris iliuzionistas. Kol pridengtas nematomu šydu Jūsų tinklapis veikia visiškai normaliai - veikia visi komponentai ir įskiepiai, Joomla! atlieka magišką triuką prieš pat siųsdama jau suformuotą tinklapį į pateikiančią užklausą naršyklę, pakeisdama tikrąjį tinklapį išjungto tinklapio šablonu. Būtent dėl šios priežasties Jūs galite surinkti nuorodą http://www.joomla.org?tmpl=offline savo naršyklėje ir pamatysite, jog oficialus Joomla! tinklapis šiuo metu neveikia, nors iš tikrųjų taip nėra.

Pažiūrėkime, kaip Joomla! atlieka šį klasikinį iliuzionisto triuką, jo pasekmes ir išbandytus būdus, leidžiančius tikrai išjungti savo tinklapį nepageidautino įsilaužimo atveju.

Išnarstykime triuką

Kaip žinome, Joomla! yra tiesiog PHP karkasas, kuriame iš karto yra įdiegta keletas papildomų programinių priedų. Jūsų tinklapio išorinė sąsaja yra viena iš jų.

Kiekvienas priedas paveldi abstrakčią JApplication klasę. Išorinės sąsajos priedui, konkretus JApplication taikymas yra vadinamas JSite ir jį galime rasti faile includes/application.php. Vienintelė nuorodą į "off-line", arba išjungto tinklapio, režimą jame yra susieta su render() metodu ir čia Jūs galite pastebėti kai ką įdomaus ir neraminančio: Joomla! tikrina, ar Jūsų tinklapis yra išjungtas tik tada, kai ruošiasi pritaikyti suformuotam tinklapio turiniui šabloną. Jei Jūsų tinklapis yra išjungtas ir prie išorinės sąsajos Jūs nesate prisijungęs kaip tinklapio administratorius, Joomla! įkraus offline.php šabloną, vietoje numatytojo index.php.

Luktelėkite minutėlę... Kada būtent iškviečiamas render() metodas? Atsakymą rasite pagrindiniame index.php faile savo tinklapio šakniniame aplanke. Metodas  $mainframe->render() ($mainframe yra globalus kintamasis, kurio turinys yra JSite objektas) yra paminėtas priešpaskutinis šiame faile. Kitaip tariant, Joomla! vykdys visus įskiepius, vykdys komponentus ir tikrins, ar tinklapis nėra išjungtas tik paskutiniame žingsnyje, prieš pat parodydama HTML puslapį naršyklėje. JSite::render() metodas taip pat mums sako, kad "off-line" režimas išjungia tik tinklapio HTML režimą. O tai, mano draugai, gali turėti fatališkų pasekmių Jūsų tinklapiui...

Ar jaučiate skruzdėlytes?

Minutėlę susimastykime, kada ir kodėl Jūs norėtume išjungti savo tinklapį. Pradedantieji naudoja šį metodą, kai jų tinklapis dar tik kuriamas ir jie nenori jo rodyti visam pasauliui. Šiuo atveju viskas tvarkoje, kadangi tinklapis slepiamas tik nuo atsitiktinių lankytojų. Bet tai ne vienintelis ir ne pats dažniausias "off-line" metodo naudojimo atvejis.

Atsimenate nuorodas straipsnio pradžioje, kuriose užsimenama, ką reikia daryti, jei įtariate, kad Jūsų tinklapis buvo nulaužtas? Oficiali dokumentacija siūlo tuoj pat pasinaudoti "off-line" metodu.

DIDELĖ KLAIDA! Tinklapiai dažniausiai nulaužiami todėl, kad gabus krakeris rado SQL arba tiesioginę failo įkėlimo spragą.

SQL kodo įterpimo atveju, krakeris tiesiog įrašo pageidaujamą SQL kodą Jūsų tinklapio adreso pabaigoje, tiesiogiai vykdydamas kenksmingus veiksmus Jūsų tinklapio duomenų bazėje. Šios atakos prielaida yra ta, kad pažeidžimas komponentas apdoroja SQL užklausos parametrus, kuriuos jam siunčia krakeris. Ir žinote ką? Net jei Jūs laikinai išjungiate tinklapį, jūs vis dar esate pažeidžiamas vykdant SQL atakas. Kodėl? Todėl, kad komponentas vis tiek veikia, tik Jūs tiesiog nematote jo veikimo rezultato. Jūs esate "off-line" režime ir vis dar valdomas įsilaužėlio. Šachas ir matas.

Tiesioginio failo įkėlimo atveju, krakeris įkelia vieną iš C99-atmainos "root" skriptą į kurį nors tinklapio aplanką, taip pat pasinaudodamas pažeidžiamu komponentu. "Root" skriptai veikia nepriklausomai nuo Joomla! TTS, todėl net ir išjungus tinklapį, krakeris sėkmingai galės jį paleisti. Sakykime, Jūs toks gudrutis, kad randate tą skriptą ir jį ištrinate - valio, Jūs įveikėte hakerį... Deja, ne. Kai tik jis pamatys, kad jo skriptas dingo, jis pabandys jį įkelti dar kartą. Kadangi komponentas vis dar veikia, nors jo rezultatai ir nėra matomi, jis vis dar gali įkelti skriptą ir visiškai valdyti Jūsų tinklapį. Du nulis, laimi hakeris, tinklapio savininkui lieka tik graužtis nagus.

Štai ką Jūs turėtumėte įsidėmėti: "off-line" režimas negali ir neapgins Jūsų nuo hakerio.

Mano kung-fu stipresnis, nei tavo

Dabar Jūs jau žinote. Kiekvienai problemai, kuri man pastoja kelią, aš surandu sprendimą, aprašau jį ir pasidalinu su likusiu pasauliu. Yra išbandytas būdas visiškai išjungti Jūsų tinklapį, jei tik jam veikti naudojamas Apache arba bet koks kitas serveris, kuris palaiko .htaccess failus ir mod_rewrite metodą. Tai reiškia, kad siūlomas būdas veiks praktiškai visuose serveriuose, išskyrus daugumą IIS sistemų. Esmė yra ta, kad mes norime pasiekti, jog prieigą prie išjungto tinklapio turėtume tik mes patys, o visiems kitiems lankytojams ir hakeriui rodytume statišką HTML puslapį.

Pirmiausiai, Jums reikės Jūsų viešo IP adreso, t.y. IP adreso, kuris apibrėžia Jūsų jungtį su internetu. Tai galite matyti savo maršrutizatoriaus informaciniame puslapyje ir jis panašus į simbolių kombinaciją 123.123.123.123, t.y. keturi triženkliai skaičiai, atskirti taškais. Jei neturite supratimo, kur jo ieškoti, tiesiog apsilankykite adresu www.WhatsMyIP.org. Jūsų IP adresas rodomas pačiame puslapio viršuje milžiniško dydžio šriftu. Užsirašykite jį. Žemiau pateiktame pavyzdyje aš naudosiu netikrą IP adresą 123.123.123.123.

Taip pat Jums reikės statiško HTML failo, kurį norėtumėte rodyti savo lankytojams, kadangi daugiau nebegalėsite naudotis standartiniu Joomla "off-line" pranešimu. Tai padaryti galite naudodami įvairius HTML kūrimo įrankius, pvz. Kompozer. Jei norite, taip pat galite naudoti CSS ir paveikslėlius. Aš apsimesiu, kad Jūs jau sukūrėte tokį failą, pavadinote jį offline.html ir įkėlėte į savo tinklapio šakninį aplanką.

Toliau, Jūs turite sukurti paprastą tekstinį failą ir įkelti jį į savo tinklapio šakninį aplanką, pavadinę jį .htaccess, perrašydami savo senąjį .htaccess failą:

RewriteEngine On
RewriteBase /$rewrite_base
RewriteCond %{REMOTE_HOST} !123\.123\.123\.123
RewriteCond %{REQUEST_URI} !offline\.html
RewriteCond %{REQUEST_URI} !(\.png|\.jpg|\.gif|\.jpeg|\.bmp|\.swf|\.css|\.js)$
RewriteRule (.*) offline.html [R=307,L]

Kaip matote, šį failą Jūs turite pakeisti trijose vietose:

  1. 123\.123\.123\.123  turite pakeisti savo IP adresu. Rašant savo IP adresą prieš taškus reikia naudoti pasvirusio brūkšnio simbolį. Taip pat IP adreso pradžioje reikia įrašyti šauktuką.
  2. offline\.html yra statiškas Jūsų HTML puslapis, prieš tašką įrašant pasvirusį brūkšnį.
  3. offline.html vėlgi yra Jūsų HTML failo pavadinimas, tik šiuo atveju neberašykite pasvirusio brūkšnio!

Pastaba: jeigu įkėlus aukščiau minėtą failą Jūsų tinklapis grąžina tuščią puslapį arba Internal Server Error 500, pakeiskite R=307 į R (be =307 dalies). Tai būtina tik su Apache 2.0 ir 1.3 varomais tinklapiais, kadangi šios senesnės verijos nepalaiko R=307 žymės peradresavimo taisyklėse.

Kai tik Jūs įkelsite šį .htaccess failą, veiksmas vyks pagal šį scenarijų: jei į tinklapį kreipiamasi iš Jums nepriklausančio IP adreso, lankytojas bus nukreiptas į offline.html puslapį pažymint jį specialiu laikino nukreipimo HTTP būsenos požymiu (būtent tai atlieka žyma R=307 ir ji reikalinga tam, apsaugotų paieškos sistemas nuo išprotėjimo, kai jos atsitrenkia į Jūsų tinklapį saugančią akliną sieną). Tačiau PNG, JPG, GIF, BMP, SWF, CSS ir JS failai gali būti naudojami offline.html faile be jokių apribojimų.

Testuoti galima labai paprastai. Kai Jūs pats bandysite prisijungti prie savo tinklapio, neturėtume justi jokio skirtumo. Bet jei tam naudosite įrenginį, kuris internetą pasiekia per kitą maršrutizatorių, pvz. mobilų įrenginį, naudojantį 3G ryšį, turėtumėte pamatyti offline.html puslapį.

Dabar Jūs nugalėtojas! Dabar galite tvarkyti savo tinklapio saugumo spragas nebijodami, kad jis tuoj pat vėl bus nulaužtas to paties įsibrovėlio.

Ar Joomla! gali būti patobulinta?

Ir taip, ir ne. Pradedantiesiems, siūlomas metodas yra paprastas problemos apėjimas, tai nėra sprendimas. Jis veikia tik apie 60% serverių - tai Apache rinkos dalis. Kiti 40% šiuo būdu negali būti apsaugoti. Taigi, aš nemanau, kad Joomla! privalėtų naudotį aukščiau aprašytą sprendimą savo branduolyje. Ji apibrėžiama kaip labai lanksti turinio tvarkymo sistema, galinti veikti praktiškai bet kurio tipo serveryje.

Vis dėlto, yra kai kas, ką būtų galima padaryti. Tiesiog reikėtų perkelti "off-line" režimo patikrinimo eiliškumą index.php faile. Jei tinklapis yra "off-line" režime, tinklapyje nėra prisijungusio Super Administratoriaus ir bandymas pasiekti tinklapį neturi nieko bendra su Super Administratoriaus bandymu prisijungti, tiesiog nevykdyti jokio kodo. Tiesiog parodyti išjungto tinklapio puslapį.  Bet kuriuo kitu atveju (pvz. "off-line" režime esant prisijungusiam Super Administratoriui), kodą vykdyti būtų leidžiama.

Tai būtų paprasčiausia pasaulyje modifikacija ir fantastiškas patobulinimas Joomla! saugumui. Ar yra norinčių "įvaikinti" šią idėją ir paversti ją sistemos lopu?

Šio straipsnio autorius yra Nicholas K. Dionysopoulos, rašantis straipsnius apie saugumą Joomla! Community Magazine. Originalų straipsnį anglų k. rasite čia - "How off-line is Joomla!'s off-line mode?".


Aptarkite šį straipsnį forume
Norėdami dalyvauti diskusijoje turite prisijungti arba užsiregistruoti .

Joomla123.lt is not affiliated with or endorsed by Open Source Matters or the Joomla! Project.
The Joomla!® name is used under a limited license from Open Source Matters in the United States and other countries.