DVWA JavaScript JavaScript攻击通关教程
漏洞简介
JavaScript 攻击这关比较特殊,目标是提交 “success” 这个词来通关。每个级别有不同的保护机制,需要分析前端 JS 代码绕过去。
JavaScript 运行在客户端,用户能看、能改、能调试,所以前端做的任何验证都不能算真正的安全。
Low 级别
看页面源码,JS 直接嵌在页面里:
1 | function generate_token() { |
逻辑很简单:
- 拿 phrase 输入框的值
- rot13 编码
- md5 哈希
- 填进 token 隐藏字段
页面上默认 phrase 是 “ChangeMe”,我们要改成 “success”。
攻击方法
打开控制台,两行搞定:
1 | document.getElementById("phrase").value = "success"; |
然后点提交,通关。代码都摆在你面前了,想怎么改都行。
Medium 级别
Medium 把 JS 移到外部文件了,还压缩了一下:
1 | <script src="/vulnerabilities/javascript/source/medium.js"></script> |
攻击方法
方法一:直接看 JS 文件
开发者工具 Sources 面板或者 Network 面板都能看到这个 JS 文件的内容。
方法二:格式化压缩代码
Chrome 和 Firefox 都有 Pretty Print 功能,点那个 {} 按钮,压缩的代码就格式化好了。

分析一下发现有个 setTimeout 延迟调用:
1 | setTimeout(function () { |
方法三:直接调函数
1 | document.getElementById("phrase").value = "success"; |
压缩只是让人读起来费劲,不是真正的安全措施。
High 级别
High 用了代码混淆,两个工具一起上:
- Dan’s Tools(打包)
- JavaScript Obfuscator Tool(混淆)
混淆后的代码看着就像乱码,但不是不能读。
攻击方法
方法一:在线反混淆
把混淆的代码丢到反混淆工具里,比如 deobfuscatejavascript.com。

反混淆后的代码就清晰多了。
方法二:断点调试
在 Sources 面板设置断点,一步步执行,观察变量变化,搞清楚执行流程。
分析完发现有三个函数要按顺序调用:
1 | function token_part_3(t, y = "ZZ") {} |
方法三:控制台调用
1 | document.getElementById("phrase").value = "success"; |
混淆增加了逆向难度,但不是不能逆。
Impossible 级别
这关没有 Impossible 级别,官方说明是:
You can never trust the user and have to assume that any code sent to the user can be manipulated or bypassed and so there is no impossible level.
意思就是:
- 发到客户端的代码都能被改
- 前端验证本质上是不可靠的
- 所以不存在 Impossible 级别
正确的做法
| 实践 | 说明 |
|---|---|
| 服务端验证 | 关键验证必须在服务端做 |
| 别暴露敏感信息 | 密码密钥别放前端 |
| 用 Session | 敏感操作服务端验证身份 |
| 输入验证 | 服务端严格过滤 |
小结
前端 JavaScript 安全要点:
- 所有安全验证必须在服务端完成
- 敏感信息别放前端代码里
- 代码混淆只是增加逆向难度,不是安全措施
- 关键业务逻辑放服务端
- 记住:用户能看到的一切都不安全