阅读目录

  • 1、简介
  • 2、会话预测
  • 3、会话劫持
  •   3.1、含义
  •   3.2、攻击步骤
  •   3.3、防御方法
  • 4、会话固定
  •   4.1、含义
  •   4.2、攻击步骤
  •   4.3、防御方法
  • 5、参考文献
回到顶部

1、简介

  Session对于Web应用无疑是最重要的,也是最复杂的。对于web应用程序来说,加强安全性的第一条原则就是 – 不要信任来自客户端的数据,一定要进行数据验证以及过滤,才能在程序中使用,进而保存到数据层。 然而,为了维持来自同一个用户的不同请求之间的状态, 客户端必须要给服务器端发送一个唯一的身份标识符(Session ID)。 很显然,这和前面提到的安全原则是矛盾的,但是没有办法,http协议是无状态的,为了维持状态,我们别无选择。 可以看出,web应用程序中最脆弱的环节就是session,因为服务器端是通过来自客户端的一个身份标识来认证用户的, 所以session是web应用程序中最需要加强安全性的环节。 

  基于session的攻击有很多种方式。大部分的手段都是首先通过捕获合法用户的session, 然后冒充该用户来访问系统。也就是说,攻击者至少必须要获取到一个有效的session标识符,用于接下来的身份验证。 

  攻击者至少可以通过以下三种方式来获取一个有效的session标识符:

  1、预测

  2、捕获(劫持)

  3、固定

回到顶部

2、会话预测

  预测这种方式,也就是攻击者需要猜测出系统中使用的有效的session标识符(PHP中格式为PHPSESSID=1234),有点类似暴力破解。 php内部session的实现机制虽然不是很安全,但是关于生成session id的关节还是比较安全的,这个随机的session id往往是极其复杂的并且难于被预测出来,所以说,这种攻击方式基本上是不太可能成功的。

回到顶部

3、会话劫持

回到顶部

  3.1、含义

  会话劫持(Session hijacking),这是一种通过获取用户Session ID后,使用该Session ID登录目标账号的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。会话劫持的第一步是取得一个合法的会话标识来伪装成合法用户,因此需要保证会话标识不被泄漏。

回到顶部

  3.2、攻击步骤

  1、 目标用户需要先登录站点;

  2、 登录成功后,该用户会得到站点提供的一个会话标识SessionID;

  3、 攻击者通过某种攻击手段捕获Session ID

4、 攻击者通过捕获到的Session ID访问站点即可获得目标用户合法会话。

攻击者获取SessionID的方式有多种:

1、 暴力破解:尝试各种Session ID,直到破解为止;

2、 预测:如果Session ID使用非随机的方式产生,那么就有可能计算出来;

3、 窃取:使用网络嗅探,XSS攻击等方法获得。

  对于PHP来说,其内部Session的实现机制虽然不是很安全,但是关于生成Session ID的环节还是比较安全的,这个随机的Session ID往往是极其复杂的并且难于被预测出来,所以,对于第一、第二种攻击方式基本上是不太可能成功的。

  对于第三种方式大多使用网络数据通讯层进行攻击获取,可以使用SSL进行防御。

  在应用层上也可以做出相应的防御措施:

  目前有三种广泛使用的在Web环境中维护会话(传递Session ID)的方法:URL参数,隐藏域和Cookie。其中每一种都各有利弊,Cookie已经被证明是三种方法中最方便最安全的。从安全的观点,如果不是全部也是绝大多数针对基于Cookie的会话管理机制的攻击对于URL或是隐藏域机制同样适用,但是反过来却不一定,这就让Cookie成为从安全考虑的最佳选择。

回到顶部

  3.3、防御方法

  1、 更改Session名称。PHP中Session的默认名称是PHPSESSID,此变量会保存在Cookie中,如果攻击者不分析站点,就不能猜到Session名称,阻挡部分攻击。

2、 关闭透明化Session ID。透明化Session ID指当浏览器中的Http请求没有使用Cookie来存放Session ID时,Session ID则使用URL来传递。

3、 设置HttpOnly。通过设置Cookie的HttpOnly为true,可以防止客户端脚本访问这个Cookie,从而有效的防止XSS攻击。

4、 关闭所有phpinfo类dump request信息的页面。

