前言:
相信很多人在渗透测试的时候找到一个破解点,但是BURP抓包发现是加密过的。
这种问题可以通过一下方法解决:
1.直接调用浏览器模拟登录进行爆破(比如:python利用selenium调用浏览器等方法)
2.直接执行JS进行爆破(懒人模式 ajax for循环直接浏览器执行JS)
3.通过中转站进行爆破 (利用你会的语言搭建WEB服务器进行转发爆破)
4.追踪加密过程再进行 (简单粗暴)
什么是中转?
利用你会的语言,本地搭建一个WEB(中转) 客户端接收的数据后端进行 加密 或者 解密处理 再提交到目标服务器 ,然后目标返回给中转站 中转站返回给客户端。
今天就来说一下第四种爆破方式
这边推荐个BURP插件:https://github.com/whwlsfb/BurpCrypto(支持直接调用本地JS)
访问网站
看的password这个参数的值是已经被加密了,我们通过浏览器断点方式追踪加密流程
说一下步骤方式
追踪加密-->找到加密-->得到加密-->制作加密--> 开始爆破
方法一:
查看源代码 直接输入password 或者 key 等关键字快速找到需要断点的代码
方法二:
方法一用不了的话 就通过浏览器的网络请求搜索关键字 然后一步一步的断点找到加密的核心代码即可
找到加密的核心代码:
美化一下:
我们可以看到用的是jsencrypt 那么我们可以采用 中转加密(利用你会的语言) 或者 本地直接加密 进行爆破
菜鸟分析:
第一步函数的形参分别是 j, h, i 对应的是 ===》 baseUtil.encryptEle("encryptKey","inputPassword","password");
j == encryptKey
h == inputPassword
i == password
实参分别是这3个表单
第二步的函数是:
encryptText: function(l, n, j) { var i = l || "encryptKey"; if (n) { var m = f("#" + i).val() || ""; var k; var h = c("JSEncrypt"); if (typeof (h) === "function" && m) { var o = new h(); o.setPublicKey(m); k = o.getKey().encrypt(n) } else { console && console.error("【警告】加密组件初始化失败...", m); k = n } } else { k = n } if (typeof (j) === "string") { f("#" + j).val(k) } return k },
f("#" + j).val(k) j 对应的是 实参的 第三个参数password
最后得知 第一个参数是公钥 第二个参数的明文 第三个参数是加密后的值 直接赋给表单的password
然后BURP抓包就是加密后的数据啦。
最后一步就是加密 进行爆破了
它的核心代码:
encryptEle: function(j, h, i) { if (!h) { return null } var k = f("#" + h).val() || ""; return b.encryptText(j, k, i) }, encryptText: function(l, n, j) { var i = l || "encryptKey"; if (n) { var m = f("#" + i).val() || ""; var k; var h = c("JSEncrypt"); if (typeof (h) === "function" && m) { var o = new h(); o.setPublicKey(m); k = o.getKey().encrypt(n) } else { console && console.error("【警告】加密组件初始化失败...", m); k = n } } else { k = n } if (typeof (j) === "string") { f("#" + j).val(k) } return k },
调用jsencrypt 修改成他的代码:
function jiami(password) { var k; var o = new JSEncrypt(); o.setPublicKey("30819f3******************************************************************************************************010001"); k = o.getKey().encrypt(password) return k }