本文主要介绍针对PHP网站Session劫持。session劫持是一种比较复杂的攻击方法。大部分互联网上的电脑多存在被攻击的危险。这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持可能。

服务端和客户端之间是通过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["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"]);
}

//index.php session_start();// 打开Session

访客的 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
session_start();// 打开Session
echo "目标用户的Session ID是:" . session_id() . "";
echo "目标用户的username是:" . $_SESSION["username"] . "";
echo "目标用户的password是:" . $_SESSION["password"] . "";
// 将book的数量设置为2000
$_SESSION["book"] = 2000;

提交 http://www.XXX.com/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程序自己调用的。

[via@91ri]

PHP漏洞之session会话劫持的更多相关文章

  1. Session攻击(会话劫持+固定)与防御

    1.简介 Session对于Web应用无疑是最重要的,也是最复杂的.对于web应用程序来说,加强安全性的第一条原则就是 – 不要信任来自客户端的数据,一定要进行数据验证以及过滤,才能在程序中使用,进而 ...

  2. 安全性测试入门 (四):Session Hijacking 用户会话劫持的攻击和防御

    本篇继续对于安全性测试话题,结合DVWA进行研习. Session Hijacking用户会话劫持 1. Session和Cookies 这篇严格来说是用户会话劫持诸多情况中的一种,通过会话标识规则来 ...

  3. PHP安全编程:会话数据注入 比会话劫持更强大的攻击(转)

    一个与会话暴露类似的问题是会话注入.此类攻击是基于你的WEB服务器除了对会话存储目录有读取权限外,还有写入权限.因此,存在着编写一段允许其他用户添加,编辑或删除会话的脚本的可能.下例显示了一个允许用户 ...

  4. 真的无语, 今天遇到一个奇葩的事情: http 会话劫持

    今天一个用户反应说软件一运行就提示错误,然后关闭. 然后用户截屏发给我看了一下,我一看,无语了. 在软件中显示的正常一段文字说明尾部出现 <script src="http://ad. ...

  5. TCP会话劫持_转

    前言通常,大家所说的入侵,都是针对一台主机,在获得管理员权限后,就很是得意:其实,真正的入侵是占领整个内部网络.针对内部网络的攻击方法比较多,但比较有效的方法非ARP欺骗.DNS欺骗莫属了.但是,不管 ...

  6. 负载均衡session会话保持方法

    负载均衡时,为了保证同一用户session会被分配到同一台服务器上,可以使用以下方法:1.使用cookie将用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在该用 ...

  7. PHP中的session会话创建打印释放销毁;

    PHP Session PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置.Session 变量存储单一用户的信息,并且对于应用程序中的 ...

  8. 跨域请求,关于后端session会话丢失的解决办法

    目前使用前后端分离的模式开发,后端提供跨域接口.前端jsonp调用,绑定数据,但是在该站点下有个人中心模块存在的情况下,服务端的session会话会被跨域请求覆盖改掉 大家都知道tomcat使用coo ...

  9. SESSION会话技术

    以下对session会话技术详解: 要了解点http协议理解更佳--->http请求头和http相应头 在session_start的时候,浏览器会向服务器发出请求 在请求的同时,如果是第一次a ...

随机推荐

  1. PHP获取随机数

    <?php $FileID=date("Ymd-His") . '-' . rand(100,999); //$FileID为   20100903-132121-908   ...

  2. 做一个常规的banner图——负边距的使用、banner图的拼法

    在这之前,首先要了解如何设置块级元素在块级元素水平居中 方法: 设置子容器为定位元素 水平居中 left:50%:margin-left:-width/2: 垂直居中 top:50%:margin-t ...

  3. Linux中批量添加文件和修改文件小笔记

    1.#使用通配符批量创建5个文件 $ touch file{1..10}.txt 2.#批量修改这五个后缀名为.txt的文本文件名重命名为.c后缀名结尾的文件 $ rename 's/\.txt/\. ...

  4. 浅谈移动端rem的用法

    一 什么是rem? “font size of the root element 这是w3c的定义 也就是说是相对于根节点(html节点)的字体大小的单位. 目前主流的浏览器基本都支持rem这个单位, ...

  5. endsWith is not a function解决方案

    在写javascript脚本时,用某些方法,有时候会碰到"XXX is not a function"之类的报错. 出现这种情况,主要是因为某些方法在低版本浏览器上不支持.比如说& ...

  6. hdu1540线段树

    https://vjudge.net/contest/66989#problem/I #include<iostream> #include<cstdio> #include& ...

  7. jquery.uploadifive 解决上传限制图片或文件大小

    dotNet疯狂之路No.28  今天很残酷,明天更残酷,后天很美好,但是绝大部分人是死在明天晚上,只有那些真正的英雄才能见到后天的太阳.  We're here to put a dent in t ...

  8. js与juery基础知识对比(一)---2017-05-06

    用表格做的,想要对比的内容一目了然,红色部分为重点   js jquery 取元素 id: document.getElementById("aa"); 取到的是dom对象 cla ...

  9. 深入浅出理解yield

    索引 转载部分内容来自:http://www.jianshu.com/p/d09778f4e055 [彻底理解yield] http://blog.csdn.net/haskei/article/de ...

  10. cssText的用法以及特点

    cssText 本质是什么? cssText 的本质就是设置 HTML 元素的 style 属性值. cssText 怎么用? document.getElementById("d1&quo ...