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

会话劫持的攻击步骤

实例

  1. //login.php
  2. session_start();
  3. if (isset($_POST["login"]))
  4. {
  5. $link = mysql_connect("localhost", "root", "root")
  6. or die("无法建立MySQL数据库连接:" . mysql_error());
  7. mysql_select_db("cms") or die("无法选择MySQL数据库");
  8. if (!get_magic_quotes_gpc())
  9. {
  10. $query = "select * from member where username=’" . addslashes($_POST["username"]) .
  11. "’ and password=’" . addslashes($_POST["password"]) . "’";
  12. }
  13. else
  14. {
  15. $query = "select * from member where username=’" . $_POST["username"] .
  16. "’ and password=’" . $_POST["password"] . "’";
  17. }
  18. $result = mysql_query($query)
  19. or die("执行MySQL查询语句失败:" . mysql_error());
  20. $match_count = mysql_num_rows($result);
  21. if ($match_count)
  22. {
  23. $_SESSION["username"] = $_POST["username"];
  24. $_SESSION["password"] = $_POST["password"];
  25. $_SESSION["book"] = 1;
  26. mysql_free_result($result);
  27. mysql_close($link);
  28. header("Location: http://localhost/index.php?user=" .
  29. $_POST["username"]);
  30. }
  1. //index.php
  1. // 打开Session
  2. session_start();
  3. 访客的 Session ID 是:echo session_id(); ?>
  4. 访客:echo htmlspecialchars($_GET["user"], ENT_QUOTES); ?>
  5. book商品的数量:echo htmlspecialchars($_SESSION["book"], ENT_QUOTES); ?>
  6. 如果登录成功,使用
  7. $_SESSION["username"] 保存账号
  8. $_SESSION["password"] 保存密码
  9. #_SESSION["book"] 保存购买商品数目

登录以后显示

开始攻击

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

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

时间: 2024-08-29 09:23:56

SESSION劫持的相关文章

预防 Session 劫持与 Session 定置攻击

一.预防 Session 劫持 要求: ① 只允许通过 Cookie 来传递 SessionID ② 生成一个由 URL 传递的唯一标识作为 Session 的标记(token) 当请求同时包含有效的 SessionID 和 有效的 Session token 时,才能进一步访问该 Session 代码: $salt = 'mySessionToken'; $tokenstr = date('W').$salt; $token = md5($tokenstr); //① if(!isset($_

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

本文主要介绍针对PHP网站Session劫持.session劫持是一种比较复杂的攻击方法.大部分互联网上的电脑多存在被攻击的危险.这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持可能. 服务端和客户端之间是通过session(会话)来连接沟通.当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session.每个用 户的session都是独立的,并且由服务器来维护.每个用户的session是由一个独特的字符串来识别,成为session id.用户发出请求时,所发送的htt

cookie窃取和session劫持

[转]cookie窃取和session劫持 Updates 2014-08-17 感谢@搞前端的crosser的提醒,加入了HTTP Response Splitting的内容. 此篇文章的Presentation戳这里. 一.cookie的基本特性 如果不了解cookie,可以先到wikipedia上学习一下. http request 浏览器向服务器发起的每个请求都会带上cookie: Host: www.example.org 2.Cookie: foo=value1;bar=value2

Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗、嗅探、dns欺骗、session劫持

Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗.嗅探.dns欺骗.session劫持 文/玄魂 目录 Kali Linux Web 渗透测试—第十四课-arp欺骗.嗅探.dns欺骗.session劫持      1 关于嗅探.arp欺骗.会话劫持.............................................................. 1 视频教程地址:http://edu.51cto.com/course/course_id-1887.h

session劫持以及预防

session劫持是一种广泛存在的比较严重的安全威胁,在session技术中,客户端和服务端通过session的标识符来维护会话, 但这个标识符很容易就能被嗅探到,从而被其他人利用.它是中间人攻击的一种类型. 本节将通过一个实例来演示会话劫持,希望通过这个实例,能让读者更好地理解session的本质. session劫持过程 我们写了如下的代码来展示一个count计数器: func count(w http.ResponseWriter, r *http.Request) { sess := g

跨站脚本攻击XSS(二)——session劫持

转载自:http://www.cnblogs.com/dolphinX/p/3403027.html 在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码.今天我们就介绍一种危害更大的XSS--session劫持. 神马是session 想明白session劫持及其危害,首先要搞清楚什么是session,熟悉http的同学知道,http是无状态的,也就是客户端向服务

XSS危害——session劫持

在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码.今天我们就介绍一种危害更大的XSS--session劫持. 神马是session 想明白session劫持及其危害,首先要搞清楚什么是session,熟悉http的同学知道,http是无状态的,也就是客户端向服务器请求完成后,会断开连接,下次同一个客户端再次访问服务器的时候,服务器会把它当作一个陌生的请求,不会知

Cookie , Session ,Session 劫持简单总结

cookie 机制: Cookies 是 服务器 在 本地机器 上存储的 小段文本,并伴随着 每一个请求,发送到 同一台 服务器. 网络服务器 用 HTTP头 向客户端发送 Cookies.在客户端,浏览器解析这些 cookies 并将它们保存成为一个本地文件,他会自动将同一台服务器的任何请求附上这些 cookies. 因为 HTTP 是一种无状态的协议,而cookie机制采用的是在客户端保持状态的方案,session 是在服务端保持状态的协议.Cookies是在用户端的会话状态的存贮机制,他需

XSS危害——session劫持(转载)

在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码.今天我们就介绍一种危害更大的XSS--session劫持. 神马是session 想明白session劫持及其危害,首先要搞清楚什么是session,熟悉http的同学知道,http是无状态的,也就是客户端向服务器请求完成后,会断开连接,下次同一个客户端再次访问服务器的时候,服务器会把它当作一个陌生的请求,不会知