5、验证HTTP头部信息

     在http访问头文件:[Accept-Charset、Accept-Encoding、Accept-Language、User-Agent],浏览器一般发出的头部不会改

  使用User-Agent检测请求的一致性。

 1 GET/HTTP/1.12 host:example.org3 User-Agent:Firefox/1.04 Accept:text/html,image/png,image/jpeg,image/gif,*/*5 Cookie:PHPSESSID=12346 <?php7 session_start();8 if(isset($_SESSION['HTTP_USER_AGENT']))9 {
10         if($_SESSION['HTTP_USER_AGENT']!=md5($_SERVER['HTTP_USER_AGENT']))
11         {
12                         /*Promptforpassword*/
13                        exit;
14         }
15 }
16 else
17 {      18   $_SESSION['HTTP_USER_AGENT']=md5($_SERVER['HTTP_USER_AGENT']);
19 }
20 ?>

  确保User-Agent头部信息一致的确是有效的,如果会话标识通过cookie传递,攻击者能取得会话标识,他同时也能取得其它HTTP头部。由于cookie暴露与浏览器漏洞或跨站脚本漏洞相关,受害者需要访问攻击者的网站并暴露所有头部信息。则攻击者只需重建头部即可进行攻击了

  因此前提需要做好XSS防御!

  注意:

在某些版本的IE浏览器中,用户正常访问一个网页和刷新一个网页时发出的Accept头部信息不同,因此Accept头部不能用来判断一致性。

  有专家警告不要依赖于检查User-Agent的一致性。这是因为服务器群集中的HTTP代理服务器会对User-Agent进行编辑,而本群集中的多个代理服务器在编辑该值时可能会不一致。  

  6、 加入Token校验。同样是用于检测请求的一致性,给攻击者制造一些麻烦,使攻击者即使获取了Session ID,也无法进行破坏,能够减少对系统造成的损失。但Token需要存放在客户端,如果攻击者有办法获取到Session ID,那么也同样可以获取到Token。

回到顶部

4、会话固定

回到顶部

  4.1、含义

  会话固定(Session fixation)是一种诱骗受害者使用攻击者指定的会话标识(SessionID)的攻击手段。这是攻击者获取合法会话标识的最简单的方法。让合法用户使用黑客预先设置的sessionID进行登录,从而是Web不再进行生成新的sessionID,从而导致黑客设置的sessionId变成了合法桥梁。)

  会话固定也可以看成是会话劫持的一种类型,原因是会话固定的攻击的主要目的同样是获得目标用户的合法会话,不过会话固定还可以是强迫受害者使用攻击者设定的一个有效会话,以此来获得用户的敏感信息。

回到顶部

  4.2、攻击步骤

1、 攻击者通过某种手段重置目标用户的SessionID,然后监听用户会话状态;

2、 目标用户携带攻击者设定的Session ID登录站点;

3、 攻击者通过Session ID获得合法会话

Web接收sessionID机制:

  早期浏览器存贮的sessionID容易暴露、使用URL来传送sessionID

  首先检查携带cookie是否含有sessionID;若没有则再检查get、post数据中是否含有,若有则使用此数据;没有才会使系统生成一个sessionID发给客户端。(经测试,get与post都不能设置sessionID【也许是被浏览器限制或者被代码本身禁止了吧,不过没关系,咱还有其他方法进行固定sessionID!】)

重置sessionID方式:

  • (一)使用客户端脚本来设置Cookie到浏览器。大多数浏览器都支持用客户端脚本来设置Cookie的,例如document.cookie="sessionid=123",这种方式可以采用跨站脚本攻击来达到目的。防御方式可以是设置HttpOnly属性,但有少数低版本浏览器存在漏洞,即使设置了HttpOnly,也可以重写Cookie。所以还需要加其他方式的校验,如User-Agent验证,Token校验等同样有效。

测试例子:

html页面(表单),用于跨站脚本攻击

 1 <!DOCTYPE html>2 <html>3 <head>4     <title>重置sessionID(一)</title>5     <meta charset="utf-8">6 </head>7 <body>8 <form action="./test2.php" method="post">9 name:<input type="text" name="name"><br/>
10 age:<input type="text" name="age"><br/>
11 <input type="submit" name="" value="提交">
12 </form>
13 </body>
14 </html>

接收表单 ,test2.php

 1 <?php2 header("content-type:text/html;charset=utf8");3 session_start();4 if(!isset($_SESSION['count']))  #自增测试5 {6     $_SESSION['count']=0;7 }8 else9 {
