有道翻译js加密参数分析

摘要:
平时在渗透测试过程中,遇到传输的数据被js加密的比较多,这里我以有道翻译为例,来分析一下它的加密参数前言这是有道翻译的界面,我们随便输入一个,抓包分析我们发现返回了一段json的字符串,内容就是翻译后的内容当我们将"i"字段'pig'改为'dog'时,再次重放就会发现返回错误这可能就是因为post传输的其他字段的值会有所不同,其他有些字段可能被js加密了,所以,我们如果想返回正确的结果,就必须要明白前端js加密的方法是什么。

平时在渗透测试过程中,遇到传输的数据被js加密的比较多,这里我以有道翻译为例,来分析一下它的加密参数

前言

这是有道翻译的界面,我们随便输入一个,抓包分析

有道翻译js加密参数分析第1张

有道翻译js加密参数分析第2张

我们发现返回了一段json的字符串,内容就是翻译后的内容

当我们将"i"字段'pig'改为'dog'时,再次重放就会发现返回错误

有道翻译js加密参数分析第3张

这可能就是因为post传输的其他字段的值会有所不同,其他有些字段可能被js加密了,所以,我们如果想返回正确的结果,就必须要明白前端js加密的方法是什么。

具体分析

首先我们先比较一下,当传入不同的"i"值,其他字段哪些是有变化的

i: dog
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 15999987466773
sign: c7dc4265984a100efa0eedc21e7d1be4
lts: 1599998746677
bv: cc652a2ad669c22da983a705e3bca726
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_REALTlME

i: pig
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16000041380121
sign: cb9abd73ce41818afa783b0cae7b04c9
lts: 1600004138012
bv: cc652a2ad669c22da983a705e3bca726
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_REALTlME

对比发现,也就3个字段的内容不一样,简单分析一下,"salt"字段很明显就是加盐的意思,"sign"应该是某种加密以后生成的字符串,"lts"看着像是时间戳

我们先来搜索一下这些字段在js中的具体位置,然后具体分析(我们这里主要是跟踪"sign"字段)

有道翻译js加密参数分析第4张

有道翻译js加密参数分析第5张

大概加密的内容就在这块

var r = function(e) {
        var t = n.md5(navigator.appVersion)
          , r = "" + (new Date).getTime()
          , i = r + parseInt(10 * Math.random(), 10);
        return {
            ts: r,
            bv: t,
            salt: i,
            sign: n.md5("fanyideskweb" + e + i + "]BjuETDhU)zqSxf-=B#7m")
        }
    };

关键的加密点我已经用红色标注

1,我们先来看"ts",其实"ts"就是"lts"字段,将(new Date).getTime() 放在控制台下运行一下发现它其实就是一个13位的时间戳

有道翻译js加密参数分析第6张

我们在python下跑一下此刻的时间戳

importtime

print(time.time())

有道翻译js加密参数分析第7张

发现它是一个浮点型的,这里我们可以给它*1000然后取整得到我们的"lts"字段的内容

2,然后我们看一下"salt"字段,很简单,它其实就是刚刚得到的时间戳后面再加上一个10以内的随机整数(不包括10)

3,最后我们来看一下"sign"字段,它其实就是将"你要翻译的单词"+"sign的内容"+"他给你的那一串字符",最后再进行md5一下就ok了

分析完成,然后自己写脚本

最后贴上我写的脚本

