内江建设网站保健品网站建设流程
文章目录
- 前记
- 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,或者搜username、password这些,甚至搜encrypt都可以的
-  这里就自己慢慢找,然后我们就会找到这个地方: 
  
-  转到源代码中找到这个文件,简单看一下,它用的是 ajax传输数据,直接下个断点:
  
-  然后点击页面中的登录按钮,它就会停在这里,我们此时看看右边的框框,这里需要着重看的就是 作用域和调用堆栈:
  
-  我们当前可以看到作用域当中的 username、password这些已经完成加密了,说明加密函数在这之前就被调用过了,这里如果想看具体是在哪两步之间被调用的,就可以通过下面的调用堆栈去查看
-  我们说过调用堆栈这里是从下往上顺序运行的,所以可以看一看它的前一步数据是否被加密: 
  
-  这里很显然,连数据都没被加载进来,说明它的加密处理过程就在 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;  
}
-  然后这里就好了,我们试验一下能否加密成功,先将这两个文件放到 phantomjs的bin目录下,然后执行如下命令:
  
-  接着回到BP,找到刚刚装的插件,点击 connect,这里返回true说明连接成功,点击test就可以看到加密结果了:
  
-  那在实战中怎么用呢,比如我们这里就演示一下,到刚刚的网站抓个包转到 Intruder模块:
  
-  在这里添加标记,然后导入字典之后,在下面的 Payload processing添加处理过程,选中invoke Burp extension:
  
-  之后就点开始攻击了(实战中最好开个代理,你也不想被请去喝茶吧[doge]),这里就可以看到我们发送的东西也是按照它的加密逻辑发送的: 
  
-  为什么这里状态码是500呢?因为这个 username是错的。
