Newsy|Artykuły|Projekty|Dodaj newsa|Dodaj na bugtraq|Rejestracja|Archiwum|Forum
PHP - Aspekty Bezpieczeństwa

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

1) Wprowadzenie.
2) (Nie)bezpieczeństwo wyświetlania wersji przeglądarki.
3) Sesje..

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

1)

W tym artykule postaram się przedstawić pare zagadnień z obszaru
bezpieczeństwa skryptów PHP, głównie na podstawie moich doświadczeń.
Postaram się aby rzeczy które tu przedstawie nie były kopią (małą zmianą)
innych publikacji, na temat ogólnego bezpieczeństwa w PHP
a raczej innym aspektem spojrzenia na tego typu zagadnienie.
Tak czy inaczej mam nadzieje że artykuł przedstawi coś nowego w tym temacie.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

2)

Jak wiadomo jednym ze sposób wyświetlenia na stronie wersji przeglądarki
użytkownika jest użycie zmiennej 'HTTP_USER_AGENT' w praktyce wygląda to tak:

- - -
<?
$user_agent = $_SERVER['HTTP_USER_AGENT'];
echo $user_agent;
?>
- - -

Skrypt ten wyświetli nazwę przeglądarki użytkownika na stronie.
Co więc jest niebezpiecznego w takim skrypcie?
A więc możemy wysłać w nagłówku 'User-Agent' kod XSS który zostanie wykonany.
Przedstawie teraz mniej więcej jak ma wyglądać taki nagłówek:

- - -
$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /tmp/index.php HTTP/1.0
User-Agent: &lt;script&gt;alert(document.cookie)&lt;/script&gt;
- - -

Oczywiście w telnecie nie zobaczymy co się stało ;-)
ale można użyć przeglądarki tekstowej typu lynx, links
aby kod javascript został wykonany.
Teraz pewnie ktoś by zadał pytanie 'Jak można to właściwie wykorzystać?'

A więc załóżmy że mamy na stronie takie skrypty:

- - -
<?
// index.php
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$dane = $_SERVER['REMOTE_ADDR']." - ".$user_agent." <br> \n";
$nazwapliku = 'log.txt';
if(isset($user_agent)) {
        $uchwyt = fopen($nazwapliku, 'a');
        fwrite($uchwyt, $dane);
        fclose($uchwyt);
        }
?>
- - -

- - -
<?
// admin.php
$nazwapliku = 'log.txt';
$uchwyt = fopen($nazwapliku, "r");
readfile("log.txt");
?>
- - -

Plik index.php zapisuje adres IP i nazwę przeglądarki do pliku,
admin.php po prostu odczytuje dane z pliku log.txt,
a następnie wyświetla je na stronie.
Wszystko działa prawidłowo.
Ale jeśli zmienimy nagłówek 'User-Agent' możemy zastosować atak 'html injection'
jak i 'XSS' co daje bardzo duże możliwości wykorzystania..

Co do zabezpieczeń, myśle że zastosowanie funkcji
'htmlspecialchars()' na '$_SERVER['HTTP_USER_AGENT']' będzie odpowiednie.

Wygląda to tak:

- - -
<?
$user_agent = $_SERVER['HTTP_USER_AGENT'];
echo htmlspecialchars($user_agent);
?>
- - -

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

2)

Pozwolę sobie zacytować:

"Gość wchodzący na twoją stronę WWW otrzymuje unikalny identyfikator, tzw. id sesji.
Jest ono przechowywane albo jako ciasteczko po stronie użytkownika
lub propagowane w URL'u." (C php.net)

Dość niedawno odkryłem dziwne zachowanie php gdy jako id sesji podamy 'złe znaki'
jak np: '@, !, #, ^' itd.. mianowicie php wyrzuca błąd przez co ujawnia ścieżkę
dostępu do pliku. Przykład:

- - -
<?
session_start();
?>
- - -

- - -
$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /tmp/index.php HTTP/1.0
Cookie: PHPSESSID=@
HTTP/1.1 200 OK
(...)
<b>Warning</b>:  session_start(): The session id contains invalid characters,
valid characters are only a-z, A-Z and 0-9 in <b>/var/www/htdocs/tmp/index.php</b>
on line <b>3</b><br />
<br />
<b>Warning</b>:  Unknown(): The session id contains invalid characters, valid characters
are only a-z, A-Z and 0-9 in <b>Unknown</b>
on line <b>0</b><br />
<br />
<b>Warning</b>:  Unknown(): Failed to write session data (files).
Please verify that the current setting of session.save_path is correct
(/tmp) in <b>Unknown</b> on line <b>0</b><br />
Connection closed by foreign host.
- - -

Oczywiście możemy się przed tym zabezpieczyć poprzez zmienną 'display_errors'
ustawioną na 'Off' lub też dodać '@' przed 'session_start()' co zmniejszy 'wyciek informacji'

Pozwoliłem sobie napisać prostego 'POC' exploita na ten błąd,
dostępny jest na stronie http://k3.int.pl/security/php_bug.pl

Co najdziwniejsze po opublikowaniu tego 'błędu?' na bugs.php.net
stwierdzone zostało że wcale nie jest to żaden bug.
Jak to zostało mniej więcej napisane.. wiekszość błędów wyświetla ścieżkę dostępu do pliku.
Problem w tym że użytkownik może napisać 'teoretycznie' prawidłowy kod który 'praktycznie'
nie będzie 100% bezpieczny a sam nie będzie o tym wiedział.
Jeśli stosuje 'obscurity' czyli np: ukrywa w ścieżce ważne nadrzędne katalogi
(z doświadczenia wiem że często tak się zdarza) tym bardziej tzw.
'Full Path Disclosure' będzie w tym przypadku niebezpieczny i możemy
uzyskać informacje do których nie powinniśmy mieć dostępu..


Autor:K3
Czytań: 8604
Data publikacji: 2006-01-12 23:02:58


Copyrights 2002 - 2009 © CC-Team.org design by fre3ke. Hosted by Net1.pl