利用python调用JS函数

利用python调用JS函数

起因:在做登陆界面的渗透测试时,对登陆功能进行弱口令检测,对目标地址爆破遇到了前端加密。

刚好学习一下如何使用python调用js的函数,竟然真的可以,万能的Py神!

安装PyExecJS库,对js文件函数进行调用

  1. PyExecJS 是使用最多的一种方式,底层实现方式是:在本地 JS 环境下运行 JS 代码支持的 JS 环境包含:Node.js、PyV8、PhantomJS、Nashorn 等首先,我们需要安装依赖包 PyExecJS

    1
    python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyExecJS
  2. 然后,从 JS 文件中读取源码

    1
    2
    3
    4
    5
    6
    def js_from_file(file_name):
    # 读取js文件
    with open(file_name, 'r', encoding='UTF-8') as file:
    jscode = file.read()

    return jscode
  3. 使用 execjs 类的compile()方法编译加载上面的 JS 字符串,返回一个上下文对象

    1
    2
    3
    4
    import execjs

    # 编译加载js字符串
    context1 = execjs.compile(js_from_file('./norm.js'))
  4. 调用上下文对象的call() 方法执行 JS 方法其中参数包含:JS 代码被调的方法名、对应方法的传入参数

    1
    2
    3
    4
    5
    6
    # 调用js代码中的add()方法,参数为2和3
    # 方法名:add
    # 参数:2和3
    result1 = context1.call("add", 2, 3)

    print(result1)
  5. 需要注意:js代码返回的字符串如果有特殊字符的话可能会出错。

    解决方法:先将字符串进行base64编码后再返回。

    1
    2
    3
    function a(str) {
    return new Buffer(str).toString("base64");
    }

下载目标js文件,并且安装其所需依赖

  1. 下载保存为target.js

    1
    const xxJS = require('crypto')
  2. 下载依赖,例如需要crypto依赖

    1
    npm install crypto
  3. 可以运行python脚本对js函数进行调用了

最后整理一下脚本:

ps:如果能写入burp就更好了,在这期间也看到了一些burp的python插件的开发

Burpy:连接你的BurpSuite和Python ==> 来自FreeBuf.COM

Github项目:https://github.com/mr-m0nst3r/Burpy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import execjs
import requests


def encrypt(clear_text: str) -> str:
with open('target.js', encoding='UTF-8') as c:
c1 = c.read()

ctx = execjs.compile(c1)
result = ctx.call('encrypt', clear_text)
return result


def decrypt(secret):
with open('target.js', encoding='UTF-8') as c:
c1 = c.read()

ctx = execjs.compile(c1)
result = ctx.call('decrypt', secret)
return result


def r():
cookies = {
'ASP.NET_SessionId': 'xxxxxxxxxx',
}

headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN',
# 'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Origin': 'http://xxxxx',
'Connection': 'keep-alive',
'Referer': 'http://xxxxx',
# 'Cookie': 'ASP.NET_SessionId=xxxxxxxxx',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
}

params = {
'ac': 'login',
}

data = {
'_loginname': encrypt(''),
'usercode': encrypt(''),
'verifycode': '',
'second': '',
}

resp = requests.post(
url='http://xx/ashx/users.ashx',
params=params,
cookies=cookies,
headers=headers,
data=data
)



if __name__ == '__main__':
print(encrypt('xxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxx'))
print(decrypt('KR0xj9cc/12+5Hu1KPNEE+pKwEjhEz+mU9EM/+JBodo='))

Refer From:

知乎 Python学习网

纷羽逍遥:https://www.bilibili.com/video/BV1ta4y1c7K2/