随着等保2.0的实施,传输过程中加密变的必要了,很多APP或者手机浏览器端逐步加密了一些加密的措施来解决这个问题,比如以下这样的数据包。

一串乱码,什么是什么都看不懂别说修改数据了。。那咋办呢? 我们可以使用firefox,chrome之类的,我个人比较喜欢firefox,以下的都是基于firefox来讲解。PHP大马

一、触发button

打开调试器ctrl+F12然后进入 调试器,刷新页面后会加载全部的js,根据习惯,一般login.js就看起来像是主要登录模块触发的函数的页面。

我们回到页面来触发这个button。前端很都操作都是基于事件绑定的。js就是事件驱动的语言,会有大量的闭包,一旦写不好就浏览器内存++,当然这个是题外话。既然是事件驱动就会有很多function.on(‘click’,callback(){})之类的操作来定义一些检测的逻辑。

我们先对需要出发的那个button,比如“登录”,“发送”之类的button,点击他的右键,然后选择“查看元素”。 Firefox会快速定位到这个元素附近的HTML结构,当然也会因为CSS层叠的问题导致定位不准,不过这个不重要,多用几次就知道如何快速定位到关键元素,我们目前还是在讲解HTML,还没开始讲解JS部分。天天好彩

然后点击event,我们快速定位到这个button点击后的事件逻辑块代码,比如以下的图。

