当前位置: 首页 > news >正文

小迪安全v2023学习笔记(六十三讲)—— JS加密断点调试

文章目录

  • 前记
  • WEB攻防——第六十三天
    • JS应用&算法逆向&三重断点调试&调用堆栈&BP插件发包&安全结合
      • 前置知识
        • 作用域
        • 调用堆栈
        • JS加密数据流程
        • 常见分析调试
        • 为什么要学这个?
        • 怎么去发现利用呢?
      • JS逆向 - 流程&全局搜索-登录算法
        • 原理
        • 案例演示
      • JS逆向 - 标签&XHR断点 - 登录算法
        • 原理
        • 案例演示
          • 标签断点
          • XHR断点
      • JS逆向 - 结合BurpSuite&插件引用
        • 本地搭建
        • BP插件

前记

  • 今天是学习小迪安全的第六十三天,本节课的主要内容是JS断点的说明和断点技巧,然后结合BP去进行了一下实战
  • 理解为主,学了这节课你应该学会怎么利用断点来找到它的加密逻辑

WEB攻防——第六十三天

JS应用&算法逆向&三重断点调试&调用堆栈&BP插件发包&安全结合

前置知识

作用域
  • 在学习之前,我们先来了解什么是作用域,学过编程的都知道,作用域其实就是一个变量的生命周期
  • 作用域又分为局部作用域和全局作用域,那在JS当中同样也是如此,简单来说就是运行后相关的数据值
    • 全局作用域的变量我们可以在任意地方调用
    • 局部作用域的变量我们只能在它的作用域内调用
调用堆栈
  • 然后,我们继续了解一个东西,叫做堆栈,其实就是数据在内存中存储的位置
  • 简单来说就是代码函数的一个执行逻辑顺序是从下到上的顺序调用
JS加密数据流程
  • 我们还要了解一个东西,就是JS前端加密的流程,具体如图所示:
    在这里插入图片描述
常见分析调试
  • 代码全局搜索
  • 文件流程断点
  • 代码标签断点
  • XHR提交断点
为什么要学这个?
  • 这里我们要了解学这节课的意义是什么,其实就是通过前端的JS代码去发现一些东西,那我们能发现什么东西呢?
  • 第一个就是加密方式,很多程序可能就只是用前端加密,后端解密的一个逻辑,那如果我们能够找到它的加密代码,直接用不就可以进行密码猜测这些了吗?
  • 第二个呢,不知道各位还记不记得之前学的JS安全开发,通过Ajax传输数据时出现的泄露后台地址的问题,那如果泄露了地址那我们可以尝试直接访问啊
  • 其实总结下来就是gay写的这些内容:
    • 针对JS开发应用
    • 密码登录枚举爆破
    • 参数提交漏洞检测
    • 泄露URL有更多测试
怎么去发现利用呢?
  • 那怎么去发现这些东西呢?比如说加密算法,我怎么去发现它呢?那这就涉及到上面的知识了呀!
  • 怎么发现:通过全局搜索关键字发现加密方式以及函数
  • 怎么利用:如果这个函数是全局的,直接控制台调用即可;如果是局部的,那就涉及到断点利用了
  • 怎么断点利用:就是上面的三种调试利用方式,这每种断点的方式是在JS加密不同的时间段进行的,它的函数堆栈信息就不一样
  • 所以我们就需要来详细的讲一下这三种断点方式的区别,以及如何使用的

JS逆向 - 流程&全局搜索-登录算法

原理
  • 第一个是流程断点,通过审查元素抓网络请求包发起程序,自己去审计代码,然后判断哪个地方是加密函数
  • 全局搜索:通过抓包参数名进行代码全局搜索
