前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2019年末逆向复习系列之知乎登录formdata加密逆向破解

2019年末逆向复习系列之知乎登录formdata加密逆向破解

作者头像
云爬虫技术研究笔记
发布于 2019-12-17 09:00:52
发布于 2019-12-17 09:00:52
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

最有深度的研究笔记由程序员界最会排版的追星族运营

文章信息

作者: Lateautumn4lin 来源:云爬虫技术研究笔记

AKA 逆向小学生

郑重声明:本项目的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关。

这篇文章是公众号《云爬虫技术研究笔记》的《2019年末逆向复习系列》的第五篇:《知乎登录formdata加密逆向破解》

本次案例的代码都已上传到Review_Reverse上面,后面会持续更新,大家可以Fork一波。

逆向背景

知乎作为国内最大的、最优质的的问答平台之一,它的高质量回答是作为自然语言处理的最好的语料来源之一,不过想要获取更全的知乎回答数据必须要登录,涉及登录的话必然少不了做自动化登录的处理,不过知乎的登录post请求中的formdata是加密的

因此我们需要去寻找它的加密逻辑,本篇文章就是讲解如何寻找破解formdata的加密,实现自动化登录知乎。

分析流程与逆向破解

因为formdata只要一个加密后的字符串,对于我们来说,没有一个明显的特征让我们去全局搜索,因此我们采用的是xhr断点的方法去寻找哪里加密了formdata,我们通过initiator进入

根据登录api的url: /api/v3/oauth/sign_in来打xhr断点

重复我们之前的登录逻辑,可以看到,xhr断点打在如图所示位置

接下来,我们就可以通过call stack调用栈来寻找哪里加密了formdata,一个个调用分析之后,看到如图所示的地方比较符合我们期待的加密点

url确实是登录的api,并且在post请求的data处,使用了r.decamelizeKeys()方法来处理,初步估计是加密方法,我们再对r.decamelizeKeys打断点,同时去掉之前的xhr断点,这样能够帮助我们更快、更准确的定位到加密处

我们现在定位到decamelizeKeys的加密方法逻辑,这个方法包含两个参数,e和t,t现在我们还不能够准确了解它的含义,e参数的值可以直接在console里面进行打印

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
captcha: "mdgv"
clientId: "c3cef7c66a1843f8b3a9e6a1e3160e20"
grantType: "password"
lang: "en"
password: "asdd"
refSource: "people"
signature: "f45d273cd16f4f80e4fee3434d1c3009fb2248cf"
source: "com.zhihu.web"
timestamp: 1575300515085
username: "+8617610771895"
utmSource: undefined

我们分析,captcha和signature这两个参数相对其他参数来说还是比较重要,因此我们着重分析这两个参数

1. 寻找signature加密参数的加密逻辑

signature这个参数还是具有明显特征的,我们可以全局搜索

match的地方只有两个js文件,我们具体查看,可以在其中一个文件搜索signature关键字,发现它的相关代码段,这段代码很明显的是hmac算法

涉及到的值有clientId、timstamp、grandType等

插入一句:Hmac算法大致解释如下

Python的简单实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import hmac
from hashlib import sha1


def hash_hmac(key, code, sha1):
    hmac_code = hmac.new(key.encode(), code.encode(), sha1)
    return hmac_code.hexdigest()

