PHP lokalaus failo įterpimo gudrybės
Tomas Lažauninkas, 2009-02-22 21:30:41

PHP yra bene populiariausia programavimo kalba WEB sferoje, taip pat ji bene populiariausia ir hakerių scenoje, dėl smarkiai paplitusių, išskirtinai PHP būdingų pažeidžiamumų. Turbūt daugeliui teko susidurti arba bent girdėti apie nutolusio failo įterpimo (remote file include) ataką PHP WEB aplikacijose. Galimybė vykdyti nutolusį PHP kodą buvo ir yra naudojama kone tik įsilaužėlių, todėl naujausiose PHP interpretatoriaus versijose gamintojai nusprendė pagal nutylėjimą išjungti konfigūracinio failo opciją, atsakingą už galimybę vykdyti nutolusį PHP kodą. Tačiau egzistuoja būdai, kaip pasinaudojant lokalaus failo įterpimo pažeidžiamumais, galima vykdyti norimą PHP kodą atakuojamoje sistemoje.

Turbūt pats populiariausias būdas pasinaudojant lokalaus failo įterpimo pažeidžiamumu vykdyti norimą PHP kodą yra taip vadinamas registracijos žurnalų nuodijimas: įsilaužėlis gali patalpinti norimą vykdyti kodą užklausų registravimo žurnaluose, pasinaudodamas tiek failų pavadinimais, tiek suklastodamas HTTP antraštės „User Agent“ laukelį. Kitas žingsnis, kurį turi padaryti įsilaužėlis - tai „sušerti“ užnuodytą registracijos žurnalo failą pažeidžiamam skriptui, o kad tai padarytų, jam reikia žinoti kelią iki registracijos žurnalo failo. Nors kartais naudojami standartiniai keliai, tačiau įvertinant lanksčias Apache web serverio konfigūracines galimybes ir administratorių kūrybiškumą, tokios situacijos tikimybė žymiai sumažėja. Todėl įsilaužėlis gali pasitelkti Linux operacinės sistemos privalumais. Konkrečiai kalbėsime apie „/proc“ failinę sistemą, kurioje saugoma įvairiausia informacija apie sistemoje veikiančius procesus. „/proc“ struktūroje yra speciali direktorija „/proc/self“, kuri yra simbolinė nuoroda į saugomą informaciją apie esamą procesą. Šiuo atveju mus labiausiai domina direktyva „/proc/self/fd“ kurioje saugoma su esamuoju procesu susieti failų deskriptoriai. Šie failų deskriptoriai mums suteikia tiesioginį priėjimą prie failų su kuriais dirba WEB serverio procesas - todėl atspėjus tinkamą failų deskriptorių mes turime galimybę skaityti Apache registravimo žurnalus.

Atspėjus tinkamą failo deskriptoriaus numerį belieka įterpti norimą vykdyti PHP kodą į užklausą. Kaip minėjau, tai patogiausia atlikti pasitelkiant HTTP antraštės „User agent“ laukelį. Įterpiame:

<? system($_GET[cmd]); ?>

Dar viena galimybė apeiti PHP apribojimus atsiranda pasitelkus PHP sesijų failus. Naudojantis standartinėmis PHP sesijų funkcijomis laikinųjų failų direktorijoje sukuriamas failas ,kuriame talpinamas PHP masyvas su sesijos informacija. Žinant, jog dažnais atvejais vartotojas gali kontroliuoti sesijoje talpinamą informaciją ir žino kur saugomi laikinieji sesijų failai, įsilaužėlis gali panaudoti sesijų failus lokalaus failo įterpimo atakoje Laikinųjų failų direktorija daugeliu atvejų bus „/tmp“, belieka išsiaiškinti kokiu pavadinimu bus saugomas mūsų sesijos failas - PHP sesijų failai saugomi tokiu pavidalu „sess_[sesijos_id]“, tad belieka sužinoti sesijos identifikacinį numerį, kuris saugomas ir vartotojo pusėje – cookie‘je.

„Užnuodijus“ sesijos informaciją norimu PHP kodu belieka pateikti sesijos failą pažiedžiamam skriptui. Mūsų atveju testinėje sistemoje sesijų failai buvo saugomi direktorijoje „/var/lib/php/session/“ ir į sesiją įterpėme kodą: <? system($_GET[v]); ?>

Kartu su sesijos failo informacija matome ir mūsų įvykdytos komandos rezultatą . Šis būdas su sesijomis turi vieną privalumą prieš aprašytą aukščiau: naudodamiesi šiuo metodu, galime apeiti „open_basedir“ apribojimus, nes dažniausiai būna leidžiama prieiti prie laikinųjų failų direktorijos, o prie „/proc“ ne. Išnaudojant lokalaus failo įterpimo pažeidžiamumus ir pasitelkus vaizduotę galima rasti ne vieną būdą kaip žinomoje vietoje serveryje patalpinti norimą vykdyti kodą, ir tam gali pasitarnauti ne tik tiesiogiai su tuo susijęs WEB servisas, bet ir kiti serveryje veikiantys procesai.


Komentarai

Vardas:
Komentaras:

Copyright © 2005 - 2010, UAB „Critical Security“