Php hacking: Local File Inclusion

Local file inclusion er en annen metode php applikasjoner kan hackes med. Det er en av de mest utbredte sårbarhetene som fins på internett.

Rundt om på internett ser man lenker sånn som det her:


http://yay.com/index.php?side=kontakt.php

Det som skjer her, er en inkludering. Veldig ofte har man en mappe på nettstedet som heter f.eks. “includes”. Inni den mappen pakker man masse filer:
kontakt.php
om.php
login.php
info.php

Det som da skjer, når brukeren går til:

index.php?page=login.php

Er at login.php blir inkludert i php. Det er en slags klipp og lim sak i php, så slipper man å endre designet på alle filer, hver gang man skal oppdatere designet. Eller endre på struktur/lenker og slikt.

All php kode som ligger i login.php, blir derfor lagt inn i index.php.

Her er et eksempel på et inkluderingsscript:

$page = $_GET['page'];
include("includes/$page");

Som du ser her, legges “includes” til i starten. Dette medfører at bare filer som ligger på nettstedet kan inkluderes. Dette er forskjellen på local file inclusion. og remote file inclusion.

LES OGSÅ: Php hacking: Remote file inclusion

Ta inkluderingsscriptet ovenfor. La oss si en ondsinne hacker navigerer til denne lenken:


http://yay.com/index.php?page=../robots.txt

../ betyr “gå en mappe opp”. Scriptet går derfra vekk fra includes mappen, opp et hakk og includerer robots.txt.

Om du ikke vet hva robots.txt gjør, så er det en fil som forteller søkemotorroboter hvilke mapper og filer som ikke skal indekseres i deres søkemotor.

Dersom det er snakk om en linux server her, har du sikkert hørt om filen /etc/passwd. Det er en fil som inneholder kontoinformasjonen til alle brukerne på serveren. Den inneholder ikke passord, men ting som brukernavn, id, hvilket type shell de har osv.

La oss si den ondsinnede brukeren navigerer til denne lenken:


http://yay.com/index.php?page=../../../../../../../etc/passwd

Da vil /etc/passwd filen bli inkludert, og en local file inclusion har blitt gjort. Angriperen har fått tilgang til noe han ikke skal ha.

Kan dette føre kode injeksjon?
Ja. Dersom angriperen får lastet opp kode på serveren, vil kode kunne bli kjørt. Om f.eks. nettstedet tillater opplastning av bilder, kan et bilde inneholde php kode. Og da er det bare å inkludere bildet, og hackeren kan kjøre hvilken som helst php kode han vil.

En annen måte er å legge inn php kode i en loggfil på systemet, for deretter å inkludere loggfilen.

Løsningen
Løsningen er å ikke tillate forover slash i $_GET['page'].

Eksempel på hvordan dette kan gjøres:

if (!eregi("^((.*)/)", $filename)) {
// inkluder trygt her
}

Er ditt nettsted sårbart?

Del på Facebook
Del på Twitter
Legg til på Nettby









Dette innlegget ble skrevet på Thursday, September 17th, 2009. Og er lagret under PHP, Programmering, sikkerhet. Skumma gjennom av 1469 stykker.

3 Responses to “Php hacking: Local File Inclusion”

  1. Torstein on September 24th, 2009 at 1:07 am

    Å ikke tillate forover slash er ikke nødvendigvis godt nok.

    Mange har config-filer i samme mappe som php-scriptet, gjerne i .cfg/.ini/(.inc?) som inkluderes som ren tekst.

    Det beste er en switch case eller sjekke mot en array med tillatte nøkkelord.

  2. Jk on September 30th, 2009 at 9:47 pm

    Denner er nok ikke sikker nok :P

    hva om man bruker om du ikke har inkuderende script i egen mappe? Dette vil gi et sikkerhetshull, da du kan skrive bare “/” i unix, eller “C:/” på windows os.
    Skriver du C:/ u urlen har du tilgang til å se alle filene på c.

    Dessuden er eregi() funksjonen i php utdatert, og erstattes med den allerede eksisterende preg_match()

    Bruk denne koden heller, den er mye sikrere, og ikke minste støttet av php i fremtiden.

    preg_match(“/^([a-zA-Z]{1}\:)|[.]|^(\/)/”,$filename)

    denne vil gi utslag om filbanen begynner med boktav: (C:, D: osv.), eller har “./” i seg, ellerbegynner med “/”

    - jk

  3. Jk on September 30th, 2009 at 9:58 pm

    ops, sånn blir det vell :’)

    det skal vær låv å gå opp i mapper med punktum i seg, om det måtte være ønsket.

    preg_match(“/^([a-zA-Z]{1}\:)|[.*]\/|^(\/)/”, $filename);

Legg igjen en kommentar