3. 信息泄露与敏感文件路径探测

信息泄露与敏感文件路径探测 学习卡片

探测目标与常见泄露面

信息泄露路径探测的核心不是“扫目录”,而是围绕站点可能无意暴露的文件与接口,构造少量高价值请求并判读响应。常见对象包括:

  • robots.txt / sitemap.xml:声明爬虫规则与站点地图,常暴露后台、测试、上传等路径。
  • 备份与临时文件:如 index.php.bak、www.zip、config.php~、.index.php.swp。
  • 源码与配置泄露:.git/HEAD、.svn/entries、.env、web.config、composer.json。
  • 目录列表:服务器未关闭 autoindex 时,访问目录返回文件清单。
  • 错误页与调试信息:堆栈、绝对路径、数据库连接串、框架版本。

请求构造与判读逻辑

对每个候选路径发送 GET 请求,重点观察状态码、Content-Type、Content-Length 与响应体特征。下面给出一个可运行的 Python 探测脚本,使用标准库即可执行,不依赖第三方包。

import urllib.request, urllib.error, re, sys

TARGET = "http://127.0.0.1:8080"   # 替换为授权测试目标
PATHS = [
    "/robots.txt", "/sitemap.xml",
    "/.git/HEAD", "/.svn/entries", "/.env",
    "/backup.zip", "/www.zip", "/db.sql",
    "/index.php.bak", "/config.php~", "/.index.php.swp",
    "/uploads/", "/admin/", "/static/",
]

# 命中敏感信息的特征(示例,可按目标技术栈扩展)
SENSITIVE = [
    (r"DB_PASSWORD|DB_USER|APP_KEY", "配置变量"),
    (r"ref:\s*refs/heads", "Git 仓库引用"),
    (r"<title>Index of /", "目录列表"),
    (r"root:.*:0:0:", "passwd 内容"),
    (r"mysql_connect|SQLSTATE", "数据库错误"),
]

def probe(base, path):
    url = base.rstrip("/") + path
    req = urllib.request.Request(url, method="GET",
                                 headers={"User-Agent": "SecTest/1.0"})
    try:
        with urllib.request.urlopen(req, timeout=5) as r:
            body = r.read(4096).decode("utf-8", "ignore")
            return r.status, r.headers.get("Content-Type", ""), len(body), body
    except urllib.error.HTTPError as e:
        body = e.read(2048).decode("utf-8", "ignore")
        return e.code, e.headers.get("Content-Type", ""), len(body), body
    except Exception as e:
        return None, str(e), 0, ""

for p in PATHS:
    code, ctype, size, body = probe(TARGET, p)
    if code is None:
        print(f"[ERR ] {p:24} {ctype}")
        continue
    hits = [name for pat, name in SENSITIVE if re.search(pat, body, re.I)]
    flag = "HIT " if hits else "    "
    print(f"[{flag}] {code} {p:24} {ctype:28} {size:5}B  {','.join(hits)}")

运行后按以下规则判读:

  • 200 + 敏感特征命中:确认泄露,记录 URL、命中字段与响应片段。
  • 200 但无敏感特征:可能是正常页面或软 404,需对比首页响应长度与内容。
  • 403:路径存在但被拒绝,仍属信息泄露(暴露了目录结构)。
  • 301/302 跳转:记录 Location,可能指向真实资源。
  • 404 且与随机路径响应一致:视为不存在。
先用一个随机路径(如 /a1b2c3x/)获取“基线 404 响应”,再与候选路径对比长度和内容,可显著降低软 404 误报。

泄露路径与判读关系图

候选泄露路径 robots.txt / sitemap.xml 声明路径、后台入口 备份 / 临时文件 .bak .zip .swp ~ 源码 / 配置泄露 .git .svn .env 目录列表 Index of / 错误页 / 调试信息 堆栈、路径、版本 GET 请求 + 响应判读 状态码 200 / 301 / 403 / 404 Content-Type text/html / application/zip Content-Length 与基线 404 对比 响应体特征 正则匹配敏感字段 Location 头 跳转目标记录 判读结论 确认泄露 200 + 敏感特征命中 疑似泄露 403 / 301 暴露路径结构 无泄露 404 且与基线一致 需人工复核 200 但无特征 / 软 404 基线对比方法 1. 请求随机路径 /a1b2c3x/,记录状态码、Content-Type、Content-Length 与响应体。 2. 对每个候选路径重复请求,与基线逐项对比;长度差异明显或内容不同才进入特征匹配。 3. 命中敏感特征后,保存完整响应片段作为证据,并记录请求 URL、时间与响应头。

验证与证据留存

确认泄露后,需要保留可复核的证据。建议记录以下字段:

字段示例值用途
请求 URLhttp://target/.env定位泄露点
状态码200判断可访问性
Content-Typetext/plain判断文件类型
命中特征DB_PASSWORD=...证明敏感信息
响应片段前 200 字符复核与报告
仅在获得明确授权的目标上执行探测。对生产环境应控制请求频率,避免触发防护或影响业务;发现真实泄露后应通过安全渠道上报,不要公开传播敏感内容。

常见误报与排除

  • 软 404:服务器对不存在路径返回 200 和自定义页面。用基线对比排除。
  • WAF 拦截页:返回 200 但内容是拦截提示,不含真实文件内容。
  • CDN 缓存:缓存了旧版本页面,需加随机参数或检查缓存头。
  • 编码差异:响应体为 gzip 或非 UTF-8,需先解码再匹配特征。