About
本章节中的攻击旨在帮助您了解如何在浏览器中使用 JavaScript 以及如何对其进行操作,攻击可以通过分析网络流量来实现,但这不是本章节的重点而且可能要困难得多。
Object
只需提交单词 “success” 即可攻击成功,显然这并不是那么容易。每个级别都实现了不同的保护机制,页面中包含的 JavaScript 必须经过分析,然后才能绕过保护。
001 Low

本关的重点在generate_token()函数。文本框默认是ChangeMe,我们对它进行一次 rot13 编码,再进行 MD5 哈希(注意 echo 要加-n不打印换行符):
echo -n "ChangeMe" | tr 'a-zA-Z' 'n-za-mN-ZA-M' | md5sum

对比 Brupsuite 的请求,可以发现它正好和 token 是一致的:

这意味着只要我们修改了ChangeMe,它算出来的 MD5 肯定和题目给的 token 不一致了。而题目要求我们要把ChangeMe改成success,这就得在前端做一些小动作了。
来到前端页面,在 Phrase 那里按右键,选择 Inspect,可以发现有一项叫 token 的地方,把 type 改成空,然后 token 值就显示出来了。

我们在 Linux 终端把 success 的 token 给算出来,然后复制粘贴到那:
echo -n "success" | tr 'a-zA-Z' 'n-za-mN-ZA-M' | md5sum

提交后成功!

另一个通关的方式,我们已知generate_token()函数是根据当前 Phrase 文本框的内容去生成 Token 的,我们可以发现,当 Phrase 为ChangeMe时,会生成如下 token

如果把 Phrase 改成success,则生成如下 token:

所以要通关的话,我们只需要:
- 先把 Phrase 框改成
success; - 按 F12 去 Console 运行
generate_token()函数; - 提交,显示成功
002 Medium
我们按 F12 进入 Debugger,找到medium.js源代码,点击下方的{}符号来更美观地打印源代码:

function do_something(e) {for (var t = '', n = e.length - 1; n >= 0; n--) t += e[n];return t}setTimeout(function () {do_elsesomething('XX')}, 300);function do_elsesomething(e) {document.getElementById('token').value = do_something(e + document.getElementById('phrase').value + 'XX')}
源代码拔下来就好办了,去掉setTimeout()这个延时函数,在 Linux 下模拟这个过程,输入下列代码,用 NodeJS 运行:
function do_something(e) {for (var t = "", n = e.length - 1; n >= 0; n--)t += e[n]; return t}function do_elsesomething(e) {//document.getElementById("token").value = do_something(e + document.getElementById("phrase").value + "XX")let token = do_something(e + "success" + "XX")console.log(token)}do_elsesomething("XX")
终端回显如下:
XXsseccusXX
然后像上一关那样,修改前端代码,把 token 的 HTML type 改成"",然后提交:

003 High
该等级下,至少有一个 JavaScript 混淆了,你需要逐步检查代码,找出什么是有用的,什么是无用的,什么是完成任务所需的。
我们在网上找到一个好用的反混淆网站,关注代码的核心部分:
function do_something(e) {for (var t = "", n = e.length - 1; n >= 0; n--) t += e[n];return t}function token_part_3(t, y = "ZZ") {document.getElementById("token").value = sha256(document.getElementById("token").value + y)}function token_part_2(e = "YY") {document.getElementById("token").value = sha256(e + document.getElementById("token").value)}function token_part_1(a, b) {document.getElementById("token").value = do_something(document.getElementById("phrase").value)}document.getElementById("phrase").value = "";setTimeout(function() {token_part_2("XX")}, 300);document.getElementById("send").addEventListener("click", token_part_3);token_part_1("ABCD", 44);
由源代码可知,程序先执行token_part_1(),然后延迟 300 毫秒执行token_part_2(),最后鼠标在页面点击时执行token_part_3()。
现在我们来讲一讲如何在 Firefox 中把 JavaScript 源代码替换成反混淆后的。
1、首先把反混淆后的代码放到家目录下,然后运行一个简单的 Web 服务器:
python3 -m http.server 1337
注意,反混淆后的代码需要做一些微调,具体如下:
// ...function token_part_1(a, b) {// ...}document.getElementById("phrase").value = "success";setTimeout(function() {token_part_2("XX")}, 300);document.getElementById("send").addEventListener("click", token_part_3);token_part_1("ABCD", 44);
2、在网页按 F12,选择 Inspector,搜索high.js,复制源代码的地址:

3、打开 Brupsuite,选择 Options,在 Math and Replace 中添加一个规则:

- Type:Response body
- Match:
../../vulnerabilities/javascript/source/high.js - Replace:
http://your-sever:1337/deobfuscated.js
添加完成后刷新一下页面,会发现 Brupsuite 能帮我们把 Javascript 文件给替换掉:

这时候再来到开发者面板的 Debugger,就能找到反混淆后的源代码了:

输入success,提交成功!

