zoukankan      html  css  js  c++  java
  • 登录页面JS前端加密绕过

    前言

    实习的时候有幸看了一次内部分享,有大师傅分享了下前端加密下如何爆破构造=>通过一个bp的插件实现。当时我碰到几个后台也有这种情况,有几个是md5加密或者base64加密的,我直接将字典中的密码全部md5一遍做成新的字典再放到bp中跑,但是碰到RSA,AES,DES的话就不能这样了(其实也能这样),但是我们要是去测试登录框是否有sql注入的时候,就不能这样通过死的字典去一个一个看,有没有更简单的方式去加密我们的payload呢

    测试方法

    第一种:

    利用c0ny师傅写的jsEncrypter插件本地起一个服务,将payload发送通过服务器加密一遍再返回给bp来,相当于本地还原加密过程

    第二种:

    自己写JS脚本去遍历字典,将payload字典都加密一遍,然后作为新的字典去跑

    其实第一第二钟差不多,但是第一种就是本地起个中间加密服务,bp直接字典跑指定jsEncrypter插件处理后发送即可。

    第二种其实也可行,完全可以的,根本不需要写脚本,一会儿演示下。

    第一种方法

    下载安装

    首先下载jsEncrypter插件

    https://github.com/c0ny1/jsEncrypter

    通过mvn package打包编译或者直接下release的最新版本

    然后下载phantomJS(无头浏览器)

    http://phantomjs.org/download.html

    下载后加入环境变量

    安装完成

    本地demo测试

    将/test/webapp放到phpstudy里测试demo,然后模拟下真实情况下使用该插件,做两个示例,一个最简单的base64,一个稍微实战复杂一点点的RSA

    base64

    抓包发现密码被加密成base64格式

    右键查看源代码,去找加密的函数和js

    CryptoJS对象属于crypto-js.js,然后将crypto-js.js下载下来,放到script目录

    将phantomjs_server.js修改如下

    然后运行

    测试成功

    爆破密码账号密码admin/admin,爆破出密码admin

    RSA

    抓包

    看JS找加密函数,找js文件

    找到隐藏的表单输入项public_key(公钥)

    下载jsencrypt.js到本地,修改phantomjs_server.js

    启动然后测试

    爆破

    实战测试

    由于没有记录当时实习遇到的前端加密的登陆页面,只能现找,找了半天,勉强算找到一个AES加密的,但是有验证码,这里就test一下就行了,不爆破了

    登陆抓包如下:

    iv,key一起跟着传的-0-

    查看登陆按钮对应的事件,function,找到对应的onclick函数

    可以通过打断点去测试加密函数在哪里

    找到encrypt函数

     

    发现在aes.js中,下载到本地script,修改phantomjs_server.js文件

    test一下测试下

    OK,与加密的一样,成功,这里有两个需要加密的地方,如果是交叉爆破完全可以调成两个负载位置,然后两个负载位置的攻击模块进行同样的操作,通过扩展处理即可

    第二种方法

    不管是将字典加密还是灵活的将一句一句payload加密,这个方法都可以实现,比较取巧

    用法就是直接通过浏览器的Console直接调用加密函数加密我们的list,但问题是字典比较多,要一个一个填入比较麻烦,通过python脚本处理一下即可。比如用Demo中的RSA加密来测试

    JS代码

    function crypto(str)
    {
    var encrypt = new JSEncrypt();                           
    encrypt.setPublicKey($("input[name=public_key]").val());
    en_password = encrypt.encrypt(str);
    return en_password;
    }
    
    var list=["admin","root","guest","fuck"];
    var newlist=[];
    for(var i=0;i<list.length;i++)
    {
      newlist+=crypto(list[i])+"
    ";
    }
    console.log(newlist);

    如果要用这种方式的话,字典过大的话,需要用python处理成js数组的样子

    该方式比较讨巧,相当于用加载好的js环境对我们需要的payload进行加密即可

    第三种方法

    首发于90sec

    参考链接:

    shamo

    yuyan-sec

    c0ny

  • 相关阅读:
    Max History CodeForces
    Buy a Ticket CodeForces
    AC日记——字符串的展开 openjudge 1.7 35
    AC日记——回文子串 openjudge 1.7 34
    AC日记——判断字符串是否为回文 openjudge 1.7 33
    AC日记——行程长度编码 openjudge 1.7 32
    AC日记——字符串P型编码 openjudge 1.7 31
    AC日记——字符环 openjudge 1.7 30
    AC日记——ISBN号码 openjudge 1.7 29
    AC日记——单词倒排 1.7 28
  • 原文地址:https://www.cnblogs.com/BOHB-yunying/p/13961579.html
Copyright © 2011-2022 走看看