可以看到这个button绑定了2个click事件,下面那个事件为冒泡事件,即在上面的那个click的同时,下面那个click也会被触发。这个大概的触发代码应该是$(‘#buttion_id’).click(function(){…}) ,其中,红色部分内容应该就是我们打开的这个click事件框框中的代码,我把代码全部贴出来。

以下代码是基于jquery的,要看懂的话需要一些基础,我讲的尽可能简单,让大家都可以快速明白。

 1 function() {2   if (!$(this).prop('disabled')) {3     var mobilenum = /^(13[0-9]|15[0-9]|16[0-9]|17[013678]|18[0-9]|19[0-9]|14[57])[0-9]{8}$/;4     var mob = $('.row input').eq(3).val().replace(/\s/g, '')5     if (!mobilenum.test(mob)) {6       $('#modal-error').modal('show').children('.error-content').children('.modal-body').html('请输入有效的手机号');7       return;8     }9     if (needImg) {
10       $('#modal-input').modal('show');
11       $('#modal-input .msg-code-img').eq(0).click();
12       var $_input = $('#modal-input input')[0];
13       setTimeout(function() {
14         $_input.focus();
15       }, 500);
16     } else {
17       var params = {
18         'MOBILE': $('.row input').eq(3).val().replace(/\s/g, '')
19       };
20       getPhoneCode(params);
21     }
22   }
23 }

最主要我们看17-20行的代码,构造了一个对象传入到getPhoneCode函数中,params的参数就是手机的参数 并且处理一定逻辑。

二、调试JS,下断点

接来下我们去搜索getPhoneCode(params)函数。

我们通过全局查找快速定位到这个函数的位置。

 1 function getPhoneCode(params) {2     if (!$('#msg-btn').prop("disabled")) {3         $('#msg-btn').prop("disabled", true);4         params['ajaxUrl'] = "/user2/sendSmsCode";5         params['ajaxCallBack'] = function (data) {6             if (data.MSG_CODE == 0) {7                 if (data.MESSAGE_CODE) {8                     $('.msg-code-input').val(data.MESSAGE_CODE);9                     checkNull();
10                 }
11                 /*if (show_input) {
12                  $('.tel-code-row').show();
13                  }*/
14                 $(".msg-code-img:not('#modal-input .msg-code-img'):last").click();
15                 time($('#msg-btn'));
16                 return;
17             } else if (data.MSG_CODE == '102') {
18                 if ($('.tel-code-row').css('display') == 'none') {
19                     alerterror('您的失败次数过多<br/>请输入图片验证码');
20                     $('.tel-code-row').show();
21                 } else {
22                     alerterror('图片验证码输入错误');
23                 }
24                 if (typeof show_input != 'undefined' && !show_input) {
25                     show_input = true;
26                 }
27             } else {
28                 alertfail();
29             }
30             $('#msg-btn').prop("disabled", false);
31         }
32         submitAjax(params);
33     }
34 }

32行之前都是一些逻辑和判断的代码 和我们想要调试的没关系,4-5行是把一些信息包装进了params参数中,最终通过32行的submitAjax函数来执行,我们继续跟踪这个函数 ,方法和上面一样,全局搜索这个方法。

submitAjax函数的定义如下:

 1 //提交数据2 var submitAjax = function (dataObject) {3     var ajaxUrl = UC_URL + dataObject.ajaxUrl4     delete dataObject.ajaxUrl5     var ajaxCallBack = dataObject.ajaxCallBack;6     delete dataObject.ajaxCallBack;7     dataObject.CHNLID = dataStore.getItem("CHNLID");8     dataObject.BACKURL = unescape(Base64.decode(dataStore.getItem("backUrl")));9     dataObject.VERSION = "1.32";
10     if (null != dataObject.BACKURL) {
11         dataObject.BACKURL = getDomain(dataObject.BACKURL);
12     }
13     if (null == dataObject.CHNLID && null == dataObject.BACKURL) {
14         dataObject.CHNLID = 'SF';
15         dataObject.BACKURL = location.host;
16     }
17     var JsonParams = JSON.stringify(dataObject);
18     var rsaCommit = function (JsonParams) {
19         var RSAParams = RSAUtils.encryptedString(rsaKey, JsonParams);
20         $.ajax({
21             type: "POST",
22             cache: false,
23             dataType: "json",
24             url: ajaxUrl,
25             contentType: 'text/plain',
26             data: RSAParams,
27           ...82 }

去掉了一些不重要的代码,我们主要来看dataObject参数。我们先对这个地方下个断点。

然后我们回到页面,填写好手机号,点击“获取验证码”,让代码跑起来。

我们可以看到dataObject参数就2个属性,然后继续往下跟,在Json.stringfy之前下断点,因为最后加密的函数是第19行,RSAUtils.encryptedString(rsaKey, JsonParams);其实有经验的同学可以直接在这里下断点查看,这里的rasKey是没有定义的,只有这个JsonParams,而 JsonParams就是刚才的dataObject对象的json序列化。

我们可以看到,在变成json格式之前,程序加入了一些其他的参数,这个不重要。接下来我们下断点到 RSAUtils.encryptedString函数。然后来看rsaKey参数是什么,鼠标移上去显示是undefined..

因为代码只var rsaKey,并没赋值任何。。。不知道程序员在想什么,这个类的加密string方法显然是需要一个加密的key的,也就是私钥,其实这个程序有一个密钥,不过不是这个函数里的。

所以其实前端加密来阻止参数修改没意义的。。

三、构造参数

最后我们需要理解上面的流程和逻辑

获取需要的参数比如mobile,版本等信息

json序列化

加密

发送至服务端

最后的代码是:

1 var my = {MOBILE:"15*******",CHNLID:"SF",BACKURL:"*****.com.cn",VERSION:"1.32"};
2 var data = JSON.stringify(my);
3 var rsaKey;
4 RSAUtils.encryptedString(rsaKey, data);

最后得出的值是:

我们再和直接用burpsuite抓到的值对比下:

其他的一些思考

基本上就结束了,接来下我们可以构造任何我们想要的值来替换掉传输,因为至此我们可以构造任何想要的参数来篡改。

其实换个思路,我们可以编写一些插件(其实已经有类似的插件) ,例如早起的Tamper Data 插件之类的,或者自己写脚本引入,在一些关键代码之前反射出对象的全部属性.

从程序员角度来看,我们可以看到他有好几个加密方法,有的传了密钥,有的没有。而且代码都是部分混淆,部分没有,其实提高一下门槛的话,应该把login.js之类的 也混淆了。虽然这种混淆对我这样的安全工程师没什么用,但是waf不也是这样的思路吗?

把全部的js混淆了不仅可以压缩代码的字符数,减少服务器压力和带宽,还可以提高安全的门槛,增加破解难度,在交互中多次传输一些长度很高的token,迷惑安全人员,再使用一些js和浏览器的hack技术,使得门槛可以非常高。 比如这些js的奇怪特性。

javascript中那些奇怪的特性

JavaScript中的”奇奇怪怪”

前端加密之使用Firefox来解密相关推荐

  1. 前端php解密,转发:RSA实现JS前端加密,PHP后端解密

    web前端,用户注册与登录,不能直接以明文形式提交用户密码,容易被截获,这时就引入RSA. 前端加密 需引入4个JS扩展文件,jsbn.js.prng4.js.rng.js和rsa.js. RSA L ...

  2. PHP密码问题陈婷代码_登录中利用JS前端加密PHP后端解密保证数据非明文传输的安全方法...

    为什么要研究这个呢,因为我所在单位的信息管理部门在监控系统上发现有大量的明文账号(身份证号)和密码在传输,被告知这很不安全,索性就直接解决这个问题,利用JS前端加密PHP后端再加密来解决这个问题,保证 ...

  3. RSA非对称加密传输---前端加密解密(VUE项目)

    A要传给B一句话(需要保密),就由B生成一对公钥和私钥存好,公钥就好比一把锁,钥匙就是私钥.B只需要把锁给A,A把那句话锁起来,交还给B,在这过程中,即使大家都能看到公钥(锁),也是不知道那句话是啥的 ...

  4. 前端加密解密 crypto-js

    目录 1. 了解加密解密 2. 实现库 3.方法封装-前端 4. 示例 5. 不使用封装 6. 说明 总结 加密算法类库,进行 MD5. SHA1. SHA2. SHA3. RIPEMD-160 哈希 ...

  5. 前端加密php后端解密,使用RSA怎么实现JavaScript前端加密与PHP后端解密功能

    使用RSA怎么实现JavaScript前端加密与PHP后端解密功能 发布时间:2021-02-08 15:19:14 来源:亿速云 阅读:97 作者:Leah 这期内容当中小编将会给大家带来有关使用R ...

  6. 国密SM2前端加密,Java后台解密问题

    背景:要实现请求参数加密的功能,使用的是国密SM2算法,前端向后台发送请求获取公钥,将请求加密发送到后台,后台用对应的私钥进行解密 问题:前端进行加密的请求,后台无法进行解析 解决方案:(此处所用的类 ...

  7. RSA加密web前端用户名密码加密传输至后台并解密

    RSA加密web前端用户名密码加密传输至后台并解密 编写加解密公共方法类RSAUtils import org.apache.commons.codec.binary.Base64; import j ...

  8. 国密SM2的前端加密,后端解密(Java版本)及SM3 摘要加密

    一.简介 国密即国家密码局认定的国产密码算法.常用的主要有SM2,SM3,SM4. SM2:椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,为非对称加密,基于ECC.该算法已公开.由于该算法基于EC ...

  9. 关于RSA加密技术的使用,js前端加密,Golang 后端解密 详细

    关于RSA加密技术的使用,js前端加密,Golang 后端解密 详细 关于rsa 加密算法 可自行参考 rsa算法 前端JS如何使用rsa进行加密 安装jsencrypt[二选一] github下载地 ...

最新文章

  1. java gif 帧_在Java中修复动画gif的帧速率
  2. Oracle 9i 从9.2.0.1升级到 9.2.0.6 步骤
  3. mysql 排序 简介
  4. MariaDB三种方法安装及多实例实现
  5. selenium IE 浏览器驱动下载地方
  6. 程序控制发送文件到邮箱_Kindle电子邮箱推送
  7. stderr java_如何使用Log4j将stdout和stderr写入/捕获到文件并使用Windows和Tomcat 5.5(Java)?...
  8. hibernate连接mysql配置文件
  9. java stream groupingBy
  10. 2021-11-24 摘抄:软件产品的一些功能和性能指标
  11. 股票历史数据-历史数据股票工具
  12. 捷联惯导系统学习7.5(简化的捷联惯导算法及误差方程 )
  13. 软件测试加油站ic卡管理系统,加油站IC卡管理系统,加油机IC卡管理系统,加油站自助加油机功能介绍...
  14. BIOS开启了VT,但是CPU-V显示未开启
  15. Agilent GeneSpring GX V11.5_win32_win64扩展生物学分析软件
  16. 向量空间的基和维数例题_向量空间基和维数的等价定义及求法
  17. 【AUTOSAR】基于RT-Thread内核的AUTOSAR在n32g上的实现
  18. python 代码实现反向传播算法
  19. c语言100列作业,C语言经典例题100例——C语言练习实例72解答(链表)
  20. MATLAB实现中频正交采样(数字下变频)

热门文章

  1. 电子科技大学中山学院计算机类分流,2019年电子科技大学中山学院大类招生及专业分流办法解读...
  2. 简单的c++服务端与客户端的通信
  3. 在ubuntu下安装五笔输入法(百度输入法)
  4. QQ在线时长等级说明
  5. C# 装箱拆箱 以及性能方面的问题
  6. iPhone11怎么手机录屏(苹果11手机录屏方法)
  7. 虚拟机环境下Ubuntu黑屏问题尝试解决
  8. Java随机数生成及文件写入实验案例
  9. 题解 P2920 【[USACO08NOV]时间管理Time Management】
  10. hybris入门资料