• JS逆向——建筑市场监管公共服务平台


    全国建筑市场监管公共服务平台(四库一平台)

    问题:(1)接口返回值加密 

    1、接口返回的数据为加密后的文本,先根据密文长度无法直接判断具体的加密方式d2dc962c2f6a1fd2648d4fc2ccabe43e.png

    2、个人比较喜欢用hook,所以先对几个常用的加解密函数进行hook,并进行控制台输出(hook的工具写在下面,需要的自行提取)

    4c9e6954035c4d8c9c959a0bf6e54ba9.png

    3、上图可以很清楚的看到,红色部分是接口链接的参数部分,绿色部分为已经解密过后的数据,也就是我们需要的,最下面蓝色部分也可以看到解密后的文本经过了json.parse解析成数据字典,这里可以从json.parse入手。

    4、定位到 json.parse这行的hook函数中,并在此处打上断点,在进行下一页操作,到此处暂停后发现右侧调用栈里又个方法h( ),跟进去

    8e77f9c45612e8568cf8b49036a89871.png

    5、 即可发现,t 为接口请求的密文,并且加密方式为AES.CBC,偏移量为

    1. f = d.a.enc.Utf8.parse("jo8j9wGw%6HbxfFn")
    2. m = d.a.enc.Utf8.parse("0123456789ABCDEF")

    6、至此我们就可以用代码进行还原解密函数

    1. var CryptoJS = require('C:/Data/npm/node_modules/crypto-js')
    2. function getDecryptedData(t) {
    3. var m = CryptoJS.enc.Utf8.parse("0123456789ABCDEF"),
    4. f = CryptoJS.enc.Utf8.parse("jo8j9wGw%6HbxfFn"),
    5. e = CryptoJS.enc.Hex.parse(t),
    6. n = CryptoJS.enc.Base64.stringify(e),
    7. a = CryptoJS.AES.decrypt(n, f, {
    8. iv: m,
    9. mode: CryptoJS.mode.CBC,
    10. padding: CryptoJS.pad.Pkcs7
    11. }),
    12. r = a.toString(CryptoJS.enc.Utf8);
    13. return r.toString()
    14. }
    15. var fs = require('fs')
    16. fs.readFile('./jzsc_mohurd.txt','utf8',function(err,dataStr) {
    17. if(err){
    18. return console.log("读取文件失败!"+err.message)
    19. }
    20. console.log(getDecryptedData(dataStr))
    21. })

    7、请求接口,并执行以下方法,此处说下,我是用的cmd执行的node命令,由于我电脑环境下,接口的加密字符远远超过了命令行的最大字符数,所以采用了 jzsc_mohurd.txt 文件做中转。

    1. def get_data(projectType, region_id, page):
    2. '''
    3. 获取接口数据
    4. @return:
    5. '''
    6. url = 'https://jzsc.mohurd.gov.cn/api/webApi/dataservice/query/project/list?projectType={}&projectRegionId={}&pg={}&pgsz=15'.format(
    7. projectType, region_id, page)
    8. headers = {
    9. 'Host': 'jzsc.mohurd.gov.cn',
    10. 'Referer': 'http://jzsc.mohurd.gov.cn/data/project',
    11. 'User-Agent': getUserAgent()
    12. }
    13. res = requests.get(url, headers=headers)
    14. logger.debug('接口:{}'.format(url))
    15. logger.debug('获取的密文为:{}'.format(res.text))
    16. with open('./jzsc_mohurd.txt', 'w', encoding='utf-8') as f:
    17. f.write(res.text)
    18. decrypt_data()
    19. def decrypt_data():
    20. """
    21. 解密接口数据
    22. @param ciphertext:
    23. @return:
    24. """
    25. logger.debug('数据解密...')
    26. cmd = "node jzsc_mohurd.js"
    27. with os.popen(cmd) as fp:
    28. bf = fp._stream.buffer.read()
    29. try:
    30. plaintext = bf.decode().strip()
    31. except UnicodeDecodeError:
    32. plaintext = bf.decode('gbk').strip()
    33. logger.debug('解密后的数据为:{}'.format(plaintext))
    34. return plaintext

    8、即可看到结果

    附录:工具推荐|一款爬虫界的神兵利器,值得拥有

  • 相关阅读:
    你有真正了解过国产开源框架APM工具——SkyWalking技术有多牛吗
    【表情包分享】国庆假期结束了,该上班了,来分享一下你的表情包吧!
    CSS通用样式3——表格
    基于单片机的停车场车位管理系统设计
    vue路由(十)实现有无权限(token)登录跳转判断详细教程
    学习jQuery库的第一天
    【无标题】
    redis cluster 集群,终极方案?
    C++中如何将string类型转换为int类型?
    Swift 并发
  • 原文地址:https://blog.csdn.net/qq_40279964/article/details/126035758