Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析

测试浏览器是chrome浏览器,不同的浏览器对cookie 的操作可能会有不同

Cookie 保存在浏览器端,Cookie既可以在前端操作,也可以后端操作
前端操作cookie 是javaScript完成:document.cookie
后端操作cookie,比如java,response.addCookie()

Cookie 是保存在本地的 ,以Chrome 为例,当前账户的administrator
那么Cookie就保存在这个地方
C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default

虽然用chrome的插件edit this Cookie 也可以进行cookie 的查看和编辑,但是用文件查看的话更加的彻底,可以看到Cookie 到底是怎么保存的.

用notepad++ 打开一看,奈何还是加密的,根本就看不了

这里写图片描述

好在看到了前面的几个文件的头部SQLite format 3

换了好几个软件,终于使用 SQLiteSpy 这个软件打开了Cookie ,并读取到了Cookie 的内容
菜单中Filer–>OpenDataBase 打开Cookie 文件即可

这里写图片描述

从图中就可以看到,我们的Cookie 到底是怎么存储的,它存储的结构到底是什么样子的

下面从后端java的角度来看下Cookie

编写一个java 的后端

package com.example.cookietest.Control;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
public class CookieTest {

    @RequestMapping("/addCookie")
    @ResponseBody
    public String addCookie(String cookieName,String cookieValue,HttpServletResponse response){

        Cookie cookie=new Cookie(cookieName,cookieValue);

        response.addCookie(cookie);

        return "ok";
    }

    @RequestMapping("/readAllCookie")
    @ResponseBody
    public String readAllCookie(HttpServletRequest request, HttpServletResponse response){
        Cookie[]cookies=request.getCookies();
        String result="";
        if(cookies!=null){
            for(int i=0;i<cookies.length;i++){
                Cookie c=cookies[i];
                result+=c.getName()+"--->>"+c.getValue()+"<br>";
            }
        }
        return result;
    }
}

一共提供了两个接口,一个接口是添加Cookie,一个接口是读取所有的Cookie .
测试前先删除浏览器的所有的缓存.

1.添加cookie,并观察Cookie 文件

打开浏览器F12,开发人员工具,在浏览器访问:

127.0.0.1:8080/addCookie?cookieName=123&cookieValue=456

界面返回:

这里写图片描述

仔细分析一下浏览器的返回,可以在Response Heades 中发现有一行
Set-Cookie:123=456
有这么一行就表明,浏览器拿到了后端的设置cookie 的要求,浏览器拿到要求后,就会在本地写入Cookie

切换到Application看看 Cookie 的一些其他属性

这里写图片描述

在这里可以看到,虽然后端没有指定Cookie的Domian,path和MaxAge,但是浏览器直接就默认了,其中注意的是Maxage的值是session,这个我们下面分析

上面浏览器拿到了 Set-Cookie:123=456 这样的一个请求
回到软件,刷新看一下,看看究竟能不能从本地Cookie文件中读取到

这里写图片描述

在右侧可以看到Cookie 的数值写到文件里面去了

第三列可以看到cookie 的name 是123
但是 ,第四列value居然是空 的,难道是cookie 的数值没有写进去?

访问我们的第二个接口看看

127.0.0.1:8080/readAllCookie

浏览器确实拿到的cookie的值了,

这里写图片描述

在请求头中 Request Headers中可以看到 这一行:
Cookie:123=456
有这一行就说明了,前段已经把Cookie带给后端了

那么为什么本地的Cookie 的value是空的了?
其实问题就出在了Chrome的Cookie 值的存储位置,

chrome为了安全并没有明文 保存Cookie 的value 值 ,猜测是将它进行了加密,保存为Blob,放到了数据库的encrypted_value 这个字段,也就是倒数第二行的字段

关键是 SQLiteSpy 这个软件还没有办法把这个Blob快读取出来,后来想到直接上java jdbc代码进行读取.费劲波折终于将里面的数据读取出来,之前搞nutch爬取网页的时候 那个时候存的也是Blob,经过utf-8 处理后就正确显示了,然而Chrome 的这个并Blob经过utf8处理并不能正确的显示,看来Chrome对Cookie加密了.

