
简单参数加密
更新: 2025/2/24 字数: 0 字 时长: 0 分钟
Cookie加密
难度:非常简单
访问网址获取任务,在 Network 里面的 Fetch/XHR 选项中定位到网页数据的来源接口:
**多次访问前面 3 页的页面,发现一个规律,如果访问之间的间隔时间稍微长一点,下次访问就要求强制访问 loginfo 页面,说明该页面设置的 Cookie 的过期时间较短。**根据以往的爬虫经验,分析请求头参数,得出初步接结论:
sessionid:不同的请求,该值会发生变化。
yuanrenxue_cookie:未知加密参数。
Hm_l开头的参数:无效参数,不验证。
看看 Fiddler 所抓到的数据包:可以看到在每次请求 loginfo 页面时,前面都会有两次请求。
看看第一次请求,在响应头返回了 Cookie 中的 sessionid 参数,在响应内容中返回了 Cookie 的 yuanrenxue_cookie 参数:
看看第二次请求,响应的内容是要使用的前端代码,分析作用不大:
解题方法:把第一次请求返回的响应头中的 sessionid
和响应内容中的 yuanrenxue_cookie
拿出来就可以进行请求了。
GET参数加密
难度:非常简单
访问网址获取任务,在 Network 里面的 Fetch/XHR 选项中定位到网页数据的来源接口:
访问前面 3 页,分析前 3 页请求头参数后,得出初步接结论:
page:页码
m:加密参数
**现在我们需要定位到,哪一行的代码发送了当前的请求,点击左侧的 Initiator 选项,它主要是标记请求是由哪个对象或进程发起的(请求源),重点关注里面的 request 请求。**显示从一个名称为 12 的文件的第 723 行代码发送了当前请求,点击后面的地址:
跳转到了该文件的第 723 行,看上面有两个很熟悉的参数 page
和 m
,再看后面跟的值,这下就可以对加密参数得出结论了:
page:值为window.page,即页码。
m:值为'yuanrenxue'+页码,再通过btoa()方法转为Base64编码。
警告
btoa()
是浏览器环境全局的 window
对象转码 Base64 编码的方法,这里我们可以使用 Python 中 base64
标准库转为 Base64 编码,由于在 Node 环境中没有全局的 window
对象,btoa()
方法是不可用的,如果想在本地的 Node 环境转换 Base64 编码,就要用到 Node 环境中的特定模块 Buffer
对象,使用 Buffer.from('转码内容').toString('base64')
方法,就能将字符串转码为 Base64 编码。
POST参数加密
难度:简单
抓包网站的登录接口,发现网站发送登录 POST 请求前,对账户的密码进行了加密:
我们在控制台分析一下加密后数据,发现长度位为 32 位,且由字母和数字组成,因为 MD5 哈希后的数据统一为 32 个的十六进制数,因此我们猜测使用了是 MD5 哈希,:
接下来我们在元素版块通过网页“登录按钮”定位到 HTML 代码中的一个 onclick="CheckForm()"
点击事件:
在元素版块中进行搜索点击事件执行的函数名称 CheckForm()
,发现一个同名 JS 函数,可以看到在函数前面先去请求了一个 md5.js
文件,在函数中对用户密码进行了一个 hex_md5
哈希:
为了确保该网站使用了标准的 MD5 哈希,我们去到在线 MD5 网站,输入我们请求的密码进行哈希,发现结果和上面加密的结果一样,到此可以判定密码使用了“标准的MD5哈希”。
请求头加密
题目难度:非常简单
访问题目获取题目信息后,往后翻 2 页:
查看 Fiddler 的抓包,一模一样:
接下来,我们只选中 /challenge/api
进行 3 次重放攻击,发现均失败,而且即使和 /cityjson
一起重放攻击,也是失败:
现在我们再往后翻一页,点击 URL,对比前后请求参数的变化:发现 safe
、timestamp
两个参数发生变化,虽然 safe
参数值的来源未知,但 timestamp
参数值稍微有点爬虫经验的人都会联想到和时间戳相关,现在我们要寻找 safe
、timestamp
两个参数值的来源。。
回到 Chrome 浏览器中,现在我们需要定位到哪一行的代码发送了当前的请求,点击左侧的 Initiator 选项,它主要是标记请求是由哪个对象或进程发起的(请求源),重点关注里面的 call 调用,点击后面的 @1:100
链接:
跳转到了名称为 1 的文件,代码行数在 100 行的位置,可以看到在这里发送了一个 ajax 请求,而且在 beforeSend
也就是发送请求之前里面有 request.setRequestHeader
操作,即设置请求头的操作,里面就有我们想要的 safe
、timestamp
两个参数:
**观察代码发现,timestamp
参数的值就是时间戳除1000后的字符串, safe
参数的值就是 timestamp
参数的值加上 9622
字符串进行 Base64 编码再通过 hex_md5
函数进行处理。**将上面代码整理如下:
var timestamp = String(Date.parse(new Date()) / 1000);
var safe = hex_md5(window.btoa('9622' + timestamp));
鼠标移动到 hex_md5
函数上,发现该函数的来源于 md5.js
中的第25行,盲猜和上面一道题中的 hex_md5
一样,使用的标准 MD5 哈希,这里和上面一样可以找网站进行验证就不再赘述:
这里还有一个 window.btoa
方法,它其实就是 btoa
方法一样,因为 window
在浏览器中是底层的对象,在使用方法时可以省略不写,于是这里和上面一样可以使用 Python 中 base64
标准库转为 Base64 编码,当然也可以在我们本地的 Node 环境中使用 Buffer.from('转码内容').toString('base64')
将其转换 Base64 编码: