PHP漏洞之session会话劫持

摘要:
本文主要介绍针对PHP网站Session劫持。session劫持是一种比较复杂的攻击方法。服务端和客户端之间是通过session(会话)来连接沟通。每个用户的session都是独立的,并且由服务器来维护。每个用户的session是由一个独特的字符串来识别,成为sessionid。用户发出请求时,所发送的http表头内包含sessionid的值。如果用户在20分钟内没有使用计算机的动作,session也会自动结束。php处理session的应用架构会话劫持会话劫持是指攻击者利用各种手段来获取目标用户的sessionid。

本文主要介绍针对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会话劫持第1张

php处理session的应用架构

会话劫持

会话劫持是指攻击者利用各种手段来获取目标用户的session id。一旦获取到session id,那么攻击者可以利用目标用户的身份来登录网站,获取目标用户的操作权限。

攻击者获取目标用户session id的方法:

1)暴力破解:尝试各种session id,直到破解为止。

2)计算:如果session id使用非随机的方式产生,那么就有可能计算出来 3)窃取:使用网络截获,xss攻击等方法获得

会话劫持的攻击步骤:

PHP漏洞之session会话劫持第2张

实例:

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  }

//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"] 保存购买商品数目

开始攻击

1 //attack.php
2  session_start();//打开Session
3  echo "目标用户的Session ID是:" . session_id() . "";
4  echo "目标用户的username是:" . $_SESSION["username"] . "";
5  echo "目标用户的password是:" . $_SESSION["password"] . "";
6  //将book的数量设置为2000
7  $_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会话劫持》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇gradle(转)Android 数据库升级解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

解决mysql中只能通过localhost访问不能通过ip访问的问题

Mysql 默认是没有开启这个权限的(只允许使用 host:localhost,或者 host:127.0.0.1),如果想用 host:192.168.1.* ,来访问mysql ,需要手动开启这个权限进入Mysql终端输入这个命令 1.打开cmd窗口,进入MySql安装的bin目录 2.执行命令登录数据库,之后会出现一行要你输入密码的 mysql -...

PHP设计模式之注册模式

单例模式保证了一个类中只有一个实例被全局访问,当你有一组全局对象被全局访问时可能就需要用到注册者模式 (registry),它提供了在程序中有条理的存放并管理对象 (object)一种解决方案。一个“注册模式”应该提供get() 和 set()方法来存储和取得对象(用一些属性key)而且也应该提供一个isValid()方法来确定一个给定的属性是否已经设置。...

php中session_start()相关问题分析与解决办法

介绍下,在php中使用session时遇到的一些问题,与相关解决方法。1.错误提示Warning: Cannot send session cookie - headers already sentWarning: Cannot send session cache limiter - headers already sent分析及解决办法这一类问题,的原...

PHP错误:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

使用PHP连接MySQL 8的时候,可能会发生如标题所示的错误: SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client 发生这种错误,是由于MySQL 8默认使用了新的密码验证插件:caching_sha2_password,而之前的P...

win下MongoDB使用

● 安装 ● 启动 1、创建几个文件夹具体如下:数据库路径(data目录)、日志路径(logs目录)和日志文件(mongo.log文件) 2、创建配置文件mongo.conf,文件内容如下: #数据库路径 dbpath=d:MongoDBServer3.4data #日志输出文件路径 logpath=d:MongoDBServer3.4logsmo...

php 文件 创建 剪切 复制 常用函数

<?phpheader('content-type:text/html;charset=utf-8');/** 注 touch 如文件已存在,设定文件的访问和修改时间 如果文件不存在,则会被创建。* touch(文件名,时间戳); 时间戳默认为当前时间 返回布尔值* */////创建文件 123.txt(如果文件不存在)if(!file_exists...