频道栏目
首页 > 资讯 > Session劫持 > 正文

PHP漏洞全解(七)-Session劫持

16-01-08        来源:[db:作者]  
收藏   我要投稿
服务端和客户端之间是通过session(会话)来连接沟通。当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session。每个用户的session都是独立的,并且由服务器来维护。每个用户的session是由一个独特的字符串来识别,成为sessionid。用户发出请求时,所发送的http表头内包含sessionid的值。服务器使用http表头内的sessionid来识别时哪个用户提交的请求。
session保存的是每个用户的个人数据,一般的web应用程序会使用session来保存通过验证的用户账号和密码。在转换不同的网页时,如果需要验证用户身份,就是用session内所保存的账号和密码来比较。session的生命周期从用户连上服务器后开始,在用户关掉浏览器或是注销时用户session_destroy函数删除session数据时结束。如果用户在20分钟内没有使用计算机的动作,session也会自动结束。
php处理session的应用架构
会话劫持
会话劫持是指攻击者利用各种手段来获取目标用户的sessionid。一旦获取到sessionid,那么攻击者可以利用目标用户的身份来登录网站,获取目标用户的操作权限。
攻击者获取目标用户sessionid的方法:
1)暴力破解:尝试各种sessionid,直到破解为止。
2)计算:如果sessionid使用非随机的方式产生,那么就有可能计算出来
3)窃取:使用网络截获,xss攻击等方法获得
会话劫持的攻击步骤
实例
//login.php
…..
//index.php
访客的SessionID是:
访客:
book商品的数量:如果登录成功,使用$_SESSION["username"]保存账号$_SESSION["password"]保存密码#_SESSION["book"]保存购买商品数目
登录以后显示
开始攻击
//attack.php
";
echo"目标用户的username是:".$_SESSION["username"]."
";
echo"目标用户的password是:".$_SESSION["password"]."
";
//将book的数量设置为2000
$_SESSION["book"]=2000;
?>
提交http://localhost/attack.php?PHPSESSID=5a6kqe7cufhstuhcmhgr9nsg45此ID为获取到的客户sessionid,刷新客户页面以后
客户购买的商品变成了2000
session固定攻击
黑客可以使用把sessionid发给用户的方式,来完成攻击
http://localhost/index.php?user=dodo&PHPSESSID=1234把此链接发送给dodo这个用户显示
然后攻击者再访问http://localhost/attack.php?PHPSESSID=1234后,客户页面刷新,发现
商品数量已经成了2000
防范方法
1)定期更改sessionid
函数boolsession_regenerate_id([booldelete_old_session])
delete_old_session为true,则删除旧的session文件;为false,则保留旧的session,默认false,可选
在index.php开头加上
session_start();
session_regenerate_id(TRUE);
……
这样每次从新加载都会产生一个新的sessionid
2)更改session的名称
session的默认名称是PHPSESSID,此变量会保存在cookie中,如果黑客不抓包分析,就不能猜到这个名称,阻挡部分攻击
session_start();
session_name("mysessionid");
……
3)关闭透明化sessionid
透明化sessionid指当浏览器中的http请求没有使用cookies来制定sessionid时,sessioinid使用链接来传递;打开php.ini,编辑
session.use_trans_sid=0
代码中
int_set("session.use_trans_sid",0);
session_start();
……
4)只从cookie检查sessionid
session.use_cookies=1表示使用cookies存放sessionid
session.use_only_cookies=1表示只使用cookies存放sessionid,这可以避免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程序自己调用的。
相关TAG标签
上一篇:用PHP尝试RabbitMQ(amqp扩展)实现消息的发送和接收
下一篇:php不解之密解决方法
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站