if __name__ == '__main__':
    print(hash_hmac('08F5B4886112BC6F1E04FE42DACDB2E8', 'xinxin', sha1)
代码语言:javascript
代码运行次数:0
运行
复制

大概了解hmac算法是什么之后,我们再回头看看signature的hmac算法的逻辑是什么

具体的思路如图所示,使用sha-1作为hash函数,key是写死的,使用其他四个参数值作为message进行加密,整理思路可以用python表达出来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def _get_signature(timestamp: int) -> str:
    ha = hmac.new(
        b"d1b964811afb40118a12068ff74a12f4",
        digestmod=hashlib.sha1
    )
    grant_type = _login_data["grant_type"]
    client_id = _login_data["client_id"]
    source = _login_data["source"]
    ha.update(
        bytes(
            (grant_type + client_id + source + str(timestamp)),
            "utf-8"
        )
    )
    return ha.hexdigest()
代码语言:javascript
代码运行次数:0
运行
复制

分析完signature参数之后,我们接着来分析captcha参数

2. 分析captcha的不同场景

captcha,顾名思义是验证码结果相关的参数,这个参数的值应该是验证码相关,如图所示,验证码图片是由这个接口来返回的

我们请求了这个接口,返回了图片的base64格式,我们可以这么进行保存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with open("./captcha.jpg", "wb") as f:
            f.write(base64.b64decode(img_base64))
代码语言:javascript
代码运行次数:0
运行
复制

关于captcha的分析呢不涉及到具体的js,因为captcha的值我们可以很明显的看出来

当我们请求中文验证码lang=cn-也就是翻转汉字点选,我们传的值是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
captcha: "{"img_size":[200,44],"input_points":[[43.39996337890625,30.79999542236328],[135.39996337890625,22.79999542236328]]}"
clientId: "c3cef7c66a1843f8b3a9e6a1e3160e20"

当我们请求英文验证码lang=en-也就是四位英文字符,我们传的值是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
captcha: "mdgv"
代码语言:javascript
代码运行次数:0
运行
复制

3. 分析剩余其他参数

其他的参数就比较好看出来了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
clientId: "c3cef7c66a1843f8b3a9e6a1e3160e20"   多次试验,写死的
grantType: "password" 非第三方登录的话都是这个值
lang: "en" 针对不同验证码类型
password: "asdd" 密码
refSource: "people" 不变
source: "com.zhihu.web" 不变
timestamp: 1575300515085 时间戳
username: "+8617610771895" 用户名
utmSource: undefined 不变
代码语言:javascript
代码运行次数:0
运行
复制

到这里我们关于decamelizeKeys加密方法的e参数已经分析好了,t参数还未知,那我们就继续从刚才decamelizeKeys函数那里继续往下找,分析decamelizeKeys函数的加密逻辑

4. 分析decamelizeKeys的加密逻辑

同样是针对decamelizeKeys函数下断点,看到跳到这个地方,m方法返回n方法

查看o方法的具体逻辑

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
o = function e(t, n, r) {
        if (!d(n) || p(n) || h(n) || v(n) || l(n)) //基本没什么用,可以跳过
            return n;
        var i, o = 0, a = 0;
        if (f(n))  //这里做逻辑判断,可以扣具体js
            for (i = [],
            a = n.length; o < a; o++)
                i.push(e(t, n[o], r));
        else
            for (var s in i = {}, // 循环n(也就是data),不断的和下面那个c函数做处理
            n)
                Object.prototype.hasOwnProperty.call(n, s) && (i[t(s, r)] = e(t, n[s], r));
        return i
    }
c = function(e, t) {
        return function(e, t) {
            var n = (t = t || {}).separator || "_"
              , r = t.split || /(?=[A-Z])/;
            return e.split(r).join(n)
        }(e, t).toLowerCase()
    }
代码语言:javascript
代码运行次数:0
运行
复制

加密的逻辑主要是上面这个部分,没有混淆和平坦化什么的,大家可以自行扣扣

代码实战

根据上面的思路,我们完善代码

关于加密部分

注意下图我们在请求headers中加了两个参数

  • "x-zse-83": "3_1.1" 这个参数是用来验证客户端的版本,大概是和clientId相关,如果我们不传的话,会提示请求参数异常,请升级客户端后重试这个错误
  • "x-xsrftoken": _get_xsrf() 这个参数是跟跨域相关,是为了防Xsrf跨站的Token认证,访问首页时从Response Headers的Set-Cookie字段中可以找到

关于实战部分

注意,我们获取的是加密方法返回的headers、data、session,之所以要拿headers,是因为我们在请求验证码的时候,返回的Response Headers的Set-Cookie中有个CAPSION_TICKET字段,如果我们在post的时候不传这个cookie字段,会报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"error":{"message":"缺少验证码票据","code":120002,"name":"ERR_CAPSION_TICKET_NOT_FOUND"}}

最后注意请求的顺序,先获取验证码,再post,如果你成功的看完这篇文章,那么你会收到登录成功的结果。

复习要点

从这个复习的案例我们可以总结下思路:

  1. 在参数没有明显特征的时候,打xhr断点。
  2. 在做自动化登录的时候,每一步的header都很重要,如果你算出加密的结果却还是报错,看看是不是你漏了哪一个请求返回给你的某样东西。

号主介绍

多年反爬虫破解经验,AKA“逆向小学生”,沉迷数据分析和黑客增长不能自拔,虚名有CSDN博客专家和华为云享专家。

私藏资料

