[ booo @ 10.01.2009. 01:13 ] @
Pre nakoliko dana sam imao upad na moj sajt od strane arapskih hakera... Sajt je unisten a to sve zbog nekih propusta u php upload codu... Iz flasha sam pozivao php koji je uploadovao fajl na moj server a php kod izgleda ovako:

Code:

<?
function parse_dir( $folder,$fileFilter,$folderFilter,$showPath ){
    
    if( is_array( $folderFilter ) && in_array( $folder,$folderFilter ) ) return;
    
    $dir         = @opendir( $folder );    
    $fname         = array_pop( explode( "/",$folder) );
    $fname         = empty( $fname ) ? "node" : str_replace( " ","_",$fname );
    $path_parts = pathinfo(realpath( $folder ));
    $path         = ( $showPath ) ? " fullpath=\"".realpath( $folder )."\"" : "";
    $filecount     = 0;
    $foldercount = 0;
    $xml         = "";
    
    while ( false != ( $item = @readdir( $dir ) ) ) {        
        if( $item == "." || $item == ".." ) continue;
        if( is_dir( "$folder/$item" ) ){
            $xml.= parse_dir( "$folder/$item",$fileFilter,$folderFilter,$showPath );
            $foldercount++;
            continue;
        }        
        $ftype = array_pop( explode( ".", strtolower( $item ) ) );
        $goodfile = is_array( $fileFilter ) ? !in_array( "$folder/$item",$fileFilter ) : true;
        if ( $goodfile ) {            
            $xml.= "<node label='".$item."'/>";
            $filecount++;            
        }
    }    
    
    $xml = "<node label=\"".strToUpper($fname)."\" folders=\"$foldercount\" files=\"$filecount\"$path>$xml</node>";    
    return $xml;

}

// GET FOLDER INFO:
$basedir = "./"; //current dir as default

$showFullPath = true;

// WRITE OUT XML:
header( 'Cache-Control: no-cache' );
header( 'Pragma: no-cache' );
header( 'User-Agent: XS3_XMLFILEStructure_Script' );
header( 'content-type: text/xml' );
die( parse_dir( $basedir,$excludeFiles,$excludeFolders,$showFullPath ) );
?>


Zna li neko gde sam napravio propust i kako zastititi ovaj php?


[Ovu poruku je menjao booo dana 10.01.2009. u 02:30 GMT+1]
[ Miroslav Ćurčić @ 10.01.2009. 10:13 ] @
Ovo nije "upload kod", već skript koji ti prikazuje sadržaj nekog direktorijuma što je vrlo interesantno zlonamernim posetiocima. Pogotovo što bi kad unese "../../" kao prvi parametar možda mogao da ugrozi sve sajtove na serveru.
[ iizuzetan @ 11.01.2009. 07:13 ] @
Kolko ja znam unos fajlova na PHP sajt se vrsi preko HTML forme, i to vrlo bezbedno. Definisi tacno sta ti znaci to 'unisten sajt'? Kako to neznas gde ti je bezbednosna rupa a znas da ti je bas taj COD napravio probleme? Mnogo malo informacija si dao za krupan problem. ""Pogotovo što bi kad unese "../../" kao prvi parametar možda mogao da ugrozi sve sajtove na serveru"" - ha ha e kad bi to bilo moguce onda bi svaki sajt morao da ima svoj sopstveni server ha ha
[ Nemanja Avramović @ 11.01.2009. 10:08 ] @
iizuzetan, molim te da se malo informišeš pre nego što postaviš neku (u ovom slučaju netačnu) informaciju na forum. Istina je da se fajlovi šalju preko HTML forme, ali to je jako daleko od bezbednog. U ovoj poruci je mVeliki ostavio PDF fajl u kojem je detaljno objašnjeno kako treba kontrolisati upload fajlova i kako se i sa (ne tako) običnom GIF slikom može hakovati sajt ako se ne odrade potrebne provere.

