吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5588|回复: 52
收起左侧

[Web逆向] 新人报道:澎湃新闻js逆向

[复制链接]
gentlespider 发表于 2021-3-15 09:30

提前说明下,这个是我在简书上写的笔记,并不是抄袭哈

目标url:https://www.thepaper.cn/

进入首页后,根据搜索按钮进行搜索,url为:https://www.thepaper.cn/searchResult.jsp
这是一个POST请求,参数为:

inpsearch: 要搜索的内容
codeData: LsF0e2W1esW8kI0H
seeda: gzA1%2BNaOjkJv1TEQV8BlnrOqr2Zg9vWXwjsZTtzbeyA%3D
suuid: e20225ee-f703-43a9-a8b1-c399b3c05712
sckval: 48da52276a132e1f1811b2838ab8b913

上述参数中,codeData和suuid可以直接获取,url为:https://www.thepaper.cn/getCheckCodeData.jsp
发送post请求就可以拿到(见下图)

接下来就是seeda和sckval的获取

利用浏览器调试工具搜索功能,直接搜索seeda,可以看到是在login.js里面生成的。
然后我们会发现,seeda和sckval都是在里面生成的,这里还是比较简单的

打上断点,然后我们发现,codeData和suuid就是我们之前获取的,o.seeda和n的值就是seeda和sckval。

ok,接下来我们看下参数是否是一致的

经比对,发现确实是seeda和sckval的生成逻辑

看生成逻辑可以得出:sckval是对codeData和uuid的组合进行CryptoJS.MD5处理得到的,
seeda是encodeURIComponent 处理s得到的,而s是对codeData进行
CryptoJS.AES.encrypt加密生成的。
幸运的是CryptoJS是node.js的一个包,encodeURIComponent是js自带的方法,都可以直接找到。

分析出方法之后,怎么使用python执行呢

我试过使用AES包去解决,AES.new(key,model,iv) 当model为ECB模式的时候会报错,
就很懵逼,干脆就直接使用pycharm安装node.js环境算了。
安装的过程就不赘述了,大家自行查询就可以啦

安装完了node.js环境之后,就可以在pycharm的Terminal中执行命令,安装这个包了
npm install crypto-js  
接下来是改装的js代码
const CryptoJS = require("crypto-js"); //引入crypto-js
function bs(codeData,suuid) {
    var t = {};
    var e = CryptoJS.lib.WordArray.random(16).toString(CryptoJS.enc.Hex)
      , i = CryptoJS.enc.Utf8.parse(codeData);
    md = CryptoJS.mode.ECB;
    var s = CryptoJS.AES.encrypt(codeData, i, {
        iv: CryptoJS.enc.Hex.parse(e),
        mode: md,
        padding: CryptoJS.pad.Pkcs7
    });
    seeda = encodeURIComponent(s);

    var n = CryptoJS.MD5(codeData + suuid).toString();
    return [n,seeda]  // 返回列表中n就是sckval,seeda就是seeda
}
然后使用python来执行这段代码:
import execjs
# execjs是python执行js的一个包,使用pip install pyexecjs即可安装
with open('1.js','r',encoding='utf-8') as r:
    js = r.read()
jsdm = execjs.compile(js)  
result = jsdm.call('bs','AKaqtzq2BMBN3ywv','c6163de3-5af1-492f-bd49-80de9cd65628')
print("seeda:{}".format(result[1]))
print("sckval:{}".format(result[0]))
测试结果:

经对比,结果一致。请求列表页需要把response-cookie更新进cookie中即可。

免费评分

参与人数 5吾爱币 +4 热心值 +5 收起 理由
Kristin_ + 1 我很赞同!
xifanu + 1 + 1 用心讨论,共获提升!
q2946180 + 1 + 1 66666
man2924981 + 1 + 1 热心回复!
32109 + 1 + 1 热心回学到了

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

iwhale 发表于 2021-3-16 10:18
感谢分享。
var encrypted = CryptoJS.AES.encrypt(srcs, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding
  });
var decrypt = CryptoJS.AES.decrypt(srcs, key, {
      iv: iv,
      mode:CryptoJS.mode.CBC,
      padding: CryptoJS.pad.ZeroPadding
    });
ECB,CBC 都是分组加密算法的模式,使用ecb或者cbc在加密解密时保持一致就可以。

免费评分

参与人数 1热心值 +1 收起 理由
gentlespider + 1 热心回复!

查看全部评分

iwhale 发表于 2021-3-16 11:24
gentlespider 发表于 2021-3-16 10:58
就是改成python代码的时候报了错,ECB模式直接给我报了错,一会我改成CBC试试

AES的cbc方式需要key和iv,ecb模式不使用iv,在代码实现时写法不一样,密码器的初始化参数不一样,不能简单的改一个模式mode和padding,这要注意一下。你搜一下具体的实现代码一看就明白了。当然前端的加密解密方式一定要和服务的后端保持一致才行。
qianshang666 发表于 2021-3-15 10:36
 楼主| gentlespider 发表于 2021-3-15 10:59
qianshang666 发表于 2021-3-15 10:36
感觉楼主的教程和思路

诚惶诚恐,我是要发到python版块的,但审核完事给我扔到这个板块了,我已经瑟瑟发抖了
qianshang666 发表于 2021-3-15 11:03
gentlespider 发表于 2021-3-15 10:59
诚惶诚恐,我是要发到python版块的,但审核完事给我扔到这个板块了,我已经瑟瑟发抖了

你改成笔记就行了,js解密笔记
 楼主| gentlespider 发表于 2021-3-15 11:20
qianshang666 发表于 2021-3-15 11:03
你改成笔记就行了,js解密笔记

好嘞,谢谢
农二哥 发表于 2021-3-15 12:07
感谢楼主的分享!
wanjiaoer 发表于 2021-3-15 12:29
学习了 感谢楼主.......
SnowSec 发表于 2021-3-15 12:47
感谢提供思路
往后余生都是你 发表于 2021-3-15 13:15
万分感谢楼主的分享!!
北岛明仁 发表于 2021-3-15 13:32
小白进来学习来了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 22:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表