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.
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
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']));
?>
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>
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'])
© by Jacek Kowalski
Sponsor: Oxy.pl