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
| 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 的顺序。