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

从底层的角度来说,前端和后端谁 都不能修改cookie
仔细想想,前端是javascript 语言,一个语言凭什么修改本地电脑的文件?
后端是远在天边的一台服务器,是另外一台电脑,这台电脑怎么可能可以操作用户电脑上面的文件?
所以从本质上面来讲,真正操作Cookie 的是浏览器,因为浏览器在用户的电脑上面运行,所以他有权利操作电脑文件
前端是通过在浏览器运行javascript代码,来让浏览器操作cookie
后端是通过http请求的Response Header中设置操作cookie的请求,浏览器接收到请求才会去操作cookie

所以真正操作cookie 的是浏览器

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

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第1张图片

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

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第2张图片

从图中就可以看到,我们的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"--->>"+c.getValue()+"
"
; } } return result; } }

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

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

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

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

界面返回:

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第3张图片

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

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第4张图片

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

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第5张图片

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

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

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

127.0.0.1:8080/readAllCookie

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第6张图片

在请求头中 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测试

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第7张图片

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

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第8张图片

在请求也没有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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第9张图片

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

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第10张图片

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第11张图片

再次关闭浏览器,并打开

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第12张图片

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 的Domain,MaxAge ,存储,Cookie诈骗分析_第13张图片

然后是百度知道的cookie

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第14张图片

下面把两个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是什么样子的

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第15张图片

红框 和黑框的 的的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 看下

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第16张图片

可以看到123成功的写入了

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

查询看看

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第17张图片

并没有!!

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

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第18张图片

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

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

在百度知道的地方设置

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

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第19张图片

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第20张图片

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第21张图片

5.强行设置domian看看

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

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

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

查询看一下,发现并没有

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第22张图片

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

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

打开软件再看一下

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第23张图片

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

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

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

6.有趣 的实验,强行指定cookie,实现Cookie诈骗

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

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

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第24张图片

改变前 cookie如上图

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

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第25张图片

改变后,软件中显示的cookie

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第26张图片

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

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

ok,成功读取

Cookie 的Domain,MaxAge ,存储,Cookie诈骗分析_第27张图片

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

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

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

你可能感兴趣的:(Java,Web)