|
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: <script>alert(document.cookie)</script>
- - -
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
|
|