1 importrequests
2 importtime
3 importrandom
4 from hashlib importmd5
5 
6 headers ={
7     "Accept": "application/json, text/javascript, */*; q=0.01",
8     "Accept-Encoding": "gzip, deflate",
9     "Accept-Language": "zh-CN,zh;q=0.9",
10     "Connection": "keep-alive",
11     "Content-Length": "240",
12     "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
13     "Cookie": "OUTFOX_SEARCH_USER_ID_NCOO=1719917773.2504172; OUTFOX_SEARCH_USER_ID="1064702900@10.108.160.19"; _ntes_nnid=b4177d72b2a1c46962196c06301101ab,1592922146778; JSESSIONID=aaaoDc-f2NpN1-vWZwhsx; ___rl__test__cookies=1599998746675",
14     "Host": "fanyi.youdao.com",
15     "Origin": "http://fanyi.youdao.com",
16     "Referer": "http://fanyi.youdao.com/",
17     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
18     "X-Requested-With": "XMLHttpRequest"
19 }
20 word = input("请输入要翻译的单词:")
21 ts = str(int(time.time()*1000))
22 salt = ts + str(random.randint(0,9))
23 str_ = "fanyideskweb" + word + salt + "]BjuETDhU)zqSxf-=B#7m"
24 md =md5()
25 md.update(str_.encode())
26 sign =md.hexdigest()
27 data ={
28     "i": word,
29     "from": "AUTO",
30     "to": "AUTO",
31     "smartresult": "dict",
32     "client": "fanyideskweb",
33     "salt": salt,
34     "sign": sign,
35     "lts": ts,
36     "bv": "cc652a2ad669c22da983a705e3bca726",
37     "doctype": "json",
38     "version": "2.1",
39     "keyfrom": "fanyi.web",
40     "action": "FY_BY_REALTlME"
41 }
42 html = requests.post(url="http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule", headers=headers, data=data).json()
43 print(html)

运行结果

有道翻译js加密参数分析第8张

这样我们就可以随意改动"i"字段的值,然后得到自己想要的结果

免责声明:文章转载自《有道翻译js加密参数分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇正则表达式__【匹配、切割、替换】【获取:Pattern & Matcher】【网页爬虫(蜘蛛)】[C++ Primer Plus] 第2章、开始学习c++下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JS实现小图放大轮播效果

JS实现小图放大轮播页面效果入下(图片为优行商旅页面照片): 实现效果:图片自动轮播,鼠标移入停止,移出继续轮播点击下方小图可以实现切换 步骤一:建立HTML布局,具体如下: <body> <div id="carousel"class="carousel"onmouseover="stop()"onmouseout="agai...

JS生成指定范围内的随机数(支持随机小数)

直接需要函数的话,直接到文章的最后面找。 ============================================================= 转载:https://www.cnblogs.com/mq0036/p/9139231.html 一、预备知识 Math.ceil(n); //向上取整。返回大于等于n的最小整数。 Math...

原生js版分页插件

之前我在自己的博客里发表了一篇用angularJs自定义指令实现的分页插件,今天简单改造了一下,改成了原生JavaScript版本的分页插件,可以自定义一些简单配置,特此记录下来。如有不足之处,欢迎指出。  需要购买阿里云产品和服务的,点击此链接领取优惠券红包,优惠购买哦,领取后一个月内有效: https://promotion.aliyun.com/nt...

JS 将UTC时间转为本地时间

在企业实际开发中,有时数据库会存UTC时间,要求不同地区的人访问可以智能识别国家,显示当地时间,下面用的是moment.js转化时间。 下载地址:https://momentjs.com/ js 转化: //初始化日期(utc->local) function dateFormatter(value) { var date = moment.pars...

Jmeter中获取返回结果中的值

jmeter做测试中,经常会有下一个请求需要用到上一个请求的返回值,那如何取到这个返回值就显得很重要。下面有两个方法,可以按照自己的熟悉程度在测试过程中灵活使用。 1、正则表达式法       正则表达式是比较直接的获取返回值得方法,只要熟悉正则表达式,就不在话下。       使用方法是,请求右键---后置处理器---正则表达式提取器,如图       ...

js日期计算及快速获取周、月、季度起止日,获取指定日期周数以及星期几的小例子

JS获取日期时遇到如下需求,根据某年某周获取一周的日期。如开始日期规定为星期四到下一周的星期五为一周。 格式化日期: functiongetNowFormatDate(theDate) { var day =theDate; var Year = 0; var Month = 0; var Day = 0; var CurrentDate =...