10     $_SESSION['count']++;
11 }
12 echo '$_POST数据:';
13 echo "<pre>";
14 print_r($_POST);        #不处理数据直接接收
15 echo "</pre>";
16 echo '$_SESSION数据:';
17 echo "<pre>";
18 print_r($_SESSION);
19 echo "</pre>";die;
20 ?>    

 测试:

  1、表单中插入数据,并提交。然后不断刷新test2.php

<script type='text/javascript'> document.cookie='PHPSESSID=12345' </script>

  2、接着分别查看sessionID以及count数值

  3、在其他浏览器中,执行相同的步骤1(保证sessionID与之前相同)和2,可以看到count初始值不是0,而是在之前的基础上增加的。

结论:盗取sessionID成功!

  • (二)使用HTML的<META>标签加Set-Cookie属性。服务器可以靠在返回的HTML文档中增加<META>标签来设置Cookie。例如<meta http-equiv='Set-Cookie' content='PHPSESSID=22333'>,与客户端脚本相比,对<META>标签的处理目前还不能被浏览器禁止。【只要让此行代码在服务器中执行即可入侵】

测试:

  只要让此行代码执行即可,(<meta http-equiv='Set-Cookie' content='PHPSESSID=22333'>)即可。我们将它放入表单中然后提交给PHP;接着不断刷新,再换浏览器执行相同步骤。和上面的测试一样!接着查看结果

  • (三)使用Set-Cookie的HTTP响应头部设置Cookie。攻击者可以使用一些方法在Web服务器的响应中加入Set-Cookie的HTTP响应头部。如会话收养,闯入目标服务器所在域的任一主机,或者是攻击用户的DNS服务器。

测试:(伪造浏览器执行http请求)

  1、攻击者控制的服务器(www.test88.com)

  2、www.test88.com/test99.php

  客户访问这个页面,无形之中就简介访问第三方网站,并绑定一个sessionID;攻击者就可以掌握这个sessionID进行相应的攻击了

 1 <?php2 header("content-type:text/html;charset=utf8");3 $host='www.linuxtest.com';4 $port=80;5 $a=fsockopen($host,$port);6 7 //请求行8 $request_data="Get /test2.php HTTP/1.1\r\n";9 //请求头
10 $request_data.="Host: www.linuxtest.com\r\n";
11 $request_data.="User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:10.0) Gecko/20100101 Firefox/10.0\r\n";
12 $request_data.="Connection: keep-alive\r\n";
13 $request_data.="Cookie: PHPSESSID=99999\r\n";   #设置sessionID
14 $request_data.="\r\n"; //空行表示头结束
15 //发送数据
16 fwrite($a,$request_data);
17
18 #用于测试
19 //接收数据
20 $inheader=1;
21 while(!feof($a))
22 {
23     //echo fgets($a,1024);
24     //除去请求头,只显示返回数据
25     $data=fgets($a,1024);
26     if($inheader && ($data=="\n" || $data=="\r\n"))
27     {
28         $inheader=0;
29     }
30     if($inheader==0)
31     {
32         echo $data;
33     }
34 }
35 //关闭请求
36 fclose($a);
37
38 ?> 

  1、用户访问这个页面,并不断刷新,然后查看页面中的count值

  2、接着,模拟黑客进行攻击。

  在表单中插入数据(<script type='text/javascript'> document.cookie='PHPSESSID=99999' </script>),然后提交,并不断刷新test2.php,并观察count值。【换不换浏览器都可以,本质上讲黑客构造的http访问代码就相当于一个独立的浏览器】

  结果显示:count值是接着上面的4不断增加!此时证明攻击成功!

回到顶部

  4.3、防御方法

1、每当用户登陆的时候就进行重置sessionID

2、sessionID闲置过久时,进行重置sessionID

3、 大部分防止会话劫持的方法对会话固定攻击同样有效。如设置HttpOnly,关闭透明化Session ID,User-Agent验证,Token校验等。

【多个方法结合使用】

回到顶部

5、参考文献

1. 《Session攻击手段(会话劫持/固定)及其安全防御措施》

(以上是自己的一些见解,若有不足或者错误的地方请各位指出)

作者:那一叶随风   http://www.cnblogs.com/phpstudy2015-6/

原文地址:http://www.cnblogs.com/phpstudy2015-6/p/6776919.html

声明:本博客文章为原创,只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接

