WeChall - Tracks

Challenge

一个投票系统,需要投至少 2 次票。没有 IP 检查,但使用 HTTP 缓存机制(ETag/VOTE cookie)防止重复投票。

Solution

投票页面 votes.php 用 HTTP 缓存头做投票去重——这不是缓存的典型用法,但原理相同:

  1. VOTE cookie: 服务器设置 VOTE=<value> cookie 标记已投票
  2. ETag / If-None-Match: 服务器返回 ETag 头,浏览器后续请求带 If-None-Match 验证资源未变

两层缺一不可: 没有 cookie 服务器不知道你投过票;没有 If-None-Match 服务器认为是新的投票请求。

第一次投票成功后,服务器返回 "Please press the vote button again"。关键在于第二次请求必须同时带上第一次响应的 VOTE cookie 和 ETag 值。

ETag 值带 W/ 前缀表示 weak validator(语义等价即可,不要求字节一致),但 curl 传 If-None-Match 时要带这个前缀。

1
2
3
4
5
6
7
8
9
10
11
# 第一次投票 - 捕获 ETag 和 VOTE cookie
$ curl -v -s -b 'WC=...' 'https://www.wechall.net/en/challenge/tracks/votes.php?vote=3' 2>&1 | grep -i 'etag\|set-cookie'
# ETag: W/22661-0-VDFqOmu5pLs8JDjj
# Set-Cookie: VOTE=22661-0-VDFqOmu5pLs8JDjj

# 第二次投票 - 带上 VOTE cookie 和 If-None-Match
$ curl -s -b 'WC=...; VOTE=22661-0-VDFqOmu5pLs8JDjj' \
-H 'If-None-Match: W/22661-0-VDFqOmu5pLs8JDjj' \
'https://www.wechall.net/en/challenge/tracks/votes.php?vote=3'
# Vote registered!
# Your answer is correct