目录
漏洞原理
客户端访问服务器获得 JavaScript,并在本地浏览器执行,于是我们就有了源码。我们可以通过代码审计,逆向分析来挖掘 JS 中可能存在的漏洞,实现 JS 攻击。JavaScript 逆向分析指的是对JavaScript代码进行分析和研究,以了解其实际功能、逻辑和执行过程。逆向分析可以帮助开发人员更好地理解和调试代码,也可以帮助安全人员发现潜在的漏洞和攻击路径。
Low
渗透思路
提示输入 success,但即使这样还是报错 Invalid token
前端 JS 审计
对 http://www.dvwa.com/vulnerabilities/javascript/ 进行页面审计发现 JS 代码
利用开发者工具进行调试,发现即使发送参数是 success 在传到 generate_token 函数中时 phrase 还是变成了 ChangeMe
调用 JS 加密函数获得正确 token
在控制台调用加密函数,获得正确的 success 哈希值为 38581812b435834ebf84ebcc2c6424d6
Medium
渗透思路
前端 JS 审计
思路和 Low 一样,先调试前端 JS,得到原字符串拼接规律
调用 JS 加密函数获得正确 token
源码对比
Low & Medium 源码
对比小结
加密方式不同,但是逻辑上没有什么问题,只要在函数里放入正确的参数就可以拿到过关的 token 了
High
渗透思路
利用同样的思路准备调试 JS,但发现很难看懂,后来查资料才发现代码被混淆了
解密混淆的 JS 代码
解密网址: Deobfuscate Javascript - Deobfuscate malicious Javascripts for quick and easy analysis
获得 JS 源码后进行审计,不出所料,phrase 只在最后一步又被改了,所以永远得不到正确的 token
这里引用参考的文章来说明吧:
分析:js中用来3个函数来计算token分别为:
- **token_part_2()**传入参数字符串’YY’和token值拼接并调用sha256
- **token_part_3()**将token值和字符串’ZZ’拼接并调用sha256()加密,从而得到最终的token;
目前最重要的是搞清楚他们执行的顺序
- 首先将phrase 的值清空document.getElementById(“phrase”).value = “”;
- 由于setTimeout函数有300毫秒延时,所以先执行了token_part_1(“ABCD”, 44)
- 在执行2.然后再执行了 token_part_2(“XX”)
- token_part_3被添加在提交按钮的click事件上,也就是点提交会触发执行最后执行。
调用 JS 加密函数获得正确 token
所以争取的执行步骤应该是:在输入框输入 success 后,再到控制台输入token_part_1(“ABCD”, 44)和token_part_2(“XX”)这两个函数,最后点击按钮执行token_part_3()
步骤如下图所示:
成功获得正确 token
源码对比
Medium & High 源码
对比小结
Medium 和 High 的加密方式不同,而且在函数执行顺序上也做了调整
Impossible
翻译过来是就是:
您永远无法信任来自用户的任何东西,也无法阻止他们对其进行操纵,因此不存在不可能的级别。
绕过
- 代码审计
- 动态调试
- 反混淆
- 反编译
- Hook技术
防御
- 最好在后端生成重要信息并加密,签名
- JS 代码混淆