Chrome开发者工具(F12)分析前端加密(AES)实战

背景:
平时在渗透测试过程中,经常会遇到前端提交的数据是经过加密的,用burp等工具截断后无法解密,不能进行fuzz或者爆破测试(不严谨,爆破好像也算FUZZ,能看懂就行了,大佬勿笑)。今天就带来一个实战案例,用谷歌浏览器分析(逆向)前端加密过程。以便编写脚本模拟加密进行相关测试任务。如下:
登录操作–burp抓包:
在这里插入图片描述
在这里插入图片描述
分析:
1、查找绑定事件:
既然是点“登录”后前端(JS)将加密数据发送到了后端,那么这个加密行为一定是绑定在“登录”按钮的“点击事件”上的。使用元素选择器选择“登录”按钮,查找出“登录”按钮绑定了两个点击事件。
在这里插入图片描述
2、确定“加密”事件:
找到了两个事件,怎么知道加密到底在哪个事件上呢?使用"Remove"先删除事件试试(注意,这步并不是必须的,具体环境可能不同。这里主要为了顺便演示下Remove功能)。
在这里插入图片描述
删除一个事件后继续进行登录操作,发现一切正常,数据照样加密并请求到了后端。说明加密行为的入口应该在第二个事件上。
在这里插入图片描述
3、分析加密过程
直接点击事件函数所在的JS,会自动进入Sources标签下,并定位到事件绑定的函数处。
在这里插入图片描述
在这里插入图片描述
简单分析下代码,发现它最终执行了SignIn()函数。使用“查找功能”找到SignIn()函数。
在这里插入图片描述
再简单分析下SignIn()函数,发现最终它执行的有效函数时login(),继续查找定位到login()函数。
在这里插入图片描述
分析下login()函数,它的功能其实就是通过一个回调函数判断登录是否成功了,如果看不太懂也没关系,在if上打断点,看下它的判断条件,发现是服务器返回的数据,这说明if的地方加密已经执行过了。
在这里插入图片描述
看看下面的代码,既然是加密,那一定是将明文传递进去,输出密文。那么我们再找明文,因为毕竟明文我们是已知的,很明显,明文的位置就在if的上面,selfInfo变量。找到了明文的变量,我们就继续找将明文传递进去的函数,很明显就是这个RongGuangFun.AjaxFun.GetAjaxNoValidate函数了。

function login() {
    var selfInfo = {
        username: escape($("#username").val()),
        password: escape($("#password").val())
        , ParentModuleGuid: ''
    };
    console.log(selfInfo); //这句是我为了测试手动添加的。
    RongGuangFun.AjaxFun.GetAjaxNoValidate(selfInfo, WebApiUrl + "api/Login/UserLogService", function LoginLoad(data) {
        if (data.Flag) {
            if (data.IsEnabled === "1") {
                RongGuangFun.AjaxFun.GetAjaxNoValidate(null, WebApiUrl + "api/Login/GetAllDictionary", function LoginLoad(dicdata) {
                    window.localStorage.setItem("UserInfo", JSON.stringify(data));
                    window.localStorage.setItem("Dictionary", JSON.stringify(dicdata));
                    alldic = window.localStorage.getItem("Dictionary");
                    window.location.href = "index.html";
                });
            } else {
                $(".input-val").val('');
                refresh();//刷新验证码
               // layer.msg('该账号已被禁用,请联系管理员!');
                layer.msg(data.Msg);
            }
        }
        else {
            $(".input-val").val('');
            refresh();//刷新验证码
           // layer.msg('账号或密码错误,登录失败!');
            layer.msg(data.Msg);
        }
    });
}

然而,RongGuangFun.AjaxFun.GetAjaxNoValidate这个函数在哪里呢?两种方法,都是在打断点的状态下,直接把鼠标指到函数上;或者在右边的全局变量里找可以找到。
在这里插入图片描述
定位到RongGuangFun.AjaxFun.GetAjaxNoValidate所在的JS文件,期盼已久的加密函数浮出水面。
在这里插入图片描述
在ajax请求之前打个断点,测试一下,果然,就是我们要的结果。
在这里插入图片描述
现在我们已经找到了加密函数,下一步自然是分析加密的方式了。在还未进入加密函数内部的地方打断点,进行测试。
在这里插入图片描述
点击“跳入函数中去”的按钮,跳到加密函数中。加密函数没有格式化比较难看,再点击格式化。得到我们最终想要的加密方式–AES。
在这里插入图片描述
将明文内容、IV、KEY、AES加密模式、字符集代入到在线AES进行测试,结果完全一致。至此,整个分析过程结束。
在这里插入图片描述
解密下试试,也没问题,得到明文。
在这里插入图片描述
结语:
个人见解:
1、前端使用加密是防不了暴力破解的,工作中经常遇到开发为了修复暴力破解的问题将用户名、密码加密了,其实是自欺欺人。前端无论是对称加密、非对称加密还是HASH甚至是自己开发的加密方式,理论上都是可以模拟的。
2、对称加密解决不了http的明文传输的问题,如上,拿到加密数据再分析前端的加密方式,就可以破解了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值