专栏首页PHP专享栏PHP漏洞之-Session劫持

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攻击等方法获得

会话劫持的攻击步骤

实例

 


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["username"] = $_POST["username"]; 
$_SESSION["password"] = $_POST["password"]; 
$_SESSION["book"] = 1; 
mysql_free_result($result); 
mysql_close($link); 
header("Location: http://localhost/index.php?user=" . 
$_POST["username"]); 
} 
session_start(); 


访客的 Session ID 是:echo session_id(); ?> 


访客:echo htmlspecialchars($_GET["user"], ENT_QUOTES); ?> 


book商品的数量:echo htmlspecialchars($_SESSION["book"], ENT_QUOTES); ?> 
如果登录成功,使用 
$_SESSION["username"] 保存账号 
$_SESSION["password"] 保存密码 
#_SESSION["book"] 保存购买商品数目 

登录以后显示

开始攻击

//attack.php 
php 
   // 打开Session 
   session_start(); 
   echo "目标用户的Session ID是:" . session_id() . "<br />"; 
   echo "目标用户的username是:" . $_SESSION["username"] . "<br />"; 
   echo "目标用户的password是:" . $_SESSION["password"] . "<br />"; 
   // 将book的数量设置为2000 
   $_SESSION["book"] = 2000; 
?> 

提交 http://localhost/attack.php?PHPSESSID=5a6kqe7cufhstuhcmhgr9nsg45 此ID为获取到的客户session id,刷新客户页面以后

客户购买的商品变成了2000

session固定攻击

黑客可以使用把session id发给用户的方式,来完成攻击

http://localhost/index.php?user=dodo&PHPSESSID=1234 把此链接发送给dodo这个用户显示

然后攻击者再访问 http://localhost/attack.php?PHPSESSID=1234 后,客户页面刷新,发现

商品数量已经成了2000

防范方法

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程序自己调用的。

本文分享自微信公众号 - 风帆(wdswhf),作者:风帆money

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Session和redis结合运用技巧

    服务端和客户端之间是通过session(会话)来连接沟通。当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session。每个用户的session都是...

    php007
  • 深度解析 cookie、session、token

    1、很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, ...

    php007
  • redis结合php

    首先可以去pecl.php.net 官网下载安装包,我这里下载的2.8.21版本 # tar zxf redis-2.8.21.tgz # cd red...

    php007
  • 分布式Session共享解决方案

    Session是服务器用来保存用户操作的一系列会话信息,由Web容器进行管理。单机情况下,不存在Session共享的情况,分布式情况下,如果不进行Session...

    Java技术栈
  • flask 四种session

    版权声明:Copyright © ...

    zhengzongwei
  • cookie和session

    cookie: 1. `cookie`出现的原因:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道...

    用户1173509
  • Tomcat Session管理分析【面试+工作】

    上文中在Tomcat的context.xml中配置了Session管理器RedisSessionManager,实现了通过redis来存储session的功能;...

    奋斗蒙
  • shiro源码篇 - shiro的session的查询、刷新、过期与删除,你值得拥有

        老公酷爱网络游戏,老婆无奈,只得告诫他:你玩就玩了,但是千万不可以在游戏里找老婆,不然,哼哼。。。     老公嘴角露出了微笑:放心吧亲爱的,我绝对不会...

  • spring-boot-2.0.3不一样系列之番外篇 - 自定义session管理,绝对有值得你看的地方

      还记得当初写spring-session实现分布式集群session的共享的时候,里面有说到利用filter和HttpServletRequestWrapp...

  • 解决session共享问题方式调研

    为了提高服务器性能,最近公司项目采用了分布式服务集群的部署方式。所谓集群,就是让一组计算机服务器协同工作,解决大并发,大数据量瓶颈问题。项目使用nginx做负载...

    栋先生

扫码关注云+社区

领取腾讯云代金券