呕心沥血从浩瀚的资料中整理了独家的“私藏资料”,公众号内回复“私藏资料”即可领取爬虫高级逆向教学视频以及多平台的中文数据集

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云爬虫技术研究笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
盆盆的原创Azure Stack文档和视频
自打2015年5月微软Build大会宣布研发Azure Stack,一直到前不久微软Tech Sumit上CEO亲自宣布Azure Stack上市,盆盆一直都是这个产品的最忠实拥趸,也在华来四上发表了大量的原创技术文章。在学习和研究的过程中,盆盆积累了不少的原创视频和文档,敝帚不敢自珍,在此分享给诸位同好。
盆盆
2019/04/24
7070
主流 PaaS 平台架构:谷歌GAE、AEB、Cloud Foundry、Heroku
公有 PaaS 平台并没有达成共识,没有统一应用的 PaaS 服务 API,因此不便于应用在各平台之间移植。谷歌、亚马逊与微软三大巨头在 PaaS 领域分庭对立,在强大的技术实力与基础资源的支撑下,构建了与自身文化相对应的公有云 PaaS 平台。相对于三大巨头,于2007 年起家的 Heroku,正是由于看到了大平台厂商对应用代码的“侵入性”,以及对开发人员的“绑架”,因而独辟蹊径地开发了一套可移植的 PaaS 平台。
博文视点Broadview
2020/06/11
6.8K0
图解架构:SaaS、PaaS、IaaS
上次聊到了架构图如何画,其中涉及到了云服务的架构图,里面提到了很重要的三个概念 PaaS、IaaS、SaaS,很有必要在这里总结一波。
悟空聊架构
2024/06/26
1.5K0
图解架构:SaaS、PaaS、IaaS
IaaS、PaaS和SaaS的区别
任何一个在互联网上提供其服务的公司都可以叫做云计算公司。其实云计算分几层的,分别是Infrastructure(基础设施)-as-a-Service,Platform(平台)-as-a-Service,Software(软件)-as-a-Service。基础设施在最下端,平台在中间,软件在顶端。别的一些“软”的层可以在这些层上面添加。
兮动人
2021/06/11
2.1K0
IaaS、PaaS和SaaS的区别
微软:云原生的MySQL托管服务架构及读写分离的优化
内容来源:2017 年 08 月 24 日,微软中国首席产品经理宋青见在“ODF 2017开源数据库论坛(北京)”进行《云原生的MySQL托管服务架构及读写分离的优化》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。
IT大咖说
2018/08/08
1K0
微软:云原生的MySQL托管服务架构及读写分离的优化
传统企业PaaS平台功能设计与业务上云思考
伴随着Docker技术的兴起,以及容器集群管理平台Mesos、Kubernetes、Swarm、Rancher等的大行其道,仿佛PaaS平台及其相关技术一下进入了黄金时期,各种各样的技术组合,各种各样的技术验证,以及伴随着容器相关的创业公司布道,仿佛只要有了PaaS平台及其相关的技术,就能解决一切的企业IT问题。但是,企业IT,尤其是非互联网传统企业,PaaS平台的构建与业务上云是一个长期的过程,绝不是一个docker+kubernetes/Mesos/Swarm构建完以后就能完成的,IaaS年代是这样,PaaS年代也是这样。
孙杰
2019/10/29
2.8K0
开源PaaS Rainbond的架构与实现
回顾云计算产业技术的发展,IaaS层虚拟化的逐步成熟,解决了过去使用物理计算集群所面对的资源提供者和使用者之间的耦合问题,一定程度上降低了交付应用和创造业务价值的门槛,但在开发和运维的技术难度方面表现一般。
Rainbond开源
2018/07/31
1.2K0
开源PaaS Rainbond的架构与实现
同时面向运维和开发的企业级PaaS平台--OpenShift
大卫说:笔者在年初分享过一篇文章《大卫看Docker-第一篇》。文中介绍了Docker一些基本概念。本文同时作为《大卫看Docker-第二篇》而存在。 随着容器技术的兴起,越来越多的人都在
魏新宇
2018/03/22
2.1K0
同时面向运维和开发的企业级PaaS平台--OpenShift
IAAS与PAAS的开发者视角
本文讨论了IaaS和PaaS这两种云计算服务模型的不同,从开发人员的角度分析了IaaS和PaaS之间的主要差异。作者通过举例说明在IaaS和PaaS中,开发人员可以做什么以及他们不能做什么。IaaS提供了一个虚拟化的计算环境,包括服务器、存储和网络资源,而PaaS提供了一个完整的应用程序开发和部署平台。作者指出,PaaS将更多控制权交给开发人员,允许他们自定义操作系统、中间件、运行时和数据库等。
Shedray大数据专栏
2018/01/04
1.6K0
如何快速区分IaaS、PaaS 、SaaS?
云是一个非常广泛的概念,它涵盖了所有可能的在线服务,但是当企业参考云采购时,通常会考虑三种云服务模式,即基础架构即服务(laaS),平台即服务(PaaS)和软件即服(SaaS)。由于云系统自身的复杂性和混合模式的组合需要大量理论技巧,在不同应用场景下,也会存在各种具体的使用模式。
齿轮易创说互联网
2018/09/14
13.1K0
如何快速区分IaaS、PaaS 、SaaS?
开源PaaS Rainbond v3.6.0正式发布,Service Mesh开箱即用
Service Mesh微服务架构是开源PaaS Rainbond在v3.6.0版本中的重点新增特性,可以开箱即用。
Rainbond开源
2018/06/20
1.1K0
容器简介
容器是云原生计算的基石之一。它们类似于早期的虚拟机(例如 VMware 提供的虚拟机),但轻量级得多。
云云众生s
2025/02/06
1690
IoT的PaaS平台
一)发展Serverless架构。 a)应用逻辑并非全部在服务端实现,而是采用FAAS(Function as a Service)架构,通过功能组合来实现应用程序逻辑。 b)Serverless架构能够让开发者在构建应用的过程中无需关注计算资源的获取和运维,由平台来按需分配计算资源并保证应用执行的SLA,按照调用次数进行计费,有效的节省应用成本。
机械视角
2019/10/23
6.3K0
IoT的PaaS平台
从开发者的角度比较IAAS与PAAS
在我之前的文章中,讨论了云计算背后的基本概念,包括其定义,特性和各种服务模型。在本文中,我将更加详细地讨论服务模型,特别是从开发者的角度来比较IAAS和PAAS。
Techeek
2018/01/17
1.5K0
从开发者的角度比较IAAS与PAAS
图文并茂!带你深度解析Kubernetes
导语 | 在云原生技术发展的浪潮之中,Kubernetes作为容器编排领域的事实标准和云原生领域的关键项目,其诞生与完善有着对应的技术历史背景,了解这个过程,对于系统的理解Kubernetes的核心思想、架构设计、实现原理等会很有帮助。 在云原生技术发展的浪潮之中,Kubernetes伴随着容器技术的发展,成为了目前云时代的操作系统。Kubernetes作为容器编排领域的事实标准和云原生领域的关键项目,已经是云原生时代工程师最需要理解与实践的核心技术。 但技术的发展从来都不是一蹴而就,Kubernetes的
腾讯云开发者
2022/07/07
8120
图文并茂!带你深度解析Kubernetes
4年!我对OpenStack运维架构的总结
最近很多人在讨论OpenStack,我也想写点东西。思来想去,云计算范畴实在广泛,自然就聊点最近话题异常火热,让广大云计算从业者爱之深、痛之切,想说一声爱你,不容易的OpenStack吧。
SammyLiu
2019/06/28
7.3K0
4年!我对OpenStack运维架构的总结
使用Azure云原生构建博客是怎样一种体验?(上篇)
我的网站是在.NET Core 平台上使用 C#语言编写的开源博客系统,运行于微软智慧云 Azure 国际版上。
Edi Wang
2019/07/22
1.8K0
使用Azure云原生构建博客是怎样一种体验?(上篇)
高可用负载均衡:开源PaaS Rainbond组件Rainbond-Entrance揭秘
负载均衡(Load Balancing)是开源PaaS Rainbond的亮点功能,主要由“软件定义负载均衡”Rainbond-Entrance控制器完成。
Rainbond开源
2018/05/17
9930
InfoQ首发报道:Rainbond,国内首个开源的无服务器PaaS
Rainbond,国内首个开源的无服务器PaaS 好雨核心项目Rainbond近日宣布开源,这是国内首个开源的无服务器PaaS,主要用来为云原生应用的整个交付流程提供生产级支持,包括基础设施管理、容器
Rainbond开源
2018/05/31
1.1K0
【重识云原生】第六章容器6.2.1节——Kubernetes概述
        为了降低虚拟机造成的物理主机资源浪费,提高物理主机的资源利用率,并能够提供像虚拟机一样良好的应用程序隔离运行环境,便诞生了容器技术。容器管理类似于虚拟机管理,主要用于容器的创建、启动、关闭、删除等容器生命周期的管理。常见的容器管理工具有:
江中散人_Jun
2022/09/28
7890
【重识云原生】第六章容器6.2.1节——Kubernetes概述
相关推荐
盆盆的原创Azure Stack文档和视频
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验