Session 对于 web 应用无疑是最重要的,也是最复杂的。对于 web 应用程序来说,加强安全性的第一条原则就是 – 不要信任来自客户端的数据,一定要进行数据验证以及过滤,才能在程序中使用,进而保存到数据层。 然而,为了维持来自同一个用户的不同请求之间的状态, 客户端必须要给服务器端发送一个唯一的身份标识符 (Session ID)。 很显然,这和前面提到的安全原则是矛盾的,但是没有办法,http 协议是无状态的,为了维持状态,我们别无选择。 可以看出,web 应用程序中最脆弱的环节就是 session,因为服务器端是通过来自客户端的一个身份标识来认证用户的, 所以 session 是 web 应用程序中最需要加强安全性的环节。
基于 session 的攻击有很多种方式。大部分的手段都是首先通过捕获合法用户的 session, 然后冒充该用户来访问系统。也就是说,攻击者至少必须要获取到一个有效的 session 标识符,用于接下来的身份验证。
攻击者至少可以通过以下三种方式来获取一个有效的 session 标识符:
1、预测
2、捕获(劫持)
3、固定
预测这种方式,也就是攻击者需要猜测出系统中使用的有效的 session 标识符(PHP 中格式为 PHPSESSID=1234),有点类似暴力破解。 php 内部 session 的实现机制虽然不是很安全,但是关于生成 session id 的关节还是比较安全的,这个随机的 session id 往往是极其复杂的并且难于被预测出来,所以说,这种攻击方式基本上是不太可能成功的。
会话劫持(Session hijacking),这是一种通过获取用户 Session ID 后,使用该 Session ID 登录目标账号的攻击方法,此时攻击者实际上是使用了目标账户的有效 Session。会话劫持的第一步是取得一个合法的会话标识来伪装成合法用户,因此需要保证会话标识不被泄漏。
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 成为从安全考虑的最佳选择。
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.1 2 host: example.org 3 User - Agent: Firefox / 1.0 4 Accept: text / html,
- image / png,
- image / jpeg,
- image / gif,
- *
- /*
- 5 Cookie:PHPSESSID=1234
- 6 <?php
- 7 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。
会话固定(Session fixation)是一种诱骗受害者使用攻击者指定的会话标识(SessionID)的攻击手段。这是攻击者获取合法会话标识的最简单的方法。(让合法用户使用黑客预先设置的 sessionID 进行登录,从而是 Web 不再进行生成新的 sessionID,从而导致黑客设置的 sessionId 变成了合法桥梁。)
会话固定也可以看成是会话劫持的一种类型,原因是会话固定的攻击的主要目的同样是获得目标用户的合法会话,不过会话固定还可以是强迫受害者使用攻击者设定的一个有效会话,以此来获得用户的敏感信息。
1、 攻击者通过某种手段重置目标用户的 SessionID,然后监听用户会话状态;
2、 目标用户携带攻击者设定的 Session ID 登录站点;
3、 攻击者通过 Session ID 获得合法会话
Web 接收 sessionID 机制:
早期浏览器存贮的 sessionID 容易暴露、使用 URL 来传送 sessionID
首先检查携带 cookie 是否含有 sessionID;若没有则再检查 get、post 数据中是否含有,若有则使用此数据;没有才会使系统生成一个 sessionID 发给客户端。(经测试,get 与 post 都不能设置 sessionID【也许是被浏览器限制或者被代码本身禁止了吧,不过没关系,咱还有其他方法进行固定 sessionID!】)
重置 sessionID 方式:
测试例子:
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">
- 9name:<input type="text" name="name"><br/>
- 10age:<input type="text" name="age"><br/>
- 11 <input type="submit" name="" value="提交">
- 12 </form>
- 13 </body>
- 14 </html>
接收表单 ,test2.php
- 1 php 2 header("content-type:text/html;charset=utf8");
- 3 session_start();
- 4
- if (!isset($_SESSION['count']))#自增测试5 {
- 6 $_SESSION['count'] = 0;
- 7
- }
- 8
- else 9 {
- 10 $_SESSION['count']++;
- 11
- }
- 12 echo '$_POST数据:';
- 13 echo "";
- 14 print_r($_POST);#不处理数据直接接收15 echo "";
- 16 echo '$_SESSION数据:';
- 17 echo "";
- 18 print_r($_SESSION);
- 19 echo "";
- die;
- 20 ? >
测试:
1、表单中插入数据,并提交。然后不断刷新 test2.php
- <script type='text/javascript'>
- document.cookie = 'PHPSESSID=12345'
- </script>
2、接着分别查看 sessionID 以及 count 数值
3、在其他浏览器中,执行相同的步骤 1(保证 sessionID 与之前相同)和 2,可以看到 count 初始值不是 0,而是在之前的基础上增加的。
结论:盗取 sessionID 成功!
测试:
只要让此行代码执行即可,(<meta http-equiv='Set-Cookie'content='PHPSESSID=22333'>)即可。我们将它放入表单中然后提交给 PHP;接着不断刷新,再换浏览器执行相同步骤。和上面的测试一样!接着查看结果
测试:(伪造浏览器执行 http 请求)
1、攻击者控制的服务器(www.test88.com)
2、www.test88.com/test99.php
客户访问这个页面,无形之中就简介访问第三方网站,并绑定一个 sessionID;攻击者就可以掌握这个 sessionID 进行相应的攻击了
- 1php
- 2 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 不断增加!此时证明攻击成功!
1、每当用户登陆的时候就进行重置 sessionID
2、sessionID 闲置过久时,进行重置 sessionID
3、 大部分防止会话劫持的方法对会话固定攻击同样有效。如设置 HttpOnly,关闭透明化 Session ID,User-Agent 验证,Token 校验等。
【多个方法结合使用】
1. 《Session 攻击手段 (会话劫持 / 固定) 及其安全防御措施》
(以上是自己的一些见解,若有不足或者错误的地方请各位指出)
作者:那一叶随风 http://www.cnblogs.com/phpstudy2015-6/
来源: http://www.cnblogs.com/phpstudy2015-6/p/6776919.html