編程學習網 > PHP技術 > PHP安全 > PHP安全-會話注入
2016
03-15

PHP安全-會話注入

會話注入

  一個與會話暴露類似的問題是會話注入。此類攻擊是基于你的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();

 

  ?>

 

  此類攻擊非常危險。攻擊者不僅可以編輯你的用戶的數據,還可以編輯他自己的會話數據。它比會話劫持更為強大,因為攻擊者能選擇所有的會話數據進行修改,從而使繞過訪問限制和其他安全手段成為可能。

  針對這個問題的最好解決方案是將會話數據保存在數據庫中。參見前節所示。

 

掃碼二維碼 獲取免費視頻學習資料

Python編程學習

查 看2022高級編程視頻教程免費獲取