Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak uchronić strone przed hakerem ?
Forum PHP.pl > Forum > PHP
FireMan
Witam. Jeżeli pisze nie na temat, w złym dziale itp to BARDZO przepraszam smile.gif.

Mam takie pytanie. Czy znacie jakiś kody php które moge dodać do mojej stronki robie upload zdjęć coś ala imageshack.us i juz kolega z popisu 2 razy zhakował mi strone wgrał index.html i sie co innego pokazywało. Jak temu zapobiec ? Podobno w uploadzie nei ma zabezpieczeń i uploadnoł plik .html jako fote. Jak to zabezpieczyć ?
rodia
Jeśli ktoś ci tak zrobil to znaczy, że upload następuje do katalogu głównego - co jest błędem. Uploaduj zdjęcia do jakiegoś podkatalogu i po sprawie.
Poza tym podstawowa sprawa to kontrola rozszerzeń jakie są dozwolone. Jak uploadujesz plik to przecież jedna ze zmiennych w tablicy $_FILE to rodzaj pliku - tu sprawdzasz tym pliku no i po rozszerzeniu drugi raz.

Piszesz, że w uploadzie nie ma zabezpieczeń. A jak to sobie wyobrażasz? PHP ma mieć wbudowany mechanizm ochrony przed uploadem niektorych plikow? Kto zdecyduje jakich? Programista ma decydować i implementować zabezpieczenia. Potrzeby uploadu są tak szerokie, że PHP nie może ot tak sobie wbrew woli programisty zabronić uploadu np. pliku index.html.
FireMan
zdjęcia są uploadowane do pod katalogu /files/
rodia
W takim razie jak to możliwe, że zamiast pliku index.html jest wyświetlany plik files/index.html ?
No coś nie tak z tego co mowisz. Serwer ładuje pliki index.htm index.html i index.php ale tylko z katalogu głównego.
Czy jesteś pewien że ten plik index.html wrzucono ci przez opcje uploadu a nie inaczej? Poza tym czy jest to kompletny plik index.html ? czy tylko ma taką nazwę a jego treść wstrzykuje sie w znaczniki IMG lub inne?
FireMan
Jestem pewny ze index.html był przez upload dodany ja a on ukrył zdjęcie w kodzie i jak zrobił to to nie wiem powinno byc w /files/index.html a poszło do katalogu głównego.
rodia
Powiedz mi skąd masz pewność, że przez upload?
Podaj link do tej strony, zobaczymy.
marcio
Albo nie miales zabezpieczonego katalogu nadrzednego albo zrobil przekierowanie lub nadpisal ci twoj index z katalogu glownego
FireMan
macie www.upload2.yoyo.pl taki prototyp ;p tam to dał jeszcze mi mowił ze ukrył w focie kod czy coś takiego.
marcio
Nie mam nawet jak pozmieniac naglowki na kompie od mamy nie posiadam livethttpheaders i nie chce mi sie go instalowac wiec nie pomoge a bez zmiany naglowkow masz zabezpieczone
FireMan
Sory może jestem nie kumaty ale możesz jaśniej biggrin.gif ?
marcio
Wrzucam jakis tam plik inny niz img i mam blad:
Cytat
Przepraszamy, Przepisy.rtf(application/octet-stream) wystapil blad.

To: application/octet-stream) wystepuje w naglowkach wysylanych i mozna nimi manipulowac i teraz moze to zadzialac jesli filtrujesz pliki na podstawie tego naglowka jesli na podstawie rozszerzenia nie zadziala.
FireMan
No łapie powoli ale jak to zabezpieczyć ?
marcio
Pokazujac nam kod.
FireMan
Macie:

<?php

$MAX_SIZE = 500000000000;

$FILE_MIMES = array('image/jpeg','image/jpg','image/gif','image/bmp');

$FILE_EXTS = array('.jpg','.gif','.jpeg','.bmp');

$DELETABLE = false;


$site_name = $_SERVER['HTTP_HOST'];
$url_dir = "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['php_SELF']);
$url_this = "http://".$_SERVER['HTTP_HOST'].$_SERVER['php_SELF'];

$upload_dir = "files/";
$upload_url = $url_dir."/files/";
$message ="";