案例演示
  • 这里说得可能比较抽象,我们利用案例来演示一下断点思路与流程

  • 还是请出我们的ST快递会员官网,老演员了啊:
    在这里插入图片描述

  • f12打开开发者调试,先刷新,然后随便输入手机号与密码,看看网络包:
    在这里插入图片描述

  • 在这个包里面我们可以找到提交的数据,很明显的看到被加密了,这里不能一眼看出来是什么加密方式吧?

  • 那怎么办呢?我如果想要批量传入爆破,不知道加密方式不是就废了吗?

  • 这里我们先找到这个加密的流程,全局搜索(ctrl + F)一下login,或者搜usernamepassword这些,甚至搜encrypt都可以的

  • 这里就自己慢慢找,然后我们就会找到这个地方:
    在这里插入图片描述

  • 转到源代码中找到这个文件,简单看一下,它用的是ajax传输数据,直接下个断点:
    在这里插入图片描述

  • 然后点击页面中的登录按钮,它就会停在这里,我们此时看看右边的框框,这里需要着重看的就是作用域调用堆栈
    在这里插入图片描述

  • 我们当前可以看到作用域当中的usernamepassword这些已经完成加密了,说明加密函数在这之前就被调用过了,这里如果想看具体是在哪两步之间被调用的,就可以通过下面的调用堆栈去查看

  • 我们说过调用堆栈这里是从下往上顺序运行的,所以可以看一看它的前一步数据是否被加密:
    在这里插入图片描述

  • 这里很显然,连数据都没被加载进来,说明它的加密处理过程就在Login函数当中嘛!

  • 那就很简单了,在Login函数中往前翻不就行了:
    在这里插入图片描述

  • 这里就在前面一行做了处理,它的逻辑就是先接受参数值,然后利用自己的encrypt函数加密之后url编码,传入后端进行解密

  • 这里的话我们可以怎么样,直接将鼠标放到encrypt函数上,就可以看到它来自于哪个文件了:
    在这里插入图片描述

  • 点进去一看:
    在这里插入图片描述

  • 可以看到这就是这个加密函数的原型,然后它的实例是JSEncrypt

  • 那这个有什么用呢?这里有两个用处

  • 因为这个加密它是局部的,所以我们如果一开始就调用这个加密函数,他肯定是显示这个东西未定义:
    在这里插入图片描述

  • 但是当我们先声明一个实例,然后再去调用的时候,就会发现成功加密出来了:
    在这里插入图片描述

  • 或者我们也可以在它断点的时候,去调用也是能成功加密的:
    在这里插入图片描述

  • 这里两个加密出来的结果为什么不一样呢?因为它是RSA加密啊

  • 好,上面讲的是它的第一个作用,那第二个作用是什么呢?咱们按下不表,之后再说

  • 现在我们来了解一下其他的断点方式

JS逆向 - 标签&XHR断点 - 登录算法

原理
  • 首先是标签断点,这个就是对浏览器中的标签元素进行判断,一般有子树修改属性修改,当你设置的这个标签元素发生更改时,程序就会暂停

  • 它的断点条件加密动作需要伴随前端 DOM 更新(按钮变灰、插入隐藏域、显示 loading)。,否则是无法断点成功的
    在这里插入图片描述

  • 然后是XHR断点,它一般是在XMLHttpRequest.send / fetch 等函数前将程序暂停,其实就是在数据发出的前一刻暂停掉程序
    在这里插入图片描述

案例演示
标签断点
  • 先来演示标签断点吧,这里就换一个登录平台了,因为这个平台不满足利用条件

  • 我们用这个edu登录站点来演示一下:
    在这里插入图片描述

  • 随便输入账号密码,f12查看元素,先看有没有被加密:
    在这里插入图片描述

  • 被加密了,那我们就需要进行断点调试了,比如我们要在它登录按钮改变状态(点击)时让程序暂停掉,这里就找到登录按钮的标签元素:
    在这里插入图片描述

  • 为了保险起见呢,就把子树修改和属性修改都开启来,然后随便输入个账号密码点击登录它就会暂停程序

  • 然后跳转到触发的js代码中,这时我们可以看一看右边的作用域和堆栈信息:
    在这里插入图片描述

  • 这里的话没有我们输入的数据,那自然就说明还没到加密函数的位置,我们需要自己一步一步地跳:
    在这里插入图片描述

  • 但是这里我是鼠标都点冒烟了都没有找到加密的函数,那我们就不继续演示了,个人感觉这个不是很好用

XHR断点
  • 我们同样用这个网站做演示,来了解一下什么是XHR断点,这里记得将之前的标签断点取消掉

  • 这里怎么用这个XHR断点呢?我们需要先尝试登录,然后找到这个登录的数据包:
    在这里插入图片描述

  • 可以看到它的登录路径是user/login,那我们就可以那这个东西去进行XHR提取:
    在这里插入图片描述

  • 然后再次点击登录就会帮我们直接暂停程序了,然后会跳转到fetch或者send函数这里来:
    在这里插入图片描述

  • 这是它调用的堆栈信息,因为它已经fetch了,所以下一步就是提交数据了,那么加密的逻辑肯定是在前面的函数中完成的

  • 这里就感觉哪个函数像加密流程就点进去看看:
    在这里插入图片描述
    在这里插入图片描述

  • 这里是这个value函数,能看到作用域中出现了我们填入的admin123,然后下面那个s好像就是加密后的密码,然后我们也可以看到加密流程的代码:

a = n.pwdInput.value;
var r = new JSEncrypt, o = C.RSACODE;
r.setPublicKey(o);
var s = r.encrypt(a), l = this.props.actions;
  • 首先声明了一个实体,然后定义了一个o,通过setPublicKey生成了RSA的公钥,然后利用对a进行加密
  • 那这就是加密的流程啊,还是RSA加密,然后o在作用域里我们也知道是什么,也是可以在控制台中直接用的

JS逆向 - 结合BurpSuite&插件引用

  • 我们为什么要知道这个加密流程,不就是想利用它进行爆破这些吗?那我们肯定不可能每次尝试都在控制台中进行吧?这效率也太低了
  • 所以这里就是我们的第二个作用,通过前端js代码,要么本地搭建一个一模一样的加密环境,要么使用BP插件进行批量加密爆破
  • 我们两个都演示一下吧