虽然无法对加密的值进行解密,但至少我们可以看到cookie 确实保存到本地文件了

2.Cookie 的MaxAge测试

这里写图片描述

还是上面的那个图片,在没有设置CookieMaxAge的情况下,可以看到数据库的第6列expires_utc这个数值是0,这个表示的是会话级别的Cookie ,也就是说只要关闭浏览器的话,再次打开浏览器是读取不到数值的.

关闭浏览器再打开,读取cookie,如下图,拿不到cookie值

这里写图片描述

在请求也没有Cookie字段,这说明了,前端就没有携带Cookie 给后端

既然Cookie 的数值是会话级别的,那么Cookie 的数值是什么时候删掉的了?是一关掉浏览器就删除?
并不是,是在下一次访问前的时候删除!

证明:
在关闭浏览器后,刷新 SQLiteSpy 依旧是有数据的,
一旦访问 127.0.0.1:8080/readAllCookie 后,再刷新软件,Cookie 的值就没有了

在addCookie 的接口 中添加这一句代码

cookie.setMaxAge(24*60*60);

再次把应用跑起来
访问addCookie 的接口

127.0.0.1:8080/addCookie?cookieName=111&cookieValue=222

访问后看看Response Headers

这里写图片描述

在response Headers 中
set-Cookie 后面加上了MaxAge,并且后面还自动算好了过期时间

打开浏览器的Application 看一下,在Expires/Max-Age中的值就不在是session ,而是具体的过期时间

这里写图片描述

再次打开软件,看看本地Cookie, 这个时候就可以看到Cookie 的expires_utc不是0

这里写图片描述

再次关闭浏览器,并打开

是可以读取到Cookie 的, 这个说明设置Cookie 的有效期是成功的

这里写图片描述

3.domain

现在手上没有域名,这个还不好分析,但是可以借助第三方网站试试看
比如百度www.baidu.com

最近接触domian 是因为sso单点登录的原因,以前做项目单点登录是 单系统多页面,这次接触的项目做的 多系统,多页面的单点的的登录.

除了我们给甲方做系统,其他的团队也会给甲方做系统,多个系统之间如何保存token ,才能多个系统完成统一的存取.

统一是可以多样的,目前有一种方法是采用cookie 保存

一个新的问题来了? A系统设置的Cookie,B系统就能访问么? 答案不好说

比如百度设置的cookie ,我们访问新浪,浏览器会把百度设置好的cookie带上去访问新浪么?
肯定不会,浏览器会严格检查,必须要保证谁设置的cookie 带给谁.

那么怎么才能ok了?

答案就是通过设置cookie 的Domain

比如A系统的域名是A.xyz.com
B系统的域名是B.xyz.com

要让这个cookie 在这2个系统之间实现cookie共享,不管是A系统还是B系统,需要指定cookie 的domain为xyz.com

结论:要想让cookie在两个系统之间共享,那么这2个系统的域名必须要有相同的部分,然后设置Cookie 的domian为域名中相同的部分

手上没有域名,只好借助百度来演示一下
百度有很多的系统,比如百度贴吧系统,比如百度知道系统,他们的域名中都有相同的部分baidu.com

就以这两个系统进行举例

首先一次访问这两个系统,并用js 打印cookie

首先是百度贴吧的cookie

这里写图片描述

然后是百度知道的cookie

这里写图片描述

下面把两个Cookie复制下来, 进行一下整理

首先是百度贴吧的:
BAIDUID=2B9C972E84A60E9689D24713ED03B542:FG=1;
BIDUPSID=2B9C972E84A60E9689D24713ED03B542;
PSTM=1531127738;
H_PS_PSSID=1466_26431_21113_18559_26350_22160;
BDORZ=B490B5EBF6F3CD402E515D22BCDA1598;
TIEBA_USERTYPE=cb23caaea9344956384a5774;
Hm_lvt_98b9d8c2fd6608d564bf2ac2ae642948=1531127507; Hm_lpvt_98b9d8c2fd6608d564bf2ac2ae642948=1531127507; PMS_JT=%28%7B%22s%22%3A1531127509993%2C%22r%22%3A%22https%3A//tieba.baidu.com/index.html%22%7D%29

然后是百度知道的:

