Michał Środek

Po prostu devBlog

Witaj na srodek.info

Jest to blog poświęcony nowoczelnym technologiom ułatwiającym tworzenie aplikacji internetowych. Znajdziesz tutaj porady na temat CSS3, JavaScript, designu, web-usability, standardów W3C.

Cześć! Nazywam się Michał Środek. Z zawodu programista php, z zamiłowania gitarzysta oraz fanatyk GNU/Linuksa(openSUSE® w laptopie). W branży aplikacji internetowych od 9 lat. Prywatnie bez dzieci i kota.

Pracuję wciąż nad własnym elastycznym i wydajnym frameworkiem MVC, kilkoma portalami internetowymi oraz mniejszymi bibliotekami php. Czekam na wasze opinie, zgłoszenia błędów oraz pomysły na dalszy rozwój.

Ta część strony jest w trakcie budowy a moje prace tymczasowo niedostępne.

W przypadku pytań, ofert pracy oraz ciekawych pomysłów proszę się ze mną kontaktować. Możesz mnie znaleźć i wysłać PW na php.pl(SHiP), jamendo.com(michalsrodek), goldenLine.pl, facebook.com lub nk.pl

20 Luty 2010

Czym jest LFI?

Filed under: Bezpieczeństwo,PHP — Michał Środek @ 18:53

Zają­łem się ostat­nio w ana­lizą kon­fi­gu­ra­cji PHP oraz spraw­dza­niem w jakich oko­licz­no­ściach jest moż­liwe dołą­cze­nie lub pod­glą­da­nie pli­ków php znaj­du­ją­cych się na ser­we­rze. W kilku arty­ku­łach posta­ram się wyja­ścić więk­szość zna­nych mi tech­nik. Roz­pocznę od dosyć pro­stych i oczy­wi­stych, a w kolej­nych czę­ściach będę pod­no­sił poprzeczkę uspraw­nia­jąc kon­fi­gu­ra­cję ser­wera. Dzi­siaj zapre­zen­tuję na czym polega atak LFI(Local File Inc­lu­sion) pole­ga­jący na uru­cha­mia­niu pliku dostęp­nego na ser­we­rze.

Na atak są podatne strony wyko­rzy­stu­jące takie funk­cje jak np. file(), file_get_contents(), inc­lude(), include_once(), requ­ire() i inne czy­ta­jące dane z jakie­goś pliku. Ważne aby w paramtr okre­śla­jący adres czy­ta­nych zaso­bów był zależny od jakiejść zmien­nej prze­sła­nej przez użyt­kow­nika. Przykładowy(bardzo popu­larny) kod:

include('strony/'.$_GET['page'].'.html');

Atak działa podob­nie jak SQL Injec­tion. Musimy tak spre­pa­ro­wać adres aby odno­sił się on do innego pliku. Spró­bujmy wpisać:

example.com?page=../index

Skrypt powi­nien wczy­tać plik strony/../index.html czyli po pro­stu index.html. Pro­blem sta­nowi roz­sze­rze­nie okre­ślone z góry przez pro­gra­mi­stę. Gdy­by­śmy się go pozbyli, moż­liwe byłoby dołą­cze­nie dowol­nego pliku, do któ­rego posia­damy upraw­nie­nia. Zasta­nówmy się jed­nak w jaki spo­sób dzia­łają powyż­sze funk­cje. Wiemy, że PHP jest pisany w C. Jako para­metr poda­jemy ciąg zna­ków. Każdy pro­gra­mu­jący w C wie, że stringi w tym języku to po pro­stu tablice zna­ków wyglą­da­jące następująco:

Jakis ciag znakow\0

Zna­kiem który okre­śla zakoń­cze­nie napisu jest znak zero. Jest to spo­wo­do­wane tym, że tablica może mieć więk­szy roz­miar niż dłu­gość napisu. Jezyk C jest tak napi­sany, że sam nie zeruje war­to­śći w pamięci na które wska­zu­jemy więc brak znaku zero powo­do­wa­łoby wyświe­tla­nie „śmieci“ z pamięci. Tak więc dobrym pomy­słem byłoby wsz­cze­pie­nie znaku \0 do naszego zapy­ta­nia. Spró­bujmy wpi­sać w adre­sie strony coś takiego:

example.com?page=../index.php%00

Jak zin­ter­pre­tuje to PHP? Do funk­cji inc­lude() zosta­nie prze­ka­zany ciąg zna­ków strony/../index.php\0.html. Funk­cja inc­lude otrzy­mu­jąc w para­me­trze tablicę zna­ków wybie­rze wszyst­kie aż do znaku \0. W ten spo­sób koń­cówka .html zosta­nie uznana za śmieci z pamięci. Jak się chro­nić przed tym ata­kiem? Wystar­czy pro­sty test popraw­no­ści prze­sy­ła­nych danych:

if( preg_match('/^[a-zA-Z0-9]*$/', $_GET['page']) )
  include('strony/'.$_GET['page'].'.html');

Ogra­ni­cze­nia? Nie­stety możemy uru­cho­mić jedy­nie pliki znaj­du­jące się na ser­we­rze. Jest jed­nak kilka spo­so­bów aby sobie z tym pro­ble­mem pora­dzić. Następ­nym razem przed­sta­wię jak uru­cho­mić wła­sny kod PHP w przy­padku dziury przed­sta­wio­nej w tym arty­kule oraz błęd­nej kon­fi­gu­ra­cji serwera.

Dodaj arty­kuł do:

  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Gwar
  • Reddit
  • Technorati
  • Twitter
  • Wykop

Komentarzy: 6 »

  1. wyko­rzy­stu­jące taki funk­cje“ lite­rówka :)

    Komentarz by Hs2 — 20 lutego 2010, 19:54

  2. Szcze­rze? Kolejny raz, pozy­tyw­nie mnie zasko­czy­łeś :) Z nie­cier­pli­wo­ścią cze­kam na dal­szą część arty­ku­łów :)

    Komentarz by Hs2 — 20 lutego 2010, 19:58

  3. Chyba nie zaak­cep­to­wa­łeś komen­ta­rzy bo na stro­nie widać tylko Twoje ;)

    Komentarz by pfugiel — 12 marca 2010, 17:26

  4. Hmm, w któ­rym miej­scu? Ogól­nie Nie mam żadnych komen­ta­rzy oczekujących.

    Komentarz by Michał Środek — 12 marca 2010, 20:11

  5. Bar­dzo fajny arty­kuł :) cze­kam na kolejny

    Komentarz by Maxx — 5 kwietnia 2010, 1:51

  6. I’m looking for­ward to get­ting more infor­ma­tion about this topic, don’t worry about nega­tive opinions.

    Komentarz by Guests — 8 kwietnia 2010, 2:12

Kanał RSS z komentarzami do tego wpisu. TrackBack URL

Dodaj komentarz