本地搭建
  • 我们需要一个东西,就是它加密使用的JS源代码,这里就直接找到然后复制粘贴到本地就完了:
    在这里插入图片描述

  • 然后把这个js文件中的内容复制到本地,命名为JSEncrypt.js

  • 然后将它的加密逻辑复制到下方,改动一点地方即可,这里o的值就是作用域中o的值:
    在这里插入图片描述

  • 然后执行代码即可,我本地的环境可能有些东西不支持,那这里最好是在在线网站上运行
    在这里插入图片描述

  • 是能够成功加密出来结果的,我们可以做个脚本呢,对字典中的密码进行批量加密,然后保存为一个新的字典,放到BP上跑就行

BP插件
  • 当然,如果不想自己写脚本生成字典,我们也有其他的办法,就是利用BP的插件帮我们边运行边加密

  • 我们需要先下载phantomjs,并设置环境变量,这里倒是设不设置环境变量都无所谓啊

  • 如果不设置环境变量的话,就直接到其bin目录,然后运行.exe文件即可:
    在这里插入图片描述

  • 现在我们安装JsEncrypter,然后maven打包后,将其jar包安装到BP插件中:
    在这里插入图片描述

  • 然后在/target/script目录下有个phantomjs_server.js文件,这个就是我们一会编写加密逻辑的代码文件

  • 现在我们将站点的JSEncrypt.js文件复制到本地:
    在这里插入图片描述

  • 然后打开phantomjs_server.js文件,在这个地方改成我们刚刚的文件:
    在这里插入图片描述

  • 然后下面编写调用加密函数这里,最好是先写一个函数,然后在这里进行调用,这里的代码就是将网站的加密逻辑拿过来改一下即可:

function new_encrypt(payload) {  var r = new JSEncrypt, o = "305c300d06092a864886f70d0101010500034b003048024100959684a0076fd2a8fc1589469cf8c95f16ef67490c519f4d274373f29cee64cf6a0db8ad8953122c5b3664e4a48acd34d9b95c0ae62a31be612632e1c49154db0203010001";  r.setPublicKey(o);  var newpayload = r.encrypt(payload);  return newpayload;  
}  // 处理函数  
function js_encrypt(payload){  var newpayload;  /**********在这里编写调用加密函数进行加密的代码************/  newpayload = new_encrypt(payload);  /**********************************************************/  return newpayload;  
}
  • 然后这里就好了,我们试验一下能否加密成功,先将这两个文件放到phantomjsbin目录下,然后执行如下命令:
    在这里插入图片描述

  • 接着回到BP,找到刚刚装的插件,点击connect,这里返回true说明连接成功,点击test就可以看到加密结果了:
    在这里插入图片描述

  • 那在实战中怎么用呢,比如我们这里就演示一下,到刚刚的网站抓个包转到Intruder模块:
    在这里插入图片描述

  • 在这里添加标记,然后导入字典之后,在下面的Payload processing添加处理过程,选中invoke Burp extension
    在这里插入图片描述

  • 之后就点开始攻击了(实战中最好开个代理,你也不想被请去喝茶吧[doge]),这里就可以看到我们发送的东西也是按照它的加密逻辑发送的:
    在这里插入图片描述

  • 为什么这里状态码是500呢?因为这个username是错的。

http://www.lryc.cn/news/622922.html

相关文章:

  • 【图论】分层图 / 拆点
  • 什么是模型预测控制?
  • Windows MCP.Net:革命性的 .NET Windows 桌面自动化 MCP 服务器
  • 【C++学习篇】:基础
  • ZKmall开源商城的数据校验之道:用规范守护业务基石
  • 中本聪思想与Web3的困境:从理论到现实的跨越
  • PyTorch生成式人工智能——使用MusicGen生成音乐
  • 新手向:Python异常处理(try-except-finally)详解
  • JVM垃圾回收器
  • 学习日志35 python
  • Python:如何在Pycharm中显示geemap地图?
  • 基于深度学习的老照片修复系统
  • k8sday08深入控制器(3/3)
  • Docker小游戏 | 使用Docker部署人生重开模拟器
  • K8S的ingress
  • 玩转云原生,使用k9s管理k8s集群和k3s集群
  • 如何在 MacOS 上安装 SQL Server
  • VS Code配置MinGW64编译ALGLIB库
  • 水分含量低、残留物少且紫外光谱纯净的生物溶剂推荐
  • python学习DAY43打卡
  • VScode 使用遇到的问题
  • 北京JAVA基础面试30天打卡11
  • MQ迁移方案
  • Linux软件编程:进程与线程(线程的传参、属性、通信(互斥锁、信号量))
  • 嵌入式硬件篇---电容本质
  • 【图像算法 - 15】智能行李识别新高度:基于YOLO12实例分割与OpenCV的精准检测(附完整代码)
  • Redis-plus-plus 安装指南
  • IOMMU的2级地址翻译机制及多级(2~5)页表查找
  • 区块链技术原理(14)-以太坊数据结构
  • 解决html-to-image在 ios 上dom里面的图片不显示出来