:: Backends RSS
:: Forum
:: Liens
:: Articles
:: Scripts
:: Téléchargements
:: Proposer une news
:: Faire un lien
:: Equipe
:: Nous écrire
:: Presse
PHPSecure, le retour.

A quand la trilogie ?
Remake parfait
Rien de nouveau
Ca peut pas marcher 2x
                   


Search SecurePHP

DMOZ ODP Search
Search with phpODP :

Google
Search with google

phpsecure.info
Web
 «? phpsecure(); ?»
Proposer une news
Afficher les dernieres news sur votre site
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
Auteur:
Email:
Titre:
Contenu:

+ En ajoutant un commentaire, vous acceptez de fournir une adresse email valide
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 >> ]





















Online:

Chacun y est libre de ses actes. Or, la tendance naturelle des êtres humains est d'abuser de leur liberté, c'est-à-dire d'empiéter sur celle des autres. La plus grande menace sur la liberté, c'est la liberté elle-même. Comment défendre la liberté contre elle-même ? En garantissant à tous la sécurité. La sécurité, c'est la liberté. La sécurité, c'est la protection. La protection, c'est la surveillance. La surveillance, c'est la liberté.

Jean-Christophe Rufin ( Globalia )