这次的Console NFT黑客任务算是蛮有挑战的。解开最后的密语需要用到SQL Injection, web3, solidity, AES128/MD5 解密

这次任务的网址: https://console-nft.art/pro_6/

任务要解密4段密码,然后按照这个格式把最终的命令发给Console机器人:/hacker_riddle_part_6_key4-key2-key1-key3

SQL Injection进入管理页面

网页显示需要登录账号,查了一遍代码,没有藏在代码里面登录密码。那剩下可能就是需要用SQL Injection来破解了

账号和密码都输入 " or ""="

image.png

果然顺利进入管理页面

image.png

在管理页面的To Do List那里,给了找到每个key的提示

  • Key1: 登陆你的账号的密码就是Key1
  • Key2: 给Hacker转账,转账的Tx ID就是Key2
  • Key3: 需要用到web3
  • Key4: 登陆你的账号,破解key4

image.png

破解Key1

进入管理页面后,来到Gold Club Members的页面: https://console-nft.art/pro_6/dashboard/members.php

按F12,选择Network,然后输入你的id(user_xxxx discord ID最后4位)。点击Network页面的filter.php, 会看到你输入的id的密码(MD5加密的)

image.png

由于密码是经过MD5加密的,所有你需要通过https://www.md5online.org/md5-decrypt.html 进行解密

解密成功,获得我的key1: smokey, 也是我账号的登录密码
image.png

解密Key2

上面的解密获得了账号的登录密码,所以回到登陆页面,用上面破解的密码登录我的账号

登录成功:
image.png

登录成功后,到转账页面,要做的是给Hacker转账获得TX ID: https://console-nft.art/pro_6/dashboard/payment.php

image.png

发送成功后,到转账记录页面查找TX ID: https://console-nft.art/pro_6/dashboard/history.php

TX ID 就是我的Key2, 所有我的Key2是 g145S42N7x
image.png

解密Key3

到Key_3页面: https://console-nft.art/pro_6/dashboard/key_3.php

显示的是一个合约链接和一个ABI。很明显是让你调用这个合约的getThirdKey函数获得key3

image.png

为了方便,写了小工具调用合约查看Key3: https://replit.com/@ericet/Hacker6Key3#index.js

点击运行,然后输入你的4位discord ID,我的是8888,给的结果是adult,这就是我的key3
image.png

解密Key4

回到Dashboard页面: https://console-nft.art/pro_6/dashboard/index.php 拉到下面,会给你3串字符

image.png

把3段字符分别复制到这里进行解密:https://www.javainuse.com/aesgenerator

注:secret key那个最多支持16个字符,所以secret key是console_nft_encr

解密后获得key4: useful
image.png

最终命令

最终的命令的格式是: /hacker_riddle_part_6_key4-key2-key1-key3

结合上面解开的4个keys,我的最终命令是:

/hacker_riddle_part_6_useful-g145S42N7x-smokey-adult

发送命令给console bot就能获得500个Tokens

网站还有一个额外的密语,一登录就能看到的: /sqli_hacker

发送给console bot获得100个tokens

image.png

怎么获得最终命令的格式?

是不是好奇怎么获得最终命令的格式的? Dashboard页面底下有个“The Final Key”, 里面是一个Solidity合约,但是合约里面有几个语法错误,修改一下部署合约就会获得我上面所说的格式: /hacker_riddle_part_6_key4-key2-key1-key3

image.png

如果你有兴趣自己部署合约来获得最终的key,你可以用下面我修改过的合约代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
pragma solidity ^0.8.0;


contract HackerRiddlePart6_Final_Key {

function finalKey(string memory key_1, string memory key_2, string memory key_3, string memory key_4) public pure returns (string memory) {

string[5] memory json;

json[0] = string(
abi.encodePacked('/hacker_riddle_part_6_')
);

json[1] = string(
abi.encodePacked(key_4, "-")
);
json[2] = string(
abi.encodePacked(key_2, "-")
);

json[3] = string(
abi.encodePacked(key_1, "-")
);
json[4] = string(
abi.encodePacked(key_3)
);

string memory result =
string(
abi.encodePacked(
json[0],
json[1],
json[2],
json[3],
json[4]
)
);

return string(abi.encodePacked(result));
}

}