第三个js逆向项目--使用node.js执行js文件

1,597 阅读5分钟

从网站中分析出来js代码执行的部分,然后我们将其提取出来,之前我们使用的是execjs执行js代码,实现数据的破解,但是execjs的局限性很大,像很多的传统的库我们可以直接使用js进行引用,不需要繁杂的扣取过程,直接借助node.js的环境,执行js获取数据

第一步:熟悉需求

目标网站:jzsc.mohurd.gov.cn/data/compan…

image-20220307143951589.png

第二步:找到异步加载的接口,分析接口数据

我们看到数据展示到了页面上,我们来找xhr请求

image-20220304094707622.png

应该就是从这list?pg=0&pgsz=15&total=0请求中获取的数据,我们首先分析有没有加密参数,发现并没有,可以直接请求到拿到数据

image-20220304094811091.png

当我们看数据的时候,发现数据部分是一串字符串

image-20220304094831411.png

我们可以得到的结论就是,数据被加密了,前端从后端获取到数据后,通过js进行了解密,将数据提取出来放到了页面上,分析js吧

第三步:我们要找到解密js部分

3.1 搜索

在上个项目中返回的还是个json,这样我们可以获取到键的名称进行搜索,但是这个我们获取到的是一堆字符串,所以我们使用技巧,搜索JSON.parse

image-20220304095047502.png

3.2 分析js

有个技巧就是:我们搜索到的多个匹配项,我们直觉过滤,然后我们在不能分辨的上面打上断点,刷新页面,看是否经过那个接口,经过,看看和我们的数据是不是相同的,可以快速的选择出我们要找的变量

image-20220304095152995.png

3.3 打上断点,刷新页面调试

详细调试过程上个教程中有,这个部分直接查找进行使用

image-20220307144111996.png

经过在控制台测试,我们可以发现,数据就是通过这个部分解析的,所以接下来就是扣取js的过程了

改写js:对js代码进行简单的整合,变成我们想要的格式

function decode(t) {
    var e = JSON.parse(h(t));
    return e
}

3.4 追查相关的js

原则:缺什么补充什么

我们可以新建一个js文件,将刚才的o函数放入其中,运行代码

# encrypt_data 可以从请求中获取
import execjs
with open("test.js","r",encoding="utf-8") as f:
    str1 = f.read()
ctx = execjs.compile(str1)
a = ctx.call('json_parse', encrypt_data)

我们得到错误 h 不存在 ,寻找h方法,查找过程上个教程中有详细陈述

function h(t) {
    var e = d.a.enc.Hex.parse(t)
    , n = d.a.enc.Base64.stringify(e)
    , a = d.a.AES.decrypt(n, f, {
        iv: m,
        mode: d.a.mode.CBC,
        padding: d.a.pad.Pkcs7
    })
    , r = a.toString(d.a.enc.Utf8);
    return r.toString()
}

接下来按照常规的操作我们应该在运行脚本,定位下一个缺失元素,但是敏感的发现enc.Hex.parse(t),enc.Base64.stringify(e)等这些都是crypto-js库中的加密手段,所以我们可以直接使用crypto-js,我们对上面的js代码进行改写

//这里引入了crypto-js库,所以我们一定需要js运行环境,简单的execjs不能完成,需要使用nodejs
var waws = require("crypto-js")
function h(t) {
    var e = waws.enc.Hex.parse(t)
    , n = waws.enc.Base64.stringify(e)
    , a = waws.AES.decrypt(n, f, {
        iv: m,
        mode: waws.mode.CBC,
        padding: waws.pad.Pkcs7
    })
    , r = a.toString(waws.enc.Utf8);
    return r.toString()
}

使用node调用写好的js文件

电脑中已经安装了nodejs,没安装的自行百度进行安装

image-20220304100857888.png

在node中安装crypto-js

image-20220304100843309.png

调用写好的js,node test.js

image-20220304101327761.png

继续缺什么补什么的模式,缺失 f 我们去网站中查找

image-20220304101429228.png

更新代码为

var waws = require("crypto-js")

function o(t){
    var res = JSON.parse(h(t.data));
	return res
}


function h(t) {
    var e = waws.enc.Hex.parse(t)
      , n = waws.enc.Base64.stringify(e)
	  , f = waws.enc.Utf8.parse("jo8j9wGw%6HbxfFn")
      , a = waws.AES.decrypt(n, f, {
        iv: m,
        mode: waws.mode.CBC,
        padding: waws.pad.Pkcs7
    })
      , r = a.toString(waws.enc.Utf8);
    return r.toString()
}

var res = o("fa8f1891eb026fa5ffabbd521d5acd4dace8066fd57432ad7076b9deb603f4891cb3191f0d89580e6318716b02a1436068eabf7b0d83f4c4ec321449073189023e4fe6381eb360dc5544119aa38b27c6a16270179cc00764df1096772f6c31ae7b691e6091254a81f40152e5125f984d34e721254db09fa56ddbed19028d3979951bfce54c93d1233fc11840f69fbd254324e06b4e20e50b438ab87c329dc57f9ce781cd6881c1365ca41a17690f7c75a32ac7f56e95457d9e1d5ac2ecd6113e6b8ad31e3d19966e28a38bc028217040770da17e2418366b03dcceef88357059")
console.log(res)

在此执行node test.js

image-20220304101518789.png

image-20220304102905810.png

继续修正js文件

var waws = require("crypto-js")

function o(t){
    var res = JSON.parse(h(t.data));
	return res
}


function h(t) {
    var e = waws.enc.Hex.parse(t)
      , n = waws.enc.Base64.stringify(e)
	  , f = waws.enc.Utf8.parse("jo8j9wGw%6HbxfFn")
	  , m = waws.enc.Utf8.parse("0123456789ABCDEF");
      , a = waws.AES.decrypt(n, f, {
        iv: m,
        mode: waws.mode.CBC,
        padding: waws.pad.Pkcs7
    })
      , r = a.toString(waws.enc.Utf8);
    return r.toString()
}

var res = o("fa8f1891eb026fa5ffabbd521d5acd4dace8066fd57432ad7076b9deb603f4891cb3191f0d89580e6318716b02a1436068eabf7b0d83f4c4ec321449073189023e4fe6381eb360dc5544119aa38b27c6a16270179cc00764df1096772f6c31ae7b691e6091254a81f40152e5125f984d34e721254db09fa56ddbed19028d3979951bfce54c93d1233fc11840f69fbd254324e06b4e20e50b438ab87c329dc57f9ce781cd6881c1365ca41a17690f7c75a32ac7f56e95457d9e1d5ac2ecd6113e6b8ad31e3d19966e28a38bc028217040770da17e2418366b03dcceef88357059")
console.log(res)

在此执行即可得到数据

image-20220304103117532.png

我们发现我们已经可以拿到数据了,破解完成。