Jacekk.info - O stronach internetowych wiemy wszystko

(Nie)bezpieczne skrypty

Jacek | 2005-10-09 17:07:40

Ile dziur w bezpieczeńswie mają nasze skrypty? Ile niebezpieczeństw niesie za sobą używanie baz danych? Wszystko postaram się opisać w tym artykule.


register_globals

to dyrektywa w pliku php.ini odpowiadająca za zamianę zmiennych predefiniowanych (czyli $_POST['abb'], $_GET['aab'] ...) na zwykłe (czyli $abb, $aab ...). Wydaje się bezpieczne, nieprawdaż? Pokażę teraz skrypt, który jest podatny na atak właśnie dzięki tej opcji:

<?php
if($haslo=='dobrehaslo') {
$zalogowano=1;
}

if($zalogowano==1) {
echo "Hasło poprawne!<br>Ważne dane to: ...";
}
?>

No i dobrze, wywołujemy skrypt z parametrem ?haslo=dobrehaslo - działa. A co jeśli uruchomimy skrypt z parametrem ?zalogowano=1 ? Skrypt pokaże ważne dane! To nie powinno mieć miejsca.

Wystarczy dopisać na początku:

$zalogowano = 0;

aby coś takiego nie zdarzyło się nam. Możemy spać spokojnie, jeśli register_globals jest ustawione na Off i używamy tablic globalnych


include

Ile razy widzieliśmy linki typu pokazdzial.php?id=dzial.php ? Twórcy zapewne nie trudzili się zbytnio i po prostu wklepali:

<?php
include($_GET['id']);
?>

Proste, a zarazem jakie niebezpieczne!

Przykładem będzie link (na porządnych serwerach taka próba nigdy się nie uda). Wywołaj plik w ten sposób:

pokazdzial.php?id=/etc/passwd

Jeśli serwer jest oparty o *niksa i nie jest odpowiednio zabezpieczony zobaczymy zakodowaną listę haseł (które i tak można złamać). Zabezpieczenie jest łatwe do wykonania - wystarczy przefiltrować dane pod kątem znaków / i

<?php
$a = array('', '/');
$b = array('', '');
include(str_replace($a, $b, $_GET['id']));
?>

Błędy

Raportowanie błędów w połączeniu z umieszczaniem plików .php pod rozszeżeniami .inc lub .class jest równie bezpieczne, co zostawienie pieniędzy w otwartym sejfie w pustym mieszkaniu na noc. Przykładem może być pewien serwis, który po padzie serwera generował komunikat z dokładnym miejscem przechowywania klas, które na dodatek miały rozszeżenie .inc Można było je dowolnie pobierać i oglądać.

Jak się zabezpieczyć? Przede wszystkim używać rozszeżenia .php dla skryptów oraz nie polegać na .inc i .class Ewentualnie blokować dostęp do tych rozszeżeń np. używając .htaccess

<Files ~ "^.rozszeżenie">
    Order allow,deny
    Deny from all
</Files>

Polecenia SQL

Ostatni podrozdział poświęcę wykonywaniu poleceń SQL i atakom SQL Injection

Na czym polega atak SQL Injection? Polega on na zmianie zapytania w dowolny sposób lub wykonaniu innego. Przykład:

<?php
mysql_connect('host', 'user', 'pass');
mysql_select_db('baza');

$wynik = mysql_query("SELECT * FROM `zwykle_i_wazne_dane` WHERE `typ`='".$_GET['id']."';");
?>

Niby zwykłe zapytanie, ale wykonane poprzez

?id=zwykle' OR '1'='1

zmieni zapytanie w

SELECT * FROM `zwykle_dane` WHERE `typ`='zwykle' OR '1'='1';

pokazując przy okazji ukryte dane.

A wystarczy tylko zmienić

$_GET['id']

na

addslashes($_GET['id'])


Menu

Strona

Artykuły

Przydatne kody

Skrypty PHP

Programy

Oferta

Informacje

Poprawny XHTML 1.1

Linki

© by Jacek Kowalski
Sponsor: Oxy.pl