|
|
|
|
News
|
vendredi 11 juillet | Vulnérabilité dans les sessions PHP (version < 4.3.2)
Source: php.net ¬ 7014 affichages
PHP a la possibilité d'inclure l'ID de session dans l'url d'une page web.
Cette option s'appelle "transparent SID support".
Il est possible de forcer la valeur de cet Id de session en utilisant le
parametre d'url PHPSESSID.
Php n'est pas tres méfiant vis a vis de ces valeurs, et fait tres peu de
travail de validation sur ce qu'il recoit de cet Id de session forcé.
En combinaison avec l'absence d'encodage URL et de HTML dans les sessions dont
l'ID est genéré automatiquement, on se retrouve dans une situation de
vulnerabilité aux attaques de type cross-site scripting.
Details
-------
Sur un site vulnérable, l'url suivante peut aboutir a la génération d'une page
web contenant le javascript inclu a la fin de l'URL générée :
http://www.sitevulnerable.exemple/index.php?PHPSESSID="><script>...</script>
Cette page générée par PHP va inclure les tags html de la facon suivante :
<a href="...?PHPSESSID="><script>...</script>
On note que la fermeture prématurée du tag est provoquée par l'injection d'une
guillemet suivie des tags <script>....</script> contenant du code javascript.
Un attaquant peut duper une victime qui visite une telle URL et arriver a
détourner son ID de session, rediriger sur un faux formulaire de login et
ainsi obtenir un acces au mot de passe, modifier le texte de la page, etc..
Ceci est possible meme si PHP est configuré avec les magic_quotes_gpc (qui
ajoutent automatiquement un backslash devant les guillemets).
En effet, l'attaquant peut par exemple utiliser javascript pour construire une
chaine ...
String.fromCharCode(65,66,67)
.. comme substitut de la chaine constante
"ABC"
.. afin d'éviter les doubles guillemets qui seraient échappées par PHP.
Pourtant la double guillemet initialement utilisée pour fermer le tag et
injecter le javascript fonctionnera quelle que soit la valeur assignée au
parametre magic_quotes_gpc, ce qui est normal étant donné que le backslash
n'est pas un caractere d'échappement en html (question de contexte).
Note : PHP peut accepter ou ne pas accepter le javascript comme étant un ID de
session valide, cela dépend de la valeur du parametre session.save_handler qui
est spécifiée dans le php.ini.
Mais ca n'est pas grave, que la session soit créée ou pas, PHP affichera dans
tous les cas l'ID, meme s'il est invalide, comme partie de la page web générée.
Solutions
---------
La meilleur solution est de désactiver le support pour le transparent SID.
Dans tous les cas les valeurs sensibles comme l'ID de session ne devraient
__JAMAIS__ etre inclus dans l'URL.
Le support pour le transparent SID peut etre désactivé en ajoutant cette ligne
dans le php.ini :
session.use_trans_sid=0
En revanche si le support pour le transparent SID est nécéssaire pour assurer
le bon fonctionnement d'un applicatif, il est fortement recommandé de mettre a
jour php avec une version qui n'est pas affectée par ce bug.
Si une mise a jour n'est pas possible, le probleme peut etre reglé en forcant
un encodage URL sur l'output des ID de session, et c'est exactement ce que les
developpeurs du langage PHP on fait sur l'arbre CVS.
En éditant le fichier source PHP ext/session/session.c a la ligne qui contient
ceci :
php_url_scanner_add_var(PS(session_name), strlen(PS(session_name)),
PS(id), strlen(PS(id)), 0 TSRMLS_CC);
et en remplacant "0" par "1" comme ceci :
php_url_scanner_add_var(PS(session_name), strlen(PS(session_name)),
PS(id), strlen(PS(id)), 1 TSRMLS_CC);
puis recompiler et reinstaller PHP (redemarrer le serveur web, patati, patata)
Notification
-------------------
Les développeurs du langage PHP ont été notifiés le 19 février 2002.
Le fix est dispo sur le CVS depuis le 20 février 2003 ("added URL encoding of
the session ID).
La premiere RC contenant le fix était la 4.3.2RC1 (13 mars 2003)
Versions touchées
-----------------
Versions 4.3.0 et 4.3.1 avec le php.ini contenant
session.use_trans_sid=1
Versions 4.2.0 a 4.2.3 sans php.ini, ou avec php.ini contenant
session.use_trans_sid=1
(les php.ini-dist et php.ini-recommended issus du package "PHP source
distribution" contiennent use_trans_sid=1 depuis 4.2.0 jusqu'a 4.2.2, et
use_trans_sid=0 pour la 4.2.3 et versions suivantes.)
Versions précédentes a 4.2.0 compilées avec --enable-trans-sid et avec
session.use_trans_sid=1
Versions intouchables
---------------------
Version 4.3.2RC1 et suivantes.
Credits
-------
Notifié par Tommy Gildseth
Rapport par Sverre H. Huseby
Traduction par tobozo
Ref
---
SHH #5, 2003-05-11
Original Security Bulletin
tobozo ± Sécurité PHP
|
Ajouter un commentaire
|
Vos commentaires
|
|
» Aucun commentaire.
|
|
|
|
|
Copyright ©+ 2004 phpsecure.info - All the team - Coded by Charlie & tobozo
- Tous droits réservés - DeZign by PWD
- Powered By phpSecure(); Version 2.0 - Changelog -
phpSecure fait partie du webring PHP Francophone
[
Rejoindre le webring |
Sites du webring |
Sites au hasard |
<< Précédent |
Next >> ]
|
|
|
|