BAIDUID=2B9C972E84A60E9689D24713ED03B542:FG=1;
BIDUPSID=2B9C972E84A60E9689D24713ED03B542;
PSTM=1531127738;
H_PS_PSSID=1466_26431_21113_18559_26350_22160;
BDORZ=B490B5EBF6F3CD402E515D22BCDA1598;
Hm_lvt_6859ce5aaf00fb00387e6434e4fcc925=1531127511; Hm_lpvt_6859ce5aaf00fb00387e6434e4fcc925=1531127511”

两个系统都有的Cookie加粗显示,单独特有的斜线显示

下面进入软件看下本地的Cookie是什么样子的

这里写图片描述

红框 和黑框的 的的host 是.baidu.com
篮框的host 是.zhidao.baidu.com
黄框的host是.tieba.baidu.com

从图中可以看到,两个系统都有的cookie 的host 是.baidu.com

百度贴吧特有 的cookie :TIEBA_USERTYPE,看一下他的host 是:.tieba.baidu.com

这个就是贴吧所独享的cookie ,访问百度知道不会带上

如上面的百度所示,百度贴吧和百度知道要想实现Cookie共享,只要设置他们域名共同的部分就可以,也就是 .baidu.com

4.js操作cookie

先用贴吧来进行测试

在浏览器添加一个cookie

document.cookie="132=456"

再次查询一下cookie 看下

这里写图片描述

可以看到123成功的写入了

百度贴吧写入成功了,在百度知道 会不会看到了?

查询看看

这里写图片描述

并没有!!

猜测是设置的时候,domian是tieba.baidu.com 所以百度知道读取不到

为了验证猜想打开 软件看下

这里写图片描述

果然不出所料,用js操作Cookie 不指定domian的情况下,默认是访问网址的全域名

下面用js操作cookie 的时候指定下domian为.baidu.com 看下

在百度知道的地方设置

document.cookie="abc=123;domain=baidu.com"

然后查询一下,在百度知道这边是没有问题的,不出意外的话,在百度贴吧的页面也是可以读取到的

这里写图片描述

下面去百度贴吧的网站查询cookie 看一下
ok 是没有问题的

这里写图片描述

再次检查下 写到cookie的文件,host 也是没有问题的:.baidu.com

这里写图片描述

5.强行设置domian看看

我们强行设置domian看看 行不行

比如我们在百度贴吧设置新浪的cookie

document.cookie="66666=99999;domain=sina.com"

查询看一下,发现并没有

这里写图片描述

因为我们访问的是百度的网页,所以浏览器怎么会让你看到新浪的cookie 了?

访问不到是正常的,那么cookie 究竟是写入了cookie ,但是当前是百度的网页浏览器不让访问新浪的cookie,
还是因为当前是百度的网页,浏览器不许js写入sina.com的cookie了,所以自然看不到?

打开软件再看一下

这里写图片描述

可以看到没有cookie,因此,是cookie没有写入.

操作cookie 的网页是百度,那么只能设置百度相关的cookie,你强行设置新浪的cookie是无效的,浏览器是不会响应的.

这个其实也很好理解,如果可以设置,新浪的cookie岂不是可以被百度搞坏掉?

6.有趣 的实验,强行指定cookie

虽然浏览器不让执行,但是最终浏览器还是还要从cookie文件中读取
所以我们强行修改文件,强行指定domian看看

我们把127.0.0.1的一个cookie 强行指定给百度看看

在软件上面写一条语句,强行改变

这里写图片描述

改变前 cookie如上图

改变前,浏览器百度贴吧页面读取cookie

这里写图片描述

改变后,软件中显示的cookie

这里写图片描述

有希望,因为这里的domian成功的变成了.baidu.com

废话不多说,打开百度看看

ok,成功读取

这里写图片描述

可以用这个实现简单的本地cookie 诈骗

唯一的遗憾就是chrome使用了本地的加密,无法对加密后的cookieValue进行编辑,要实现cookie诈骗只能先自己保存cookie的value,在修改它的domian

先抛块砖,希望有人可以交流交流,chrome的Cookie value 的破解。

猜你喜欢

转载自blog.csdn.net/a897180673/article/details/80975312
今日推荐