About

本章节中的攻击旨在帮助您了解如何在浏览器中使用 JavaScript 以及如何对其进行操作,攻击可以通过分析网络流量来实现,但这不是本章节的重点而且可能要困难得多。

Object

只需提交单词 “success” 即可攻击成功,显然这并不是那么容易。每个级别都实现了不同的保护机制,页面中包含的 JavaScript 必须经过分析,然后才能绕过保护。

001 Low

1-1.png

本关的重点在generate_token()函数。文本框默认是ChangeMe,我们对它进行一次 rot13 编码,再进行 MD5 哈希(注意 echo 要加-n不打印换行符):

  1. echo -n "ChangeMe" | tr 'a-zA-Z' 'n-za-mN-ZA-M' | md5sum

1-2.png

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

1-3.png

这意味着只要我们修改了ChangeMe,它算出来的 MD5 肯定和题目给的 token 不一致了。而题目要求我们要把ChangeMe改成success,这就得在前端做一些小动作了。

来到前端页面,在 Phrase 那里按右键,选择 Inspect,可以发现有一项叫 token 的地方,把 type 改成空,然后 token 值就显示出来了。

1-4.png

我们在 Linux 终端把 success 的 token 给算出来,然后复制粘贴到那:

  1. echo -n "success" | tr 'a-zA-Z' 'n-za-mN-ZA-M' | md5sum

1-5.png

提交后成功!

1-6.png


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

1-7.png

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

1-8.png

所以要通关的话,我们只需要:

  1. 先把 Phrase 框改成success
  2. 按 F12 去 Console 运行generate_token()函数;
  3. 提交,显示成功

002 Medium

我们按 F12 进入 Debugger,找到medium.js源代码,点击下方的{}符号来更美观地打印源代码:

2-1.png

  1. function do_something(e) {
  2. for (var t = '', n = e.length - 1; n >= 0; n--) t += e[n];
  3. return t
  4. }
  5. setTimeout(function () {
  6. do_elsesomething('XX')
  7. }, 300);
  8. function do_elsesomething(e) {
  9. document.getElementById('token').value = do_something(e + document.getElementById('phrase').value + 'XX')
  10. }

源代码拔下来就好办了,去掉setTimeout()这个延时函数,在 Linux 下模拟这个过程,输入下列代码,用 NodeJS 运行:

  1. function do_something(e) {
  2. for (var t = "", n = e.length - 1; n >= 0; n--)t += e[n]; return t
  3. }
  4. function do_elsesomething(e) {
  5. //document.getElementById("token").value = do_something(e + document.getElementById("phrase").value + "XX")
  6. let token = do_something(e + "success" + "XX")
  7. console.log(token)
  8. }
  9. do_elsesomething("XX")

终端回显如下:

  1. XXsseccusXX

然后像上一关那样,修改前端代码,把 token 的 HTML type 改成"",然后提交:

2-2.png

003 High

该等级下,至少有一个 JavaScript 混淆了,你需要逐步检查代码,找出什么是有用的,什么是无用的,什么是完成任务所需的。

我们在网上找到一个好用的反混淆网站,关注代码的核心部分:

  1. function do_something(e) {
  2. for (var t = "", n = e.length - 1; n >= 0; n--) t += e[n];
  3. return t
  4. }
  5. function token_part_3(t, y = "ZZ") {
  6. document.getElementById("token").value = sha256(document.getElementById("token").value + y)
  7. }
  8. function token_part_2(e = "YY") {
  9. document.getElementById("token").value = sha256(e + document.getElementById("token").value)
  10. }
  11. function token_part_1(a, b) {
  12. document.getElementById("token").value = do_something(document.getElementById("phrase").value)
  13. }
  14. document.getElementById("phrase").value = "";
  15. setTimeout(function() {
  16. token_part_2("XX")
  17. }, 300);
  18. document.getElementById("send").addEventListener("click", token_part_3);
  19. token_part_1("ABCD", 44);

由源代码可知,程序先执行token_part_1(),然后延迟 300 毫秒执行token_part_2(),最后鼠标在页面点击时执行token_part_3()


现在我们来讲一讲如何在 Firefox 中把 JavaScript 源代码替换成反混淆后的。

1、首先把反混淆后的代码放到家目录下,然后运行一个简单的 Web 服务器:

  1. python3 -m http.server 1337

注意,反混淆后的代码需要做一些微调,具体如下:

  1. // ...
  2. function token_part_1(a, b) {
  3. // ...
  4. }
  5. document.getElementById("phrase").value = "success";
  6. setTimeout(function() {
  7. token_part_2("XX")
  8. }, 300);
  9. document.getElementById("send").addEventListener("click", token_part_3);
  10. token_part_1("ABCD", 44);

2、在网页按 F12,选择 Inspector,搜索high.js,复制源代码的地址:

3-1.png

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

3-2.png

  • Type:Response body
  • Match:../../vulnerabilities/javascript/source/high.js
  • Replace:http://your-sever:1337/deobfuscated.js

添加完成后刷新一下页面,会发现 Brupsuite 能帮我们把 Javascript 文件给替换掉:

3-3.png

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

3-4.png

输入success,提交成功!

3-5.png

References