Web安全 - Session劫持

  • 作者:KK

  • 发表日期:2017.11.30


什么是Session劫持

当 A 和 B 进行通讯时,这就是一个会话过程,Session 就是会话的意思,会话劫持的典型情况有如下:

  1. C 冒充了 A 与 B 通讯,而 B 一直以为自己在跟 A 通讯,例如 A 说“我爱你”,C 劫持后将内容改成“我恨你”,结果就让 B 以为 A 恨他。

  2. C 修改了 A 与 B 之间互相传递的数据,比如增加了自己的广告内容或恶意代码等让其中一端通过某个漏洞被执行。

  3. A 与 B 之间的通讯数据都被 C 监听了。

那么这个 C 就是会话的劫持者。还有更多劫持的例子可以上网查查。


例子:劫持 PHP 的 SESSIONID 冒充登录状态

  1. 浏览器A登录一个简单的 PHP 站点,当它用 session 函数 保存用户登录信息后,会给客户端返回一个默认叫PHPSESSIONID的 cookie,例如值是“ abc ” 这样吧。

  2. 启动另一个不同牌子的浏览器B访问同样的站点但不登录,在浏览器的 Console 里执行document.cookie += ';PHPSESSIONID=abc';,使得浏览器B的 cookie 也有这个 PHPSESSIONID。

  3. 然后浏览器B不进行登录操作,直接访问用户中心等其它登录后才能访问的页面,结果成功通过了登录校验并以浏览器A的用户身份访问了这个站点的内部页面。

这是一个手动劫持的例子,通过偷窥 cookie 复制了一份同样的到另一个地方即可,假设浏览器B是另一台电脑,一样可行。

那么再换一个角度思考,我们的网络数据都会经过路由器节点,或者某些网络代理节点,这些节点可以拦截下我们的数据,复制一份为他们所用,那就可以实现上面的劫持目的了。

而另外我也试过在内网的另一台电脑设置同样的京东商城 cookie (来源于我同事的电脑),实现了在这台电脑上以他的身份上网购物,由于这种问题难以避免,所以这些网上商城在重要操作发生的情况下就要求输入手机验证码、支付密码等。


体验一次简单的劫持

这里用 Finddler抓包 来进行示例,开启 Finddler的代理能力,让其他电脑或手机设置代理为你的代理,然后这台设备的一切 http请求 都会经过这里并被你看到,只要是明文,你喜欢复制哪个数据就复制哪个数据,甚至还可以注入 Finddler脚本 做你喜欢的事情。


措施:用https协议加密传输

之所以被劫持最典型的就是因为数据出去后经过的各个节点可能存在监控行为,所以这些节点能复制或篡改我们的数据。其实让他们看不懂我们的数据就行了,https 是目前最流行的方式,它实际上是浏览器发送数据前将数据加密再传输,真正的目标接收一这个数据后才能解密,中间任何人都无法解密。

加密后只能在报文上看到请求的目标域名是什么,但看不到域名后面的那部分内容。其实我们平时

如果用不了https,请尽量做到下面的措施。


措施:http协议下不要将口令放在 GET 参数上

http请求 会有报报头和报文什么的,许多服务器会对请求做日志,比如一些高端的路由器会记录请求出去的网址都有哪些,以统筹哪些网站的访问率最高,是否要屏蔽该网址等(看设置功能原支持),完整地记录整个请求体会耗费太大的容量而且通常没多大作用,所以就记录了请求头(GET http://xxx.com/a.html HTTP/1.1 这一行东西)。

而像 Apache、Nginx 这些 http服务器 也是会默认记录请求头,所以如果像token、SESSIONID这样的值放在URL上或多或少会更容易暴露给外面,应该放在报文体里


措施:http下账号密码也不要放在报文里

由于好多站点登录时都会将表单的账号和密码参数字段命名为 email、username、password 这些典型的容易识别的词汇,所以黑客可以在网络节点上监视报文里是否有这些关键词,有的话就把相关报文记下来然后定时看看抓到了什么,拿着这些账号密码去相关的站点登录盗取财产。