PHP漏洞全解(七)-Session劫持
服务端和客户端之间是通过session(会话)来连接沟通。当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session。每个用户的session都是独立的,并且由服务器来维护。每个用户的session是由一个独特的字符串来识别,成为session id。用户发出请求时,所发送的http表头内包含session id 的值。服务器使用http表头内的session id来识别时哪个用户提交的请求。
session保存的是每个用户的个人数据,一般的web应用程序会使用session来保存通过验证的用户账号和密码。在转换不同的网页时,如果需要验证用户身份,就是用session内所保存的账号和密码来比较。session的生命周期从用户连上服务器后开始,在用户关掉浏览器或是注销时用户session_destroy函数删除session数据时结束。如果用户在20分钟内没有使用计算机的动作,session也会自动结束。
php处理session的应用架构
会话劫持
会话劫持是指攻击者利用各种手段来获取目标用户的session id。一旦获取到session id,那么攻击者可以利用目标用户的身份来登录网站,获取目标用户的操作权限。
攻击者获取目标用户session id的方法:
1)暴力破解:尝试各种session id,直到破解为止。
2)计算:如果session id使用非随机的方式产生,那么就有可能计算出来
3)窃取:使用网络截获,xss攻击等方法获得
会话劫持的攻击步骤
实例
//login.php session_start(); if (isset($_POST["login"])) { $link = mysql_connect("localhost", "root", "root") or die("无法建立MySQL数据库连接:" . mysql_error()); mysql_select_db("cms") or die("无法选择MySQL数据库"); if (!get_magic_quotes_gpc()) { $query = "select * from member where username=’" . addslashes($_POST["username"]) . "’ and password=’" . addslashes($_POST["password"]) . "’"; } else { $query = "select * from member where username=’" . $_POST["username"] . "’ and password=’" . $_POST["password"] . "’"; } $result = mysql_query($query) or die("执行MySQL查询语句失败:" . mysql_error()); $match_count = mysql_num_rows($result); if ($match_count) { $_SESSION["book"] = 1; mysql_close($link); header("Location: http://localhost/index.php?user=" . $_POST["username"]); } ….. // 打开Session 访客的 Session ID 是:echo session_id(); ?>
登录以后显示
开始攻击
//attack.php
php
// 打开Session
session_start();
echo "目标用户的Session ID是:" . session_id() . "
";
echo "目标用户的username是:" . $_SESSION["username"] . "
";
echo "目标用户的password是:" . $_SESSION["password"] . "
";
// 将book的数量设置为2000
$_SESSION["book"] = 2000;
?>
提交 http://localhost/attack.php?PHPSESSID=5a6kqe7cufhstuhcmhgr9nsg45 此ID为获取到的客户session id,刷新客户页面以后
session固定攻击
黑客可以使用把session id发给用户的方式,来完成攻击
http://localhost/index.php?user=dodo&PHPSESSID=1234 把此链接发送给dodo这个用户显示
然后攻击者再访问 http://localhost/attack.php?PHPSESSID=1234 后,客户页面刷新,发现
防范方法
1)定期更改session id
函数 bool session_regenerate_id([bool delete_old_session])
delete_old_session为true,则删除旧的session文件;为false,则保留旧的session,默认false,可选
在index.php开头加上
session_start();
session_regenerate_id(TRUE);
……
这样每次从新加载都会产生一个新的session id
2)更改session的名称
session的默认名称是PHPSESSID,此变量会保存在cookie中,如果黑客不抓包分析,就不能猜到这个名称,阻挡部分攻击
session_start();
session_name("mysessionid");
……
3)关闭透明化session id
透明化session id指当浏览器中的http请求没有使用cookies来制定session id时,sessioin id使用链接来传递;打开php.ini,编辑
session.use_trans_sid = 0
代码中
int_set("session.use_trans_sid", 0);
session_start();
……
4)只从cookie检查session id
session.use_cookies = 1 表示使用cookies存放session id
session.use_only_cookies = 1 表示只使用cookies存放session id,这可以避免session固定攻击
代码中
int_set("session.use_cookies", 1);
int_set("session.use_only_cookies", 1); p>
5)使用URL传递隐藏参数
session_start();
$seid = md5(uniqid(rand()), TRUE));
$_SESSION["seid"] = $seid;
攻击者虽然能获取session数据,但是无法得知$seid的值,只要检查seid的值,就可以确认当前页面是否是web程序自己调用的。
以上就是PHP漏洞全解(七)-Session劫持的内容,更多相关内容请关注PHP中文网(www.php.cn)!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...