if (!is_dir("files")) {
if (!mkdir($upload_dir))
die ("upload_files katalog nie istnieje.");
if (!chmod($upload_dir,0755))
die ("Blad.");
}



if ($_REQUEST[del] && $DELETABLE) {
$resource = fopen("log32.txt","a");
fwrite($resource,date("Ymd h:i:s")."DELETE - $_SERVER[REMOTE_ADDR]"."$_REQUEST[del]\n");
fclose($resource);

if (strpos($_REQUEST[del],"/.")>0);
else if (strpos($_REQUEST[del],$upload_dir) === false);
else if (substr($_REQUEST[del],0,6)==$upload_dir) {
unlink($_REQUEST[del]);
print "<script>window.location.href='$url_this?message=deleted successfully'</script>";
}
}
else if ($_FILES['userfile']) {
$resource = fopen("log32.txt","a");
fwrite($resource,date("Ymd h:i:s")."upload - $_SERVER[REMOTE_ADDR]"
.$_FILES['userfile']['name']." "
.$_FILES['userfile']['type']."\n");
fclose($resource);

$file_type = $_FILES['userfile']['type'];
$file_name = $_FILES['userfile']['name'];
$file_ext = strtolower(substr($file_name,strrpos($file_name,".")));

if ( $_FILES['userfile']['size'] > $MAX_SIZE)
$message = "Maksymalny rozmiar pliku 5MB.";

else if (!in_array($file_type, $FILE_MIMES)
&&!in_array($file_ext, $FILE_EXTS) )
$message = "Przepraszamy, $file_name($file_type) wystapil blad.";
else
$message = do_upload($upload_dir, $upload_url);

print "<script>window.location.href='$url_this?message=$message'</script>";
}
else if (!$_FILES['userfile']);
else
$message = "Nieprawidłowo określony plik.";


$handle=opendir($upload_dir);
$filelist = "";
while ($file = readdir($handle)) {
if(!is_dir($file) &&!is_link($file)) {
$filelist .= "<a href='$upload_dir$file'>".$file."</a>";
if ($DELETABLE) {
$delfile = $file;
$delfile = str_replace("%","%25",$delfile);
$delfile = str_replace("&","%26",$delfile);
$delfile = str_replace("+","%2b",$delfile);
$delfile = str_replace("?","%3f",$delfile);
$filelist .= " <a href='?del=$upload_dir".$delfile."' title='delete'>x</a>";
}
$filelist .= "<sub><small><small><font color=grey> ".date("", filemtime($upload_dir.$file))
."</font></small></small></sub>";
$filelist .="<br>";
}
}

function do_upload($upload_dir, $upload_url) {

$temp_name = $_FILES['userfile']['tmp_name'];
$file_name = $_FILES['userfile']['name'];
$file_name = str_replace("\\","",$file_name);
$file_name = str_replace("'","",$file_name);
$file_path = $upload_dir.$file_name;

//File Name Check
if ( $file_name =="") {
$message = "Nieprawidłowa nazwa pliku określonego";
return $message;
}

$result = move_uploaded_file($temp_name, $file_path);
if (!chmod($file_path,0777))
$message = "Blad.";
else
$message = ($result)?"Link do pliku: www.upload2.yoyo.pl/files/$file_name " :
"Błąd.";
return $message;
}
$sciezka = './banlista.php';
$lista_ip = file($sciezka);

foreach($lista_ip as $ip)
{
if(eregi(trim($ip), getenv('REMOTE_ADDR')))
{
die('Nie masz dostępu do tej strony. Twój adres został zbanowany.');
}
}
?>
<html>
<head>
<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
<title>
Upload zdjęć
</title>
</head>
<body>

<center>
<font color=blue><?=$_REQUEST[message]?></font>
<br>
<form name="upload" id="upload" ENCTYPE="multipart/form-data" method="post">
Wrzuć zdjęcie <input type="file" id="userfile" name="userfile">
<input type="submit" name="upload" value="upload">
</form>
Dozwolone rozszerzenia: <b>.jpg .jpeg .gif .bmp</b><br>
Maksymalna wielkosc pliku: <font color="red">5MB</font>