Session攻击(会话劫持+固定)与防御相关推荐

  1. Session攻击手段(会话劫持/固定)及其安全防御措施

    一.       概述 对于Web应用程序来说,加强安全性的第一条原则就是--不要信任来自客户端的数据,一定要进行数据验证以及过滤才能在程序中使用,进而保存到数据层.然而,由于Http的无状态性,为了 ...

  2. 如何防范 PHP安全的方式-session会话劫持与会话固定 ?

    一.概述 对于Web应用程序来说,加强安全性的第一条原则就是--不要信任来自客户端的数据,一定要进行数据验证以及过滤才能在程序中使用,进而保存到数据层.然而,由于Http的无状态性,为了维持来自同一个 ...

  3. Session 会话劫持和cookie窃取

    会话劫持 会话劫持(Session hijacking),这是一种通过获取用户Session ID后,使用该Session ID登录目标账号的攻击方法,此时攻击者实际上是使用了目标账户的有效Sessi ...

  4. 会话劫持漏洞小结——cookie劫持的方式、属性、原理、危害及防御

    会话劫持 概念 会话劫持(Session hijacking)是一种通过获取用户Session ID后,使用该Session ID登录目标账号的攻击方法,此时攻击者实际上是使用了目标账户的有效Sess ...

  5. 【XSS漏洞-06】XSS漏洞利用案例(浏览器劫持、会话劫持、GetShell)—基于神器beEF

    目录 1 案例简介 1.1 案例目的 1.2 案例环境 2 案例一:浏览器劫持 2.1 概述 2.2 案例步骤 3 案例二:会话劫持 3.1 概述 3.2 案例步骤 4 案例三:GetShell 4. ...

  6. 【XSS漏洞07】基于神器beEF的XSS漏洞利用实验(浏览器劫持、会话劫持、GetShell)

    目录 1 实验简介 1.1 实验目的 1.2 实验环境 2 实验一:浏览器劫持 2.1 概述 2.2 实验步骤 3 实验二:会话劫持 3.1 概述 3.2 实验步骤 4 实验三:GetShell 4. ...

  7. 什么是会话劫持及其工作原理?

    会话劫持(又名 cookie 劫持或 cookie side-jacking)是一种网络攻击,攻击者接管合法用户的计算机会话以获取其会话 ID,然后在任意数量的网络服务上充当该用户. 这种类型的攻击对 ...

  8. 如何修复会话固定漏洞_PHP安全漏洞:会话劫持,跨站点脚本,SQL注入以及如何修复它们...

    如何修复会话固定漏洞 PHP中的安全性 (Security in PHP) When writing PHP code it is very important to keep the followi ...

  9. PHP漏洞之session会话劫持

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

最新文章

  1. 命名实体识别学习笔记——使用Ltp
  2. python django 动态网页_使用Django创建动态页面
  3. 方法参数是结构体指针,报错信息是空指针怎么办
  4. LeetCode 490. 迷宫(BFS/DFS)
  5. 【Python】处理 joblib.externals.loky.process_executor._RemoteTraceback:PermissionError:[WinError 5] 拒绝访问
  6. 搜索关键字字符串NSSCanner:scanString()详解
  7. ECCV 2020 论文大盘点-自动驾驶篇
  8. mysql 启动报错Can't connect to local MySQL server through socket '/data/mysql/mysql/mysql.sock'(111)...
  9. 交叉表 列字段排序_百度App设计部:四步打造交互设计自查表
  10. 计算机硬盘的常用分区工具,常用的几款分区合并工具推荐,合理使用电脑硬盘...
  11. 【JVM】17、垃圾回收器
  12. Wmware虚拟机装黑苹果时,镜像格式转换的方法
  13. .pth文件转.weight文件For YOLO
  14. 点云 ICP学习-IterativeClosestPoint
  15. 阿里CTO王坚:商业进化的四个关键词
  16. SSL证书提示风险打不开网页怎么办
  17. 183条地铁线路,3034个地铁站,发现中国地铁名字的秘密。
  18. Python初学者学习笔记
  19. WLAN适配器的驱动程序可能出现了问题(连不了wifi)解决办法
  20. Java支持的国家和语言

热门文章

  1. MQTT测试环境搭建
  2. 创建自己的tusimple数据集格式
  3. Java图片的上传下载
  4. Linux下把WIFI网卡设置成AP热点
  5. 调用阿里云短信API发送短信通知
  6. 成都物韵电子商务有限公司如何让店铺的流量得到提升?
  7. 【码上实战】【立体匹配系列】经典PatchMatch: (1)框架
  8. 研究一天,终于把MyBatis的一级缓存和二级缓存搞清楚了
  9. APT持续性渗透攻击的九份报告
  10. 【samba服务器搭建】