Citat:
""Pogotovo što bi kad unese "../../" kao prvi parametar možda mogao da ugrozi sve sajtove na serveru"" - ha ha e kad bi to bilo moguce onda bi svaki sajt morao da ima svoj sopstveni server ha ha


Na ogromnoj većini shared hostinga PHP se vrti pod istim korisnikom za sve sajtove, tako da ima ravnopravan pristup svim fajlovima na serveru, tako da je ovo sa unosom ../../ putanje vrlo moguće i zato treba dosta pažnje obratiti i na to. Jedan drugar je uspeo sa servera b92.net sajta da skine fajl /etc/passwd preko skripte koja je forsirala download fajla koji se prosledi GET parametrom. Naravno - nije urađena nikakva provera i apsolutno svi fajlovi su mogli da budu skinuti preko te skripte, samo ako znaš putanju fajla na serveru. Naravno, ova skripta je sada zakripljena (zato uostalom i objavljujem ovaj propust)
[ iizuzetan @ 11.01.2009. 18:50 ] @
Kljucna globalna ali bukvalno kljucna za zastitu od unosa velicine fajlova koje nismo predvideli je $ _FILES [ 'Userfile'] [ 'size'] a mnogi je preskacu. Ako se sve odradi kako treba upload skripte mogu biti bezbedne. A to u vezi shared hostinga je tacno i postoje koliko toliko zakrpe :) http://phpsec.org/projects/guide/sr/5.html . Najbolje resenje je da se ima privatan host to je tacno
[ booo @ 12.01.2009. 00:49 ] @
A da ovo je bio php kod za prikaz a za upload je bio:
Code:

<?php
   if(!is_dir("./files")) mkdir("./files", 0755); 
   move_uploaded_file($_FILES['Filedata']['tmp_name'], "./files/".$_FILES['Filedata']['name']);
   chmod("./files/".$_FILES['Filedata']['name'], 0777);
?>

Ne znam koliko je ovo bezbedan kod...
Hakeri su uspeli da umesto naslovne strane stave svoju stranu koju sam stavio u prilogu i takodje u jednom folderu je bio Abbey logOn :)
[ Goran Rakić @ 12.01.2009. 02:11 ] @
Ovaj poslednji kod omogućava upis proizvoljne datoteke i van "files/" jer ako se kao ime prosledi "../index.php", datoteka će biti upisana kao "./index.php" umesto kao "files/index.php", ako to dozvole omogućavaju.

Moraš da pozoveš basename() nad $_FILES['Filedata']['name'], a preporuka ti je da središ i dozvole (chmod nad datotekom je ovde suvišan, a korenski direktorijum ne bi smeo da dozvoli upis korisniku pod kojim se izvršava PHP kod).

Naravno, ni to neće biti dovoljno jer šta hakera sprečava da u files/ smesti PHP skriptu koju će onda da pozove i pobriše ti sve, izmeni datoteke i slično. Zato moraš da proveriš i ekstenziju/sadržaj, odnosno zabraniš izvršavanje datoteka iz direktorijuma "files/".

Kao što ti je već odgovoreno, ni onaj prvi kod nije bezazlen. Idealan je za krađu lozinki od skripti, baza, i traženje drugih propusta po kodu pošto dozvoljava preuzimanje bilo koje datoteke koju PHP može da pročita sa servera.
[ booo @ 12.01.2009. 13:04 ] @
A zasto ne bih stvio username i password koje cu da predam php-u preko get ili post metoda? Tako niko nece mocu nista da radi bez username-a i password-a...
[ Miroslav Ćurčić @ 12.01.2009. 17:28 ] @
Može i to, ali je bolja ideja problem rešavati na njegovom izvoru.

Dakle, prvo u skriptama pregledaj adresu tako da ako negde detektuješ ".." jednostavno iskoči iz skripte.
Kod druge skripte obavezno treba i proveriti tip datoteke.
Inače sve to imaš u onom PDFu koji smo ti preporučili.
[ pesal @ 16.01.2009. 22:59 ] @
a da ti neko nije slucajno uploadovao neki php fajl i onda ga jednostavno pokrenuo kroz browser?