keremt-dev/site-security-assessment
GitHub: keremt-dev/site-security-assessment
面向 Claude Code 的授权网站安全测试技能,通过严格的所有权验证和四级渐进式测试,为开发者及安全团队提供基于证据、低误报的结构化安全评估报告。
Stars: 0 | Forks: 0
# site-security-assessment
针对用户**已证明拥有权**的网站执行授权安全测试的 Claude Code skill。支持双模式所有权验证门槛(email-match 声明**或** token-file 所有权证明),包含 4 阶段测试 playbook(passive recon → active probing → authenticated DAST → webhook threat model),以及基于证据的客观报告生成机制。
[](https://opensource.org/licenses/MIT)
[](https://docs.claude.com/claude-code)
[]()
## 🎯 此 Skill 的功能
当用户请求对其自己的网站进行安全测试时,此 skill 会:
1. **验证所有权** —— 没有证明则拒绝继续(绝无例外)
2. **仅运行用户明确批准的级别** —— pasif recon → aktif probing → authenticated DAST → webhook threat model
3. **生成结构化、中立的 Markdown 报告**,包含风险分级、基于证据的发现、误报防护措施以及可直接复制粘贴的配置代码片段
它**不会**测试第三方网站。它**不会**绕过框架的拒绝指令。它**不会**夸大风险级别。
## 🚦 双模式所有权验证门槛
最重要的设计决策是:**Claude Code 框架本身会阻止未经核实所有权的“外部域探测”。** 仅凭用户声明是不够的 —— 框架需要客观的证明。此 skill 通过两种模式解决了这个问题:
### 模式 1 — 快速通道 (Quick Path)
- **触发条件:** 用户的会话邮箱域名与目标域名匹配(例如,`you@example.com` → `example.com` 或其任何子域名)
- **附加要求:** 用户明确的声明(“这是我的网站”)
- **解锁:** 仅限级别 1(passive recon)
- **为何受限:** 可以观察到,即使邮箱匹配,框架也会拒绝活动的工具调用 —— 因此更深入的探测需要使用模式 2
### 模式 2 — 严格通道 (Strict Path)
- **触发条件:** Skill 生成一个随机 token,用户上传 `https:///.well-known/owner-.txt`,其中包含特定的内容模板,skill 通过 curl 进行验证
- **解锁:** 所有级别 (1-4)
- **为何有效:** 证明用户具有服务器端的写入权限,框架将其视为客观的所有权证明
## 📊 测试级别
| 级别 | 范围 | 模式 | 耗时 |
|--------|--------|------|------|
| **L1 — Passive Recon** | HTTP headers、TLS、DNS、路由发现、敏感文件 404 检查、CORS preflight、JS chunk 分析 | 模式 1 | 约 5-15 分钟 |
| **L2 — Active Probing** | HTTP method matrix、header injection、parameter pollution、有限的 XSS/SQLi canary、open redirect | 模式 2 + 逐项测试批准 | 约 15-30 分钟 |
| **L3 — Authenticated DAST** | Session/cookie 分析、CSRF/Origin enforcement、BOLA/IDOR、mass assignment、privilege escalation | 模式 2 + 测试凭证 | 约 30-60 分钟 |
| **L4 — Webhook Threat Model** | HMAC signature、replay window、SSRF、body-size limit、content-type whitelist | 模式 2 + webhook secret | 约 30-45 分钟 |
## 🚀 安装说明
### 作为 Claude Code skill 安装(用户级别)
```
# 将此目录克隆或复制到你的 Claude 技能位置:
cp -r site-security-assessment ~/.claude/skills/
# 或用于 Claude Code 插件:
cp -r site-security-assessment ~/.claude/plugins/local/skills/
```
该 skill 将在下次启动 Claude Code 会话时自动注册。可通过 `/skills` 进行验证,或直接使用 Skill 工具调用。
### 手动调用
只需输入类似以下的指令:
- "Sitemi pen-test et: https://example.com"
- "kendi siteme güvenlik testi yap"
- "进行 OWASP 审计,目标是 "
- "scan my website for security issues — domain: "
该 skill 的描述字段被调整为在与域名配对时,能够触发土耳其语和英语的安全测试短语。
## 📁 仓库结构
```
site-security-assessment/
├── SKILL.md # Skill entry — workflow + mode gate (163 lines)
├── README.md # This file
├── LICENSE # MIT
├── .gitignore
├── references/ # Loaded into context as needed
│ ├── ownership-verification.md # Mode 1 & Mode 2 detailed flow
│ ├── level-1-passive.md # Passive recon playbook + commands
│ ├── level-2-active.md # Active probing playbook
│ ├── level-3-authenticated.md # Authenticated DAST playbook
│ ├── level-4-webhook.md # Webhook threat model playbook
│ └── report-template.md # Report writing guidance
├── scripts/ # Executable helpers
│ ├── generate_token.sh # Random 32-char ownership token
│ ├── verify_ownership.sh # Validates /.well-known/owner-.txt
│ ├── passive_recon.sh # Batch header/route/CORS/TLS check → JSON
│ └── header_analyzer.py # Missing header detector + Caddy/nginx snippet
├── assets/
│ └── report-template.md # Boilerplate template
└── evals/
└── evals.json # Test cases for skill-creator eval cycle
```
## 🛡️ 安全模型
### 此 skill **绝不会**执行的操作
- ❌ 测试任何所有权未经证明的域名
- ❌ 绕过框架的工具拒绝(该 skill 明确告诉 agent 不要尝试)
- ❌ 运行 DoS / 负载测试 / 暴力破解凭证测试
- ❌ 运行自动化扫描器(Nikto、sqlmap、Nuclei 活动模板)
- ❌ 在 authenticated DAST 期间触碰生产用户数据
- ❌ 使用真实的(非测试用)webhook secrets
### 此 skill **实际会**执行的操作
- ✅ 每个级别都有明确的逐项用户批准
- ✅ 主动 fuzzing 仅使用单个 canary payload(而非字典)
- ✅ 仅在 staging 环境中进行速率限制测试
- ✅ JWT secret 破解仅限离线/staging 环境
- ✅ 在每份报告中诚实地提供“未能完成的检查 (Tamamlanamayan Kontroller)”矩阵(未能测试的内容及原因)
## 📝 报告质量 — 误报防护
一个主要的设计重点是**避免对发现进行过度分级。** 此 skill 编码了源自真实世界测试的经验性反模式:
| 观察结果 | 为何**不是**一个发现 |
|-------------|----------------------|
| Port 80 超时/丢弃 | 好的结果 —— 服务器未监听 HTTP 明文 |
| `robots.txt` / `sitemap.xml` 404 | 运营/SEO 问题,与安全无关 |
| 证书有效期 30 天以上 | 属于监控关注范畴 |
| TLS SAN 单一域名 | 属于资产清单/规划,而非发现 |
| `_next/static/chunks/*` 内容哈希名称 | 是 content-hash,而非版本泄露 |
| 登录 HTML 缺少可见的 CSRF 输入字段 | SPA + SameSite 模式不需要它 |
| SSR shell route 匿名返回 200(但 API 受 401 保护) | 不是数据泄露 |
| 静态资源上的 `Cache-Control: immutable` | 现代正确的模式 |
此 skill 还要求在分类为高/严重 (High/Critical) 风险时提供**具体的 exploit-path 证明** —— 仅仅“缺少 header X → 可能发生攻击 Y”最多只能算作中等 (Medium) 风险。
## 🧪 已验证的性能
迭代 1 基准测试(3 个评估场景 × 有 skill 与基线对比,2026-05-11):
- 所有 3 次评估中,**29/29 项断言均通过**
- **有 skill** 产生了 0 次过度调用;**基线**将 CSP 标记为高风险(过度调用),将禁用 HTTP/2 标记为低风险(不构成安全发现),并隐式批评了 port 80 上缺失重定向
- **有 skill** 始终包含“未能完成的检查” + “误报与风险修正”部分;基线则没有
- **模式 2 设置**(eval-3):有 skill 生成了实际的 token + 文件模板 + 验证路径;基线仅提供了通用的“签署授权文件”指导
查看 [`evals/evals.json`](evals/evals.json) 以获取测试用例。
## 📋 使用示例
```
User: Şirketimin yeni web sitesini yayına aldık: https://app.example.com/
— bu site bana ait, kendi kurumum. Pasif güvenlik taraması yapar mısın?
[skill activates → Mode 1 check passes (you@example.com ↔ example.com) → Level 1 passive recon]
Skill: [runs ~15 curl-based probes + TLS check + CT lookup]
[produces ~400-line Markdown report with:]
- Yönetici Özeti (risk count table)
- Test Kapsamı ve Kanıt Özeti
- Stack ve Altyapı Tespiti
- Bulgular (M-1 security headers, M-2 TRACE 500, M-3 SSR shell, L-1 fingerprint, L-2 security.txt)
- İyi Bulunan Noktalar
- Tamamlanamayan Kontroller (table)
- Webhook Tehdit Modeli (if hooks. / webhooks. subdomain exists)
- False Positive ve Risk Düzeltmeleri
- Öncelikli Aksiyon Planı
- Konsolide Caddyfile snippet
- Sonuç
```
## 🔧 配置
该 skill 本身无需配置。可选的环境说明如下:
- **Bash + curl:** 必需(大多数脚本假定使用 bash 语义)
- **openssl:** TLS 证书检查和 `generate_token.sh` 必需
- **python3:** `header_analyzer.py` 和 `verify_ownership.sh` 的 ISO-8601 解析必需
- **权限提示:** 即使在模式 2 下,某些活动的工具调用可能仍会提示逐次调用批准 —— 这是预期的框架行为
## 🤝 贡献指南
这是一个带有特定设计倾向的 skill —— 欢迎贡献代码,但请尊重以下设计约束:
1. **没有所有权模式映射,不得新增测试级别** —— 每个测试类别必须指定模式 1 或模式 2
2. **每一项新增检查必须包含一个误报防护条目** —— 该发现在什么情况下实际上不构成问题?
3. **仅限基于证据** —— playbook 中不得有推测;每一项主张都需要一个可观测的信号
4. **不得自动化破坏性测试** —— DoS、暴力破解、大规模扫描仍保留在范围之外
5. **土耳其语报告** —— 报告模板已锁定为土耳其语;技术术语保留英语
若要添加新的测试级别:
1. 创建包含 playbook 的 `references/level-X-.md`
2. 更新 `SKILL.md` 级别表
3. 指定模式要求
4. 如需要,将脚本添加到 `scripts/`
5. 在 `evals/evals.json` 中添加测试用例并运行评估周期
## 📜 许可证
**[MIT](LICENSE)** —— 完全开源。您可以自由使用、修改、分发、再授权和销售。唯一的要求是保留版权声明。
## ⚖️ 伦理与授权使用
MIT 许可证并不限制您如何使用该软件,但此 skill **专为授权的安全测试而设计**。请参阅 [ETHICS.md](ETHICS.md) 了解预期用途声明、内置安全机制(双模式所有权验证门槛)、相关法律框架(CFAA / TCK 243-245 / EU Directive 2013/40 / 等)以及负责任的披露指导。
该 skill 本身会拒绝测试用户尚未证明拥有的域名的请求 —— 这不是一项法律限制,而是防御性设计。
## 🗺️ 路线图
可能的增强功能(未承诺):
- [ ] CT log 子域查找脚本 (`scripts/ct_subdomains.sh`)
- [ ] Caddyfile 验证脚本,根据此 skill 推荐的 headers 检查候选配置
- [ ] Cloudflare/WAF 检测模块(以便在所有权证明文件可能被缓存时发出警告)
- [ ] 多域名批量模式(通过单次所有权证明对域名列表运行 L1)
- [ ] JSON 格式的发现导出(除 Markdown 报告外),用于 CI/CD 集成摄取
## 🙋 常见问题
**问:它适用于非土耳其语项目吗?**
答:该 skill 同样支持英文触发,并且测试 playbook 是语言无关的。但报告输出为土耳其语(技术术语保留为英文)。如需生成英文报告,请 fork 并翻译 `assets/report-template.md` 和 `references/report-template.md`。
**问:为什么要有两种所有权验证模式,而不仅仅是模式 2?**
答:模式 1 允许用户在没有服务器访问权限的情况下获取快速的 passive-recon 报告(例如,审查您管理但无法上传文件的 SaaS 站点)。仅在需要主动测试时才需要使用模式 2。
**问:它可以自动运行 authenticated DAST 吗?**
答:不可以 —— 级别 3 需要明确的用户批准,**并且**用户需要在会话中手动提供测试凭证。该 skill 绝不会持久化存储凭证。
**问:云端托管主机(Vercel、Netlify)怎么办?**
答:该 skill 会提示提供商的 ToS 要求(AWS 渗透测试规则、Vercel 可接受使用政策等),并提醒用户在主动测试前进行检查。Passive recon (L1) 在托管主机上通常是没有问题的。
**问:它如何处理 CDN/WAF?**
答:模式 2 的 token 文件通常不会被 CDN 缓存(Cloudflare 排除了 `/.well-known/`)。对于主动测试,该 skill 建议临时将测试 IP 列入白名单或禁用 WAF 挑战 —— 但这由用户自行决定。
标签:AI安全, Chat Copilot, CISA项目, Claude Code, DAST, DLL 劫持, JSONLines, LLM安全技能, Markdown报告生成, MIT开源协议, Token文件验证, Webhook安全, Web安全测试, 主动探测, 反取证, 大语言模型, 威胁建模, 子域名安全, 安全合规, 安全工具库, 安全评估, 密码管理, 应用安全, 恶意软件分析, 所有权验证, 授权测试, 文件查看, 站点安全, 结构化查询, 网站防护, 网络代理, 网络安全, 自动化安全, 被动侦察, 邮件域匹配, 隐私保护, 零信任