Jiangneex
- 关注

概述
相信很多师傅和我一样遇到过如下图一样的请求数据包;越来越多的Web站点使用一些JS加密库或自定义加密的方式对请求数据包进行加密,这对于渗透测试的效率和难度无非是增加了;于是我开始寻找一些解决方式。
第一阶段
前后端数据加解密的请求交互过程,可以简单概括如下:
1、前端JS对请求的参数加密后发送给后端
2、后端使用相对应的解密方式进行解密参数,再进行业务过程的处理
于是我就有了第一个解决方案,直接在浏览器console控制台中调用js中的加密函数,再替换到数据包中的参数值,就可以解决数据包的加密问题,完成对参数的fuzz测试。
但是这种方式存在两个问题:
1、频繁的在console和数据包中复制替换值,效率低下。
2、有些时候我们需要借助例如sqlmap等工具时,这种方式就无法胜任。
第二阶段
为了解决第一阶段的两个问题,如果我们通过代理自动对数据包进行加密呢,是不是就解决了以上痛点?
模型大概如下:
明文数据包----->通过加密代理自动对参数进行加密----->转发给服务器
于是我在一些文章中找到了一些解决方案并写了一个python脚本帮助我们解决这个问题,脚本工具的实现原理如下:
burpsuite:一级代理,修改request中的加密参数或删除response中加密js,使请求以明文形式发送。
mitmproxy:二级代理,在addon中加载pyexecjs完成对请求体的加密编码。
至此就可以实现手动编辑明文或sqlmap等工具直接代理到加密代理,加密代理自动对明文进行加密并将请求转发给服务器,帮助我们快速进行漏洞验证或fuzz。
当然如果熟悉JAVA写burp的插件对请求进行加密转发就更方便了!不熟悉或者嫌麻烦的师傅们可以直接用下面写好的JsencryptKiller工具!!!
JsencryptKiller脚本工具使用
工具网盘链接:https://pan.baidu.com/s/1HF_3W2DZtuXkLQkyrLSsdw?pwd=n979
1、安装依赖库
pip3 install pyexecjs
pip3 Install mitmproxy
2、运行 python JSencryptkiller.py -h 查看帮助
按照参数顺序依次填入参数,出现如下代理监听本地8081即为运行成功
以下是我在本地测试过程:
1、用phpstudy在本地搭建index.php,接收get型参数name,post型参数pwd并打印在页面中;
2、使用login.js作为我的js加密脚本,该脚本中有一个enc的加密函数,返回加密结果;(实际测试中我们根据Web站点的加密方式,构造一个加密js,用来返回一个加密值)
3、运行脚本python JSencryptkiller.py login.js enc http://192.168.0.107 name,pwd
4、配置burp的上游代理为JsencryptKiller脚本监听的8081端口
5、可以看到接收到的请求参数name和pwd是被login.js加密后的结果,我们可以在运行的脚本中看到请求和返回的数据情况,至此完成加密请求。
6、sqlmap等其他工具需要代理到JsencryptKiller的监听端口,并运行JsencryptKiller即可。
参考材料
https://www.freebuf.com/articles/web/243370.htm
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)