本篇继续对于安全性测试话题,结合DVWA进行研习。php
Session Hijacking用户会话劫持html
这篇严格来讲是用户会话劫持诸多状况中的一种,经过会话标识规则来破解用户session。前端
并且与前几篇不一样,咱们有必要先来理解一下Session和Cookie的工做机制。web
实际上要谈论这两个小伙伴,又要先理解http协议的运做机制,这样讨论下去可就篇幅太长了。后端
咱们只须要了解如下事实:安全
就好像两我的用老式的手摇电话机通电话。每一次http请求和数据交换就像这样的一次电话通话过程,当请求完毕之后,再进行下一次请求时,http协议是没法追踪上一则通话记录的。这样每一次用户与服务器的交互都是独立的一次通话,对于一个web应用而言显然是存在问题的,由于用户的请求十有八九具备连续性。就好比一个用户在商城添加了某商品到购物车,当他去结帐时,又是一次新的请求,他的购物车http协议仅仅经过链接状态是没法追踪的!服务器
为了解决用户的接续访问问题,一个简单的想法就是,将每一次用户与服务器之间的持续通话作为一个“会话”存放在服务器端。
当用户第一次打call进来的时候,你先别说话,先给你个小牌牌,这个小牌牌就用来作为此次用户会话的跟踪。
在咱们的应用内一般使用sessionID或者相似的形式进行记录。cookie
在会话中咱们有了标识本身身份的号码牌,由服务器生成颁发。用户拿到小牌牌,固然要妥善保管啦,将他存放到cookie里面就是如今的主流手段。当用户继续向服务器发出交互时,每一次接线员都先看一看这个小牌牌,证实你是你,而后再继续给你服务,否则别怪我翻脸不认人。session
他们关系就相似这样婶儿的:
测试
下图就是在DVWA上面个人用户cookie,使用JS弹框将其展现出来的效果:
了解session和cookie的原理机制以后,咱们来思考,若是我是攻击者,我有没有方法利用到用户的cookie和session?
这种思路是有不少的:
好比上一篇咱们讲CSRF跨站脚本伪造时,就是让已经被服务器验证经过的用户来帮我作一个操做。
若是用户使用这套session进行了登陆,那么攻击者使用一样的session去访问,就截取到了用户此次会话了。(这种攻击叫Session Fiaxtion - 固定会话攻击)
这些就是所谓的session hijacking,用户会话劫持。
那么接下来的问题是,攻击者如何能获取到用户会话呢?
经过XSS攻击漏洞就能够达成目标,这个咱们会在后续去探讨。
其实还有更简单的方式,服务器所颁发的这个session的标识符,也是基于必定的规则生成的。若是这套规则过于简单,那么经过猜都能猜出来!
DVWA就给咱们演示了什么叫过于简单的session规则:
真是。。。太简单了,简单的数字递增。想要攻击,很容易就能够猜出sessionid,而后加以利用。
下面咱们一样看看DVWA是如何增强session颁发机制的:
Medium级别防护
<?php $html = ""; if ($_SERVER['REQUEST_METHOD'] == "POST") { $cookie_value = time(); setcookie("dvwaSession", $cookie_value); } ?>
使用时间戳来生成session标识,仍是挺好猜的。
High级别防护
<?php $html = ""; if ($_SERVER['REQUEST_METHOD'] == "POST") { if (!isset ($_SESSION['last_session_id_high'])) { $_SESSION['last_session_id_high'] = 0; } $_SESSION['last_session_id_high']++; $cookie_value = md5($_SESSION['last_session_id_high']); setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false); } ?>
颁发完了的sessionID长这样:
看起来好厉害哦,MD5加密了。
然鹅,破解他只须要0.05秒的MD5在线解密了解一下?
Impossible防护
<?php $html = ""; if ($_SERVER['REQUEST_METHOD'] == "POST") { $cookie_value = sha1(mt_rand() . time() . "Impossible"); setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], true, true); } ?>
使用随机数+时间戳+常量字符串+sha1加密。好吧,确实很难猜出来了,是否是impossible呢?唔。。。
事实上到此为止咱们还不能全面讨论会话劫持的测试,由于还有不少种劫持的方法咱们没有去了解。
不过呢,咱们能够借这个机会来解释一下安全测试的大方向。
路是一步步走出来的,一样的道理,产品的安全能力也是一层一层构建起来的。
一个产品的防护机制是一种典型的1+1>2的概念。
我在项目中间常常看到这种现象:因为如今的前端技术也比较成熟了,不少后端工程师就依赖于前端去完成数据校验工做,后端校验就省去了。
可是实际上任何产品的安全机制都应该是层层叠加的体系,任何单层的防护都不能确保产品的绝对安全。
上面提到的先后端校验就是很好的例子:前端校验实在太容易绕过了,后端必需要作好二重校验,这就是个双保险的概念。
回到用户劫持攻击的测试,session标识颁发规则就是产品层叠防护机制中的其中一层。
测试人员能够经过解读这一规则来判断他的合理性。简单来讲,若是大家的session标识规则,你可以想办法破解掉,不用想了报bug吧。