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
,提交成功!