# 概述
大家好,我是一个善于使用工具精通脚本的脚本小子。
三句话,让你明白如何破解前端加密。
平时,大家在做渗透的时候抓包抓到的包体一般都是明文显示的,但有的站点为了增加攻击者的攻击成本,会选择使用 JS 进行前端加密,很多不了解 JS 的大兄弟直接就选择放弃了。
但其实有时候有前端加密的站点反而更好打:①前端加密的情况下 waf 是无法识别到你的恶意 payload 的②大家都不想打,是一块未被开发过的宝地。
PS: 大家想练手的话,可以找各种银行的站点,一般银行站点都有前端加密的。比如下面的例子就是某银行的子系统。
刚好最近做众测,遇到两个站点都有加密的情况。
这里我就以两个实战例子举例给大家演示下怎么破解前端加密。
# 简单的例子
这是某银行的一个人才培养系统,我们打开页面,抓包发现流量这方面,被加密死死的,根本没法篡改。
身为前端 F12 工程师,直接打开控制台,CTRL+SHIFT+F 全局搜索,筛选关键字 key、Crypto、AES、DES、RSA、parse 等等关键字,很快啊,就找到了加密函数。
跟进这个函数,好家伙,加密算法、模式、密钥什么的都写的明明白白的。
完全没对 JS 进行混淆。如图,这里目标用的是 AES 加密算法、加密模式是 ECB,key 为 1234567890123456,填充方式 pkcs7
有了这些东西,我们直接扔到在线 aes 解密网站上跑一下,看看是不是正确的。成功解密。
http://tool.chacuo.net/cryptaes
但上面只解决了加解密的问题。而我们在测试的时候如果要将 payload 一个一个的复制到外部网站进行处理,再粘贴回 bp 就会显得很麻烦,所以这里给大家介绍两个 bp 的插件:Burpy 和 BurpCrypto
Burpy:https://github.com/mr-m0nst3r/Burpy
BurpCrypto:https://github.com/whwlsfb/BurpCrypto/releases
PS:对于一些简单的加解密 (比如直接调用常规对称、非对称加密算法直接解密 payload) 我们直接用 BurpCrypto 内置好的基础模块就行了。但是对于复杂的加解密(比如目标站点对加密算法做了一些微调,导致标准的加密算发无法解密)我们可能得自己实现。
具体的教程我就不介绍了,反正挺简单的。
下载安装 BurpCrypto 插件,然后 bp 多了一个模块,根据上面得到的信息填充内容,然后
点击 Add process。这样右键就多了一个模块,然后把它当 URL 编解码一样使用就完事了。
同时,我们还能用来进行爆破,在爆破模块中的载荷处理部分选择我们的函数即可。
最终,我们成功 GET 一枚爆破漏洞。
# 没那么简单的例子
上面过程中,我们很轻易的就能分析到加解密算法。但通常,开发会将 JS 进行混淆,导致我们不能很快速的识别到哪个是加解密函数及 key 之类的。
这里我还是以一个例子来演示我是怎么破解的。
还是某银行的一个子系统,抓包,发现存在流量加密。这个比上面的例子狠多了,包体基本加密死死的,最可恶的是回包也是加密的。
同样的,祖传 F12 控制台,搜索关键字。
跟进,经过混淆的代码一般很乱,但是不要慌,火狐有格式化处理功能,点击左下角的 {} 即可一键格式化 (这里全部例子都是以火狐浏览器来实操的,其他浏览器应该也差不多)
这里我们找到了类似加密的函数,我们无法确定这个函数是不是真正用来进行加密 payload 的。同时我们发现,它连 key 都是传参过去的。
按照正常思路,来说我们还得往上分析代码才能确定包体数据是不是由这个函数来进行加密的,并且想要找到 key 也得往上查看调用关系。
但这里根本不需要这么麻烦,直接上断点,然后输入账号密码,看看有没有步入断点,
如果有的话,就看看它的 return 是不是和抓包中的数据一样即可。这里我已经确认过了,这个就是加密函数。
点击它左边的那个行号,显示蓝色就代表断点已经打上了。
然后输入账号密码,就会触发加密函数,之后就是卡在断点上了。这时候,我们就能轻松的发现 key 及加密前数据的格式了。
你以为这就完了?这里它的密钥并非真的是 O/25g2tzZErQlDLycE+XuTv9uYNrc2RK
注意看代码,密钥是 t,而 t 是 n 经过字节化处理后的。
如果傻傻的拿上面得到的 key 去试,肯定是解不出来的。
坑点来了:
这个时候,你是不是以为我们只需要得到 t 的值,然后仍到在线 3des 上就完事了?
但就是这一步我卡了半天,最后才发现它这里是调用了 CryptoJS 这个包进行前端加密的。而这个包中定义了一种自定义格式 wordarray,它把密钥变成了字节流的形式,并用这种格式进行保存,所以密钥并不是我们上面的 O/25g2tzZErQlDLycE+XuTv9uYNrc2RK。同时这种字节流形式也是无法输出的,
前面是分析错了,后面才发现,这里它只是直接输出了密文的 16 进制的 String 表示,而在线的都是需要 base64 的输入的,因此我们这里要么直接去把它还原成 16 进制再做 base64,要么直接调用 CryptoJS 的解密运算。
这里我为了方便直接使用 CrtptoJS 本地实现相同的算法,然后手动将字典进行加密。
首先,先到 github 上下载 cryptojs 这个包
链接:https://codeload.github.com/brix/crypto-js/zip/refs/heads/develop
然后引用关键 js,如图,前三个是基本上都会用到的,最后一个就是 3des 的具体实现了。(这里需要注意,JS 的引用顺序不能乱)
然后直接 copy 它的代码就完事了。
注意,它这里 p.a 是经过了不知道什么混淆的,p.a 其实就是 CryptoJS(这里就看对 CryptoJS 这个包的熟悉程度了)。然后把 p.a 全换成 CryptoJS。
打开我们本地搭的前端加密 html,F12 控制台,调用函数,成功加密。然后我们就可以利用这个来加密我们的字典了。JS 写个 for 循环,然后加密得字典。
然后就是愉快的爆破过程了
在 Bp 中使用 BurpCryptoJS 插件也是可以的
最终,破解了这个加密,光是在登录、忘记密码、注册等地方我直接提了 7 个漏洞。还成功爆了个运营的账号进入后台。(授权测试)
# Burpy 插件的简单使用介绍
上面一直没介绍 Burpy 的使用方法,我这里简单提一下,
首先使用 python 写出加解密的代码,如下,其中函数返回形式也不要动,具体看注释就懂了
下面代码实现的功能是把包体加密成 md5
然后在插件模块中选择本地监听端口 (任意选) 还有输入上面的 python 文件路径,勾选第一个 enable Processor,第二个可选可不选(选上了会自动加解密)。
然后点击 start,出现绿色的 running 就成功了,之后的使用也是右键会多一个加解密模块。
最后,这里再贴上一个 Burpy 写的 des 加密例子,感兴趣的可以分析下。(就 bp 上的调试操作方便性而言,我觉得 Burpy 比 burpCrypto 好太多了)