DVWA JavaScript JavaScript攻击通关教程

漏洞简介

JavaScript 攻击这关比较特殊,目标是提交 “success” 这个词来通关。每个级别有不同的保护机制,需要分析前端 JS 代码绕过去。

JavaScript 运行在客户端,用户能看、能改、能调试,所以前端做的任何验证都不能算真正的安全。

Low 级别

看页面源码,JS 直接嵌在页面里:

1
2
3
4
function generate_token() {
var phrase = document.getElementById("phrase").value;
document.getElementById("token").value = md5(rot13(phrase));
}

逻辑很简单:

  1. 拿 phrase 输入框的值
  2. rot13 编码
  3. md5 哈希
  4. 填进 token 隐藏字段

页面上默认 phrase 是 “ChangeMe”,我们要改成 “success”。

攻击方法

打开控制台,两行搞定:

1
2
document.getElementById("phrase").value = "success";
generate_token();

然后点提交,通关。代码都摆在你面前了,想怎么改都行。

Medium 级别

Medium 把 JS 移到外部文件了,还压缩了一下:

1
<script src="/vulnerabilities/javascript/source/medium.js"></script>

攻击方法

方法一:直接看 JS 文件

开发者工具 Sources 面板或者 Network 面板都能看到这个 JS 文件的内容。

方法二:格式化压缩代码

Chrome 和 Firefox 都有 Pretty Print 功能,点那个 {} 按钮,压缩的代码就格式化好了。

upload successful

分析一下发现有个 setTimeout 延迟调用:

1
2
3
setTimeout(function () {
do_elsesomething('XX')
}, 300);

方法三:直接调函数

1
2
document.getElementById("phrase").value = "success";
do_elsesomething("XX");

压缩只是让人读起来费劲,不是真正的安全措施。

High 级别

High 用了代码混淆,两个工具一起上:

  1. Dan’s Tools(打包)
  2. JavaScript Obfuscator Tool(混淆)

混淆后的代码看着就像乱码,但不是不能读。

攻击方法

方法一:在线反混淆

把混淆的代码丢到反混淆工具里,比如 deobfuscatejavascript.com。

upload successful

反混淆后的代码就清晰多了。

方法二:断点调试

在 Sources 面板设置断点,一步步执行,观察变量变化,搞清楚执行流程。

分析完发现有三个函数要按顺序调用:

1
2
3
function token_part_3(t, y = "ZZ") {}
function token_part_2(e = "YY") {}
function token_part_1(a, b) {}

方法三:控制台调用

1
2
3
document.getElementById("phrase").value = "success";
token_part_1('ABCD', 44);
token_part_2('XX');

混淆增加了逆向难度,但不是不能逆。

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 安全要点:

  1. 所有安全验证必须在服务端完成
  2. 敏感信息别放前端代码里
  3. 代码混淆只是增加逆向难度,不是安全措施
  4. 关键业务逻辑放服务端
  5. 记住:用户能看到的一切都不安全