Webhacking.kr old-06

Challenge

Reverse the repeated Base64 cookie transformation.

逆向还原重复 Base64 编码的 Cookie。

1
https://webhacking.kr/challenge/web-06/

Analysis

服务端先把 Cookie 中的数字替换为特殊字符,再连续 Base64 decode 20 次,只有还原出的 ID/PW 分别为 admin/nimda 时才调用 solve(6)。因此客户端要反向执行同一流程:对目标字符串各做 20 次 Base64 encode,再把 1 到 8 映射为服务端使用的特殊字符。

Solution

下面的脚本完整生成两个 Cookie,并通过 requests.Session 发送请求。没有写入 PHP session ID,服务器若需要会在首次请求时自动建立 session。

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
#!/usr/bin/env python3
import base64
import os
import sys

import requests

URL = os.environ.get(
"OLD06_URL", "https://webhacking.kr/challenge/web-06/"
)
DIGIT_REPLACEMENTS = str.maketrans({
"1": "!",
"2": "@",
"3": "$",
"4": "^",
"5": "&",
"6": "*",
"7": "(",
"8": ")",
})

def encode_cookie(value: str) -> str:
encoded = value.encode("ascii")
for _ in range(20):
encoded = base64.b64encode(encoded)
return encoded.decode("ascii").translate(DIGIT_REPLACEMENTS)

def main() -> int:
cookies = {
"user": encode_cookie("admin"),
"password": encode_cookie("nimda"),
}
with requests.Session() as session:
response = session.get(URL, cookies=cookies, timeout=10)
response.raise_for_status()
print(response.text)
return 0

if __name__ == "__main__":
sys.exit(main())

Cookie 名称必须是 user 和 password,路径必须覆盖 /challenge/web-06/。脚本把数字替换放在最后,正好对应服务端先逆替换、再 decode 的顺序。