Web前端加密场景下的参数抓包修改、参数模糊测试工具。
引用一下工具原作者的介绍:
随着互联网安全的发展,对重要的业务系统的安全性要求也在逐渐提升,出现了大量用于加密参数的js,实现了客户端浏览器到服务器直接的参数加密。这个时候想要对渗透测试无疑相当于增加了难度,通常我们F12对其进行调试寻找加密过程密钥,解密参数后修改数据包再加密送往服务器,这个过程繁琐且效率低下,遇到轮询密钥交换等不固定密钥算法时还会更加复杂。
为此,Js-Forward被开发了出来,通过使用该工具,可以应对几乎所有的前端加密技术对渗透测试造成的困扰。
本项目基于G-Security-Team的JS-Forward二次开发,增加了针对参数进行Fuzz的功能,方便安全测试人员注入SQL、XSS等payload。
工具运行后,用户可以根据提示生成Payload,放入网页源代码中,实现不同功能。Payload有三种类型:
- Hook网页JS中某处的变量值,并发到burp等工具中进行修改。一般用于在请求包的参数没加密之前拦截修改。
- 对变量进行模糊测试,一般用于在请求包参数没加密之前,通过字典进行fuzz。
- Hook网页JS中某处的变量值,并在burp中查看。一般用于在返回包的参数解密后呈现给使用者。
可参考原作者的文档理解原理,也可以直接看下面的教程。
以某金融Web站点的找回密码接口为例,该接口使用了SM2、SM3、SM4进行对称加密、非对称加密和签名,其中非对称加密的私钥在Web端没有泄漏,通过中间人截获的方式是解不开数据包的,因此只能使用“改内存“大法。
首先设置main.py中BURP_PORT为你的burpsuite开放端口,然后即可启动工具:python3 main.py
通过分析JS,发现在数据被加密之前,将用户名、手机号、验证码等信息,都存放于e.data
这个变量之中,且变量的类型是json对象。
在工具中按照指引填写信息。
- 首先参数名为上一步发现的
e.data
- 其次是针对该变量做什么操作,这里先演示变量传递,输入1;
- 最后输入变量类型
json
程序生成了一段代码,接下来通过浏览器的JS Override功能,覆盖网页原本JS。
只不过在工具中填写信息时,注意针对变量使用FUZZ操作,输入2
在文件夹中创建字典文件,假设变量名为e.data
,那么新建字典文件e.data.txt
。在字典中每行为一个payload,如果变量类型为string,那么直接放入变量值即可;如果变量类型为json,那么需要复制出json字符串,并在相应位置修改。
去前端页面点击按钮即可,fuzz进度会在fuzz.progress
中记录,如需重置进度可修改该文件。
该模式仅仅通过XHR将变量的值发送出来,但是没有修改逻辑。一般用于监听解密后的返回值来使用。
填写信息时注意在选择操作模式时输入3,注入代码时注意要在数据被Web APP解密完全了之后,再把变量转发出来。
在研究Web前端加密的解决方案时,概括出两条解决路径:基于“中间人”或基于“内存修改”。 首先放一个Web前端加密流程图(不考虑混淆对抗情况)
方案分析:
- 密码学上,只能破解“能被中间人”的系列
- 可以破解知道对话密钥的对称加密
- 非对称加密,若没有服务端私钥,是解不开的
- 哈希也没办法搞定
- 脚本编写
- 困难的费劲,要自己写解密逻辑
- 简单的好办,可以预定义解密逻辑,还是比较简单的
- 集成情况
- 可作为burp、yakit插件,或者作为下游代理,与其他模块都能配合的比较好。burp能爆破,yakit也能fuzztag,集成情况非常好。
- 当然,这也是因为它适用的范围有限(只能破解“能被中间人”)的场景。
方案实例:
- 基于mitmproxy编写脚本,然后burp设置下游代理
- 编写burp插件,如burpy、jsencrypter
我觉得Web这里还不至于像游戏那样有内存数据的交叉检验吧...这个方法应该是更有效的
方案分析:
- 密码学上不存在卡脖子情况,任何情况都适用。
- 因为涉及Web APP的修改,可能会遇到反调试等对抗场景。
- 无限debugger
- JS混淆
- 脚本编写
- 不管加解密逻辑困不困难,只要找到位置,“插个眼”,就能解决问题。
- 关键点在于“插个眼”怎么实现,浏览器有没有好用的机制。
- “插眼”过程是需要依赖浏览器的,可能要编写浏览器插件,或者自己手动在浏览器里加代码。
- 集成情况
- 很难集成到burp,因为每次都依赖于实际点击Web APP中的功能键。
- 不过仅仅是实现fuzz功能的话,倒不用通过burp,还是不难实现的。
方案实例: JSForward,把变量用http请求的方式转发给burp,burp修改后再发回去。相当于用一个web请求进行了hook。这个思路很不错,于是便有了本项目。
如果发现工具有bug、有不适用的场景,或者有其他想要加入的功能,可以发issue或邮箱:1085455474@qq.com