• PHP安全编程:会话数据注入 比会话劫持更强大的攻击(转)


    一个与会话暴露类似的问题是会话注入。此类攻击是基于你的WEB服务器除了对会话存储目录有读取权限外,还有写入权限。因此,存在着编写一段允许其他用户添加,编辑或删除会话的脚本的可能。下例显示了一个允许用户方便地编辑已存在的会话数据的HTML表单:

    01 <?php
    02  
    03 session_start();
    04  
    05 ?>
    06  
    07 <form action="inject.php" method="POST">
    08  
    09 <?php
    10  
    11 $path ini_get('session.save_path');
    12 $handle = dir($path);
    13  
    14 while ($filename $handle->read())
    15 {
    16   if (substr($filename, 0, 5) == 'sess_')
    17   {
    18     $sess_data file_get_contents("$path/$filename");
    19  
    20     if (!empty($sess_data))
    21     {
    22       session_decode($sess_data);
    23       $sess_data $_SESSION;
    24       $_SESSION array();
    25  
    26       $sess_name substr($filename, 5);
    27       $sess_name = htmlentities($sess_name, ENT_QUOTES, 'UTF-8');
    28       echo "<h1>Session [$sess_name]</h1>";
    29  
    30       foreach ($sess_data as $name => $value)
    31       {
    32         $name = htmlentities($name, ENT_QUOTES, 'UTF-8');
    33         $value = htmlentities($value, ENT_QUOTES, 'UTF-8');
    34         echo "<p>
    35               $name:
    36               <input type="text"
    37               name="{$sess_name}[{$name}]"
    38               value="$value" />
    39               </p>";
    40       }
    41  
    42       echo '<br />';
    43     }
    44   }
    45 }
    46  
    47 $handle->close();
    48  
    49 ?>
    50  
    51 <input type="submit" />
    52 </form>

    脚本inject.php执行由表单所指定的修改:

    01 <?php
    02  
    03 session_start();
    04  
    05 $path ini_get('session.save_path');
    06  
    07 foreach ($_POST as $sess_name => $sess_data)
    08 {
    09   $_SESSION $sess_data;
    10   $sess_data = session_encode;
    11  
    12   file_put_contents("$path/$sess_name"$sess_data);
    13 }
    14  
    15 $_SESSION array();
    16  
    17 ?>

    此类攻击非常危险。攻击者不仅可以编辑你的用户的数据,还可以编辑他自己的会话数据。它比会话劫持更为强大,因为攻击者能选择所有的会话数据进行修改,从而使绕过访问限制和其他安全手段成为可能。

    针对这个问题的最好解决方案是将会话数据保存在数据库中。

  • 相关阅读:
    Spring Boot 无侵入式 实现 API 接口统一 JSON 格式返回
    Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合
    排名前 16 的 Java 工具类
    万字详解,JDK8 的 Lambda、Stream 和日期的使用详解
    这样规范写代码,同事直呼“666”
    Java多线程高并发学习笔记——阻塞队列
    零散的MySQL基础总是记不住?看这一篇就够了!
    Java 中自定义注解及使用场景
    最简单的6种防止数据重复提交的方法!
    选择数据库联系人【选择之后将不在列表】
  • 原文地址:https://www.cnblogs.com/xingmeng/p/3222997.html
Copyright © 2020-2023  润新知