前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >记一次调用网页JS解决前端加密

记一次调用网页JS解决前端加密

原创
作者头像
亿人安全
发布2024-12-27 09:19:09
发布2024-12-27 09:19:09
8700
代码可运行
举报
文章被收录于专栏:红蓝对抗红蓝对抗
运行总次数:0
代码可运行

文章首发在:先知社区

https://xz.aliyun.com/t/16413

前言

在做渗透测试过程中,难免会遇到前端加密的情况,这个时候就需要我们对js进行逆向来生成或者解密想要的内容,可以使用python直接调用函数处理,直接使用网页自己的JS代码,省去我们分析的时间。本文简单记录了一次使用pyexecjs库自动化调用相关函数处理该情况的实际案例。

案例

又一次遇到了前端加密,还不搞不行,只能看看咯。跟着步骤来,相信大家都能搞定前端加密这种情况

定位关键函数

通过观察请求及响应包,获取关键字符串,快速定位相关函数

图片
图片

直接定位搜索参数字符串serviceid或者具体的id号,这里我搜索的是服务id号

图片
图片

在这里下断点,简单跟一下加密流程,发现加密关键函数是c=$(b, x.value),继续跟踪这个函数的生成

图片
图片

这里声明了一个新的类l5,在当前js文件检索l5

图片
图片

继续检索,发现是从其他js文件引入来的(这里面的函数及文件引用后缀,每次刷新网页都会变化)

图片
图片

通过简单的函数跟踪,我们就可以大致确定加密函数在哪里,引用了什么文件。我们将有加密函数的js文件和其依赖文件都下载下来。

使用pyexecjs调用执行

首先安装pyexecjs库,直接pip安装即可

代码语言:javascript
代码运行次数:0
复制
pip install PyExecJS

引入js文件,并调用相关函数的关键代码

代码语言:javascript
代码运行次数:0
复制
with open('your.js','r',encoding='utf8',errors='ignore') as f:
    jscode = f.read()

ctx = execjs.compile(jscode)
result = ctx.call('your_func', '参数1','参数2')

调用js并直接发包

代码语言:javascript
代码运行次数:0
复制
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
import execjs
import json
from enc import aes_encrypt

import requests
headers = {
    'Host': 'xxxx',
    'Cookie': 'xxxx',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0',
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN',
    'Origin': 'xxxxx',
    'Referer': 'xxxxx',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'Priority': 'u=0',
    'Content-Length': '0',
    'Te': 'trailers',
    'Connection': 'keep-alive'
}

def encodehash(p):
    navigator = """
var navigator = {
  userAgent: 'Python-ExecJS',
  appVersion: '1.0',
};
"""

    window = """
var window = {};
window.document = {};
"""

    with open('tree-BbjKWDWs.js','r',encoding='utf8',errors='ignore') as f:
        jscode = f.read()

    ctx = execjs.compile(window + '\n'+ navigator + '\n'+ jscode)
    result = ctx.call('re', json.dumps(p),'密钥')

    return result

url = 'https://xxx'
# 100012接口
for i in range(0,9):
    user = 'xxxxx' + str(i)
    p1 = {"identityMethod":["Mobile Number","Email"],"identityType":"xx","account":user}
    data = {
        "param": encodehash(p1),
        "serviceId": "100012"
    }
    res = requests.post(url,json=data,headers=headers)
    print(res.json())

即可实现构造加密请求发送的效果

问题解决

pyexecjs执行js代码报错gbk问题

报错信息: UnicodeEncodeError: 'gbk' codec can't encode character 解决办法 脚本中加入这个代码

代码语言:javascript
代码运行次数:0
复制
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")

pyexecjs不支持ES6导致模块加载导出报错

解决办法 需要将下载的js文件代码中的导入导出更改为CommonJS

代码语言:javascript
代码运行次数:0
复制
// 导出
export {Jt as K, $t as a, Xt as h};
// 导入
import {K as x, a as K, h as q} from "./module.js";
// 导出
module.exports = {K: Jt, a: $t, h: Xt};
// 导入
const {K: x, a: K, h: q} = require('./module.js');

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章首发在:先知社区
  • 前言
  • 案例
    • 定位关键函数
    • 使用pyexecjs调用执行
  • 问题解决
    • pyexecjs执行js代码报错gbk问题
    • pyexecjs不支持ES6导致模块加载导出报错
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档