gentlespider 发表于 2021-3-15 09:30

新人报道:澎湃新闻js逆向

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

#### 目标url:https://www.thepaper.cn/
进入首页后,根据搜索按钮进行搜索,url为:https://www.thepaper.cn/searchResult.jsp
这是一个POST请求,参数为:
```markdown
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请求就可以拿到(见下图)
![](https://upload-images.jianshu.io/upload_images/17902660-2de32fa2d149a0d3.png?imageMogr2/auto-orient/strip|imageView2/2/format/webp)
#### 接下来就是seeda和sckval的获取
利用浏览器调试工具搜索功能,直接搜索seeda,可以看到是在login.js里面生成的。
然后我们会发现,seeda和sckval都是在里面生成的,这里还是比较简单的
![](https://upload-images.jianshu.io/upload_images/17902660-13048961f0a8a782.png?imageMogr2/auto-orient/strip|imageView2/2/format/webp)
#### 打上断点,然后我们发现,codeData和suuid就是我们之前获取的,o.seeda和n的值就是seeda和sckval。
![](https://upload-images.jianshu.io/upload_images/17902660-c1ae3831f3d3a0e3.png?imageMogr2/auto-orient/strip|imageView2/2/format/webp)

![](https://upload-images.jianshu.io/upload_images/17902660-f930b54964bdb576.png?imageMogr2/auto-orient/strip|imageView2/2/format/webp)

![](https://upload-images.jianshu.io/upload_images/17902660-913fec0342fc4cd1.png?imageMogr2/auto-orient/strip|imageView2/2/format/webp)

![](https://upload-images.jianshu.io/upload_images/17902660-e80d7e38f9b4efa7.png?imageMogr2/auto-orient/strip|imageView2/2/format/webp)

#### ok,接下来我们看下参数是否是一致的
![](https://upload-images.jianshu.io/upload_images/17902660-87b68f17d82481d2.png?imageMogr2/auto-orient/strip|imageView2/2/format/webp)
#### 经比对,发现确实是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中执行命令,安装这个包了
```markdown
npm install crypto-js
```
#### 接下来是改装的js代码
```JavaScript
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就是sckval,seeda就是seeda
}
```
#### 然后使用python来执行这段代码:
```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))
print("sckval:{}".format(result))
```
#### 测试结果:
![](https://upload-images.jianshu.io/upload_images/17902660-92cf418a453c7187.png?imageMogr2/auto-orient/strip|imageView2/2/format/webp)

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

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在加密解密时保持一致就可以。

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

感觉楼主的教程和思路{:301_998:}

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

小白进来学习来了。
页: [1] 2 3 4 5 6
查看完整版本: 新人报道:澎湃新闻js逆向