<br>
<br>
<div style='position: width=70%;'><img src="images/belka1.jpg"></div>
</center>
<div style='position: absolute; top: 30px; left: 930px;'><img src="images/beta.jpg"></div>
<div style='position: absolute; top: -300px; left: 0px;'><img src="images/belka2.jpg"></div>
<div style='position: absolute; top: -300px; left: 1400px;'><img src="images/belka2.jpg"></div>
</body
</html>
pyro
oto i przyczyna

  1. <?php
  2. $file_type = $_FILES['userfile']['type'];
  3. $file_name = $_FILES['userfile']['name'];
  4. $file_ext = strtolower(substr($file_name,strrpos($file_name,".")));
  5.  
  6. if ( $_FILES['userfile']['size'] > $MAX_SIZE)
  7. $message = "Maksymalny rozmiar pliku 5MB.";
  8.  
  9. else if (!in_array($file_type, $FILE_MIMES)
  10. &&!in_array($file_ext, $FILE_EXTS) )
  11. $message = "Przepraszamy, $file_name($file_type) wystapil blad.";
  12. else
  13. $message = do_upload($upload_dir, $upload_url);
  14. ?>
FireMan
No dzięki ale jak teraz to naprawić tą przyczyne bo nie jestem w php PRO biggrin.gif ja sie ucze dopiero i nie wiem jak sory za kłopoty.
marcio
Zamien kod wyzej na cos takiego:
  1. <?php
  2. $file_name = $_FILES['userfile']['name'];
  3. $file_ext = explode('.', $file_name);
  4. $file_ext = $file_ext[count($file_ext)-1];
  5.  
  6. if ( $_FILES['userfile']['size'] > $MAX_SIZE)
  7. $message = "Maksymalny rozmiar pliku 5MB.";
  8.  
  9. else if(!in_array($file_ext, $FILE_EXTS)) $message = "Przepraszamy, $file_name($file_type) wystapil blad.";
  10. else do_upload($upload_dir, $upload_url);
  11. ?>

To tylko przyklad powinno dzialac
michalkjp
Jeśli chcesz robić coś takiego, to _proponuję_ zapoznać się z tym dokumentem, bo jest w nim _wiele_ _użytecznych_ wskazówek.

http://www.scanit.be/uploads/php-file-upload.pdf
lwc
Rzeczywiście, upload jest podatny. Aby wgrać shella wystarczy manipulacja nagłówkami przez live http headers. Oto rezultaty: Screen

PS.
Shell został oczywiście usunięty z wiadomych powodów. Pozdrawiam.
FireMan
Cytat(marcio @ 5.10.2008, 00:16:28 ) *
Zamien kod wyzej na cos takiego:
  1. <?php
  2. $file_name = $_FILES['userfile']['name'];
  3. $file_ext = explode('.', $file_name);
  4. $file_ext = $file_ext[count($file_ext)-1];
  5.  
  6. if ( $_FILES['userfile']['size'] > $MAX_SIZE)
  7. $message = "Maksymalny rozmiar pliku 5MB.";
  8.  
  9. else if(!in_array($file_ext, $FILE_EXTS)) $message = "Przepraszamy, $file_name($file_type) wystapil blad.";
  10. else do_upload($upload_dir, $upload_url);
  11. ?>

To tylko przyklad powinno dzialac


I teraz co chce uploadować to pisze ze błąd.
pyro
Cytat(michalkjp @ 5.10.2008, 00:29:02 ) *
Jeśli chcesz robić coś takiego, to _proponuję_ zapoznać się z tym dokumentem, bo jest w nim _wiele_ _użytecznych_ wskazówek.

http://www.scanit.be/uploads/php-file-upload.pdf


gdybym mogl to ja bym ci dal plusa bo jakis czas temu szukalem tego dokumentu ;p

soory za offtop

// ADD

FireMan, najlepiej nadawaj plikowi nową nazwę zdefiniowaną przez system, zamiast polegac na nazwie pliku z tablicy $_FILES
michalkjp
Cytat(pyro @ 5.10.2008, 11:48:31 ) *
bo jakis czas temu szukalem tego dokumentu ;p


Warto przeczytać ten dokument i zrozumieć o co w nim chodzi, bo licho (nie hackerzy, tylko pryszczate nastolatki z nadmiarem wolnego czasu) nie śpi winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.