安全矩阵

 找回密码
 立即注册
搜索
查看: 3601|回复: 0

PHP安全:会话攻击安全防御

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-9-22 20:49:17 | 显示全部楼层 |阅读模式
原文链接:PHP安全:会话攻击安全防御

HTTP是一种无状态性的协议,Cookie是作为HTTP的一个扩展而诞生的,其主要用途是弥补HTTP的无状态特性,提供了一种保持客户端与服务器端之间状态的途径。为了维持来自同一个用户的不同请求之间的状态,客户端必须发送唯一的身份标识符(Session ID)来表明自己的身份。图1所示为HTTP的Cookie传递。


图1  HTTP的Cookie传递

一直以来,很多研发人员认为PHP内置的会话管理机制是安全的,可以对一般的Session攻击起到防御作用。事实上,PHP内置的会话管理机制并没有提供安全措施。具体的安全措施,应该有应用程序的研发团队来实施。恶意攻击者可以通过服务器系统漏洞非法获取服务器上的Session信息,即会话泄露(Session leak)。恶意攻击者通过伪造客户端请求发起的Session攻击手段主要有会话劫持(Session hijacking)和会话固定(Session fixation)两种。

1、会话泄露

在PHP项目中,通常把一些个人信息和敏感数据保存在Session信息中,会话数据一般以文件形式保存在服务器上,例如\tmp目录,或者以数据形式保存在Redis、Memcache、MySQL中。

如果数据库或文件目录被攻陷,这些存储的会话就会暴露给攻击者。在存储会话之前对会话数据进行加密处理是很有必要的。可以使用session_set_save_handler()函数来进行自定义会话机制的加密存储和解密读取,以避免Session泄露造成的进一步损失。

下面是一段使用session_set_save_handler()函数进行的自定义会话处理。

<?php
$session=null;
// 加密函数
function encrypt($data) {
// 将$data加密并返回
return $data;
}
// 解密函数
function decrypt($data) {
// 将$data解密并返回
return $data;
}
// 打开会话,将Session数据存入redis
function open_session() {
global $session;
$session=newRedis
$session->connect('127.0.0.1',6379);
}
// 关闭会话
function close_session() {
global $session;
$session->close();
}
// 读取会话
function read_session($sid) {
global $session;
$data=$session->get($sid);
return decrypt($data); // 解密
}
// 写入会话
function write_session($sid,$data) {
global $session;
$session->set($sid,encrypt($data)); // 加密
}
// 销毁会话
function destroy_session($sid) {
global $session;
$session->set($sid,null);
}
// 注册Session管理函数
session_set_save_handler('open_session','close_session','read_session','write_session','destroy_session','clean_session');
// 开启Session
session_start();

2、会话劫持

会话劫持(Session hijacking)是指攻击者利用各种手段获取目标用户的Session ID。一旦获取到Session ID,那么攻击者就可以利用目标用户的身份来登录网站,获取目标用户的操作权限。会话劫持的第一步是取得一个合法的会话标识来伪装成合法用户,因此要达到防御目的就需要保证会话标识不被泄露。

会话劫持流程如图2所示。

图2  会话劫持流程

(1)网站用户登录网站服务器。


(2)登录成功后,该用户得到网站提供的一个会话标识符Session ID。

(3)攻击者劫持用户的Session ID(例如通过XSS漏洞)。

(4)攻击者通过劫持到的Session ID访问网站,可获取该用户的所用信息。一般攻击者非法获取用户Session ID的方法有以下几种。

1)暴力破解:尝试各种Session ID,直到破解为止。

2)计算:如果Session ID使用非随机的方式产生,那么就有可能计算出来。

3)窃取:使用网络截获、目录泄露、XSS攻击等方法获得。

3、会话固定

会话固定(Session fixation)是攻击者利用服务器的Session不变机制,向受害者发送固定的Session ID,受害者使用固定的Session ID与服务器进行交互,攻击者以此来获得用户权限的过程。如在浏览器中禁止掉Cookie,这种情况下,会话状态信息只能通过URL中的参数来传递到服务器端。这种方式的安全性很差,很容易发生会话固定攻击。

会话固定流程如图3所示。

图3  会话固定流程

(1)攻击者通过某种手段向目标用户发送Session ID。

(2)用户携带攻击者的Session ID进行登录。

(3)攻击者通过固定的Session ID获得会话,获取用户权限和信息。

为了防止被恶意攻击者利用,在用户登录成功后应该使用session_regenerate_id()函数重新创建一个Session ID,销毁旧的Session ID。

bool session_regenerate_id([bool $delete_old_session=false])

$delete_old_session默认为false,该函数会重置当前会话的Session ID,原来Session中的数据不会发生变化,与原Session一样,而会新生成一个Session存储文件,原Session存储文件不会被即时删除。

如果指定参数$delete_old_session为true时,会重置当前会话的Session ID,会新生成一个Session存储文件,原Session存储文件会立即被删除。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-19 18:27 , Processed in 0.012163 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表