在Web渗透流程的暴力登录场景和爬虫抓取场景中,经常会遇到一些登录表单用DES之类的加密方式来加密参数,也就是说,你不搞定这些前端加密,你的编写的脚本是不可能Login成功的。针对这个问题,现在有三种解决方式:
①看懂前端的加密流程,然后用脚本编写这些方法(或者找开源的源码),模拟这个加密的流程。缺点是:不懂JS的话,看懂的成本就比较高了; ②selenium + Chrome Headless。缺点是:因为是模拟点击,所以效率相对①、③低一些; ③使用语言调用JS引擎来执行JS函数。缺点是:每个JS引擎执行的效果会不一致,导致一些小偏差; 第③种方式中,Python语言能利用的库有PyExecJS、PyV8、Js2Py三种,PyV8使用就报错(我暂时没解决),Js2Py相当于将JS翻译成Pyhton,Js2Py对于复杂JS而言非常容易出错。所以本文主要讨论通过Python语言的PyExecJS库(切换不同的JS引擎)来执行JS函数的过程。PyExecJS官网案例
pip 安装:
pip install PyExecJS
Demo:
import execjs print(execjs.eval("'red yellow blue'.split(' ')")) ctx = execjs.compile(""" function add(x, y) { return x + y; } """) print(ctx.call("add", 1, 2))
输出:
['red', 'yellow', 'blue'] 3
查看JS引擎信息
# 1.在windows上不需要其他的依赖便可运行execjs, 因为默认有个JScript库,如果要运行其他JS引擎库,就需要另外安装了。 # windows默认执行的JS环境 execjs.get().name #返回值: JScript # 如果想要切换,用os.environ["EXECJS_RUNTIME"] = "XXX",如果刚安装完其他JS引擎,必须配置环境变量,还可能需要重启电脑或重启IDE。 # 如果windows上装有Node.js , 可以切换Node os.environ["EXECJS_RUNTIME"] = "Node" print(execjs.get().name) #返回值: Node.js (V8) # 如果windows上装有PhantomJSs , 可以切换PhantomJS os.environ["EXECJS_RUNTIME"] = "PhantomJS" print(execjs.get().name) #返回值: PhantomJS # 2.在ubuntu下需要安装执行JS环境依赖, 作者的环境为PhantomJS execjs.get().name #返回值: PhantomJS # 3.源码中给出, 可执行execjs的环境: PyV8 = "PyV8" Node = "Node" JavaScriptCore = "JavaScriptCore" SpiderMonkey = "SpiderMonkey" JScript = "JScript" PhantomJS = "PhantomJS" SlimerJS = "SlimerJS" Nashorn = "Nashorn"
安装PhantomJS步骤
下载地址:
http://phantomjs.org/download.html
拷贝到脚本到你的Python环境里:
把下载下来的文件解压,找到目录里.\phantomjs-2.1.1\bin\
下的phantomjs.exe,移动到使用的python文件夹下的Script中。
# 举例 Anaconda3 D:\programfiles\Anaconda3\Scripts
添加系统变量:
D:\programfiles\Anaconda3\Scriptsphantomjs.exe
添加到系统变量中。
验证:
添加环境变量后,在cmd中验证可以使用phantomjs命令,说明环境搭建好了。
在python中切换成PhantomJS:
os.environ["EXECJS_RUNTIME"] = "PhantomJS"
案例1
1.访问目标网站的登录页面并查看源码