适合人群:已使用 Claude Code 的安全研究人员/开发者
前置知识:Markdown 基础语法,了解 Claude Code 基本操作
一、什么是 Skill
Skill(技能) 是一组可复用的指令——以 Markdown 文件封装——教会 Claude Code 如何按你的方式执行特定任务。
通俗理解:
- 给 AI 写一个「操作说明书」,告诉它遇到某个场景该怎么干
- 不需要写代码,不需要编译,一个
.md文件就够了 - Claude 会在对话中自动识别什么时候该用哪个 Skill
每个 Skill 都是一个标准格式的 Markdown 文件。
二、Skill 文件结构
一个 Skill 就是 SKILL.md 文件,分成两部分:
2.1 YAML 前置数据(Frontmatter)
被 --- 包裹,告诉 Claude 什么时候用这个 Skill:
---
name: waf-bypass
description: >-
WAF bypass playbook. Use when encountering WAF blocks during SQL injection,
XSS testing, or any web app security testing.
---
2.2 Markdown 正文
YAML 之后的部分,告诉 Claude 具体怎么做:
# WAF Bypass Playbook
## 检测阶段
1. 发送基础 payload 确认被拦截
2. 识别 WAF 产品类型(查看响应头/Serve/错误页面特征)
3. ...
## 绕过方法
- 全角字符:`%EF%BC%87` 替代单引号
- 双关键字:`ANANDD` 替代 `AND`
- 内联注释:`/*!50000SELECT*/`
三、前置数据字段详解
| 字段 | 必需 | 说明 |
|---|---|---|
name | 推荐 | Skill 名称,也是斜杠命令名。默认用目录名。小写+连字符,≤64字符 |
description | ✅ 推荐 | 最重要的字段。Claude 根据描述判断是否加载这个 Skill |
disable-model-invocation | 否 | true=禁止自动触发,必须手动 /name |
user-invocable | 否 | false=从 / 菜单隐藏,仅做后台知识 |
allowed-tools | 否 | Skill 激活时 Claude 可免确认使用的工具(Read/Grep/Glob/Bash/Write等) |
argument-hint | 否 | 自动补全提示如 [目标URL] |
model | 否 | 覆盖使用的模型 |
context | 否 | fork=在子代理中执行(不占主上下文) |
agent | 否 | context: fork 时指定子代理类型(Explore/Coding) |
description 是最关键的字段
Claude Code 采用渐进式加载:
- 启动时:只加载所有 Skill 的
name+description(每个 ~100 token) - 对话中:Claude 读取描述判断哪些 Skill 适合当前场景
- 激活时:才加载完整内容
所以 description 决定了 Skill 能不能被自动触发。
描述写得好:
description: >-
SQL injection playbook. Use when input reaches SQL queries, authentication
logic, sorting, filtering, reporting, or DB-specific blind and out-of-band
execution paths.
描述写得差:
description: SQL注入测试
差距巨大——第二条 Claude 根本不会自动识别什么时候该用。
四、创建你的第一个 Skill
第 1 步:创建目录
# 个人级(所有项目可用)
mkdir -p ~/.claude/skills/my-tool
# 或项目级(仅当前项目)
mkdir -p .claude/skills/my-tool
第 2 步:写 SKILL.md
---
name: my-tool
description: My custom tool for doing X. Use when the user asks to do X.
---
第 3 步:测试
claude
# 输入:帮我做 X
# Claude 应该自动加载你的 Skill
或者手动调用:
/my-tool 参数1 参数2
第 4 步:迭代优化
- Claude 该触发没触发 → 扩大 description 范围
- Claude 不该触发时触发了 → 缩小 description,或加
disable-model-invocation: true - 输出格式不对 → 在正文中加示例输出
五、高级特性
5.1 变量替换
Skill 正文中支持动态参数:
---
name: fix-issue
description: Fix a GitHub issue by number
disable-model-invocation: true
---
Fix GitHub issue #$ARGUMENTS following our coding standards:
1. Read the issue with `gh issue view $0`
2. Implement the fix
3. Write tests
4. Commit referencing the issue
执行 /fix-issue 423 时,$ARGUMENTS 替换为 423,$0 也替换为 423。
| 变量 | 说明 |
|---|---|
$ARGUMENTS | 所有参数 |
$0 / $ARGUMENTS[0] | 第1个参数 |
$1 / $ARGUMENTS[1] | 第2个参数 |
${CLAUDE_SESSION_ID} | 当前会话ID |
5.2 动态上下文注入
!`command`
Skill 内容发送给 Claude 之前,shell 命令会先执行,输出替换占位符:
---
name: pr-summary
description: Summarize the current pull request
context: fork
agent: Explore
---
## Current PR Context
- PR diff: !`gh pr diff`
- PR comments: !`gh pr view --comments`
- Changed files: !`gh pr diff --name-only`
## Task
Provide a concise summary of this pull request.
5.3 子代理执行(context: fork)
---
name: deep-scan
description: Deep vulnerability scan. Use for complex multi-step scans.
context: fork
agent: Explore
---
设置 context: fork 后,Skill 在一个独立的子代理中运行:
- 不占主会话上下文
- 可以独立使用工具
- 结果汇总回主会话
agent: Explore = 探索型(擅长分析和研究)
agent: Coding = 编码型(擅长代码修改)
5.4 工具免确认
---
name: batch-scan
description: Batch scan targets.
allowed-tools: Read, Grep, Glob, Bash, Write
---
设置后,这些工具执行时不再弹 Yes/No 确认。
可用的工具名:Read, Grep, Glob, Bash, Write, Agent, Edit, Web, Vagrant, Playwright, Search, MCP_*
六、从 Slash Command 迁移到 Skill
如果你之前用过 .claude/commands/,现在迁移:
| 对比 | Slash Commands(旧) | Skills(新) |
|---|---|---|
| 位置 | .claude/commands/review.md | .claude/skills/review/SKILL.md |
| 调用 | 手动 /review | 自动触发 + 手动 /review |
| 附属文件 | ❌ 不支持 | ✅ 支持 |
| 前置数据 | 可选 | 支持调用控制 |
| 状态 | 仍可用 | 推荐使用 |
两种路径都创建 /review 命令。如果同名,Skill 优先。
七、实战:创建一个 Skill
假设你想创建一个「JS 逆向分析 Skill」:
步骤 1:创建目录
mkdir -p ~/.claude/skills/js-reverse
步骤 2:编写 SKILL.md
---
name: js-reverse
description: >-
JavaScript reverse engineering. Use when analyzing obfuscated JS files,
extracting API endpoints from SPA bundles, reversing encryption logic,
or finding hidden routes in frontend code.
allowed-tools: Read, Grep, Glob, Bash
---
# JavaScript Reverse Engineering
## 前置准备
安装依赖
npm list -g js-beautify || npm install -g js-beautify
pip list 2>/dev/null | grep jsbeautifier || pip install jsbeautifier
## 阶段 1:格式化与美化
美化混淆代码
js-beautify target.js > target.beautified.js
## 阶段 2:API 端点提取
提取所有 API 路径
grep -oP '"'"'"'["'"'"']' target.js | sort -u
提取子域名
grep -oP 'https?://[a-zA-Z0-9.-]+' target.js | sort -u
## 阶段 3:敏感信息扫描
API Key / Token
grep -oiP '(sk-[a-zA-Z0-9]{20,}|AKID[a-zA-Z0-9]{16,}|access_key|secret_key|api_key)' target.beautified.js | sort -u
隐藏路由
grep -oiP '(admin|debug|dev|test|internal|staging|dashboard|swagger|api-docs|actuator|health|metrics)' target.beautified.js | sort -u
Base64 编码信息
grep -oP '[A-Za-z0-9+/]{40,}={0,2}' target.beautified.js | sort -u
## 阶段 4:加密逻辑分析
- 搜索 `encrypt` `decrypt` `crypto` `AES` `RSA` `MD5` `SHA`
- 提取密钥和 IV
- 确认加密算法和模式
## 输出格式
按以下格式输出结果:
### 发现的 API 端点
| 端点 | 方法推断 | 说明 |
|------|---------|------|
### 敏感信息
- Key/Token:
- 隐藏路由:
- 子域名:
### 加密逻辑
- 算法:
- 密钥:
- 模式:
步骤 3:测试
claude
# 说:分析这个 JS 文件 target.js
# Claude 应该自动识别并加载 js-reverse Skill
八、Skill 编写最佳实践
✅ 推荐的写法
1. description 要包含触发关键词
description: >-
Use when analyzing obfuscated JS files, extracting API endpoints...
这样 Claude 看到「JS」「混淆」「API端点」就会自动匹配。
2. 有明确的分步指令
## 阶段 1:XXX
## 阶段 2:XXX
## 输出格式
3. 包含具体命令
# 用户可以直接复制执行的命令
4. 输出格式标准化
## 输出格式
| 字段 | 值 |
|------|-----|
❌ 避免的写法
1. description 太短
description: JS逆向
→ Claude 不知道什么时候该用。
2. 没有具体步骤
分析 JS 文件并提取信息。
→ Claude 还是按自己的思路来,Skill 等于没写。
3. 把项目配置放 Skill 里
→ 技术栈、项目结构等静态信息放 CLAUDE.md,放 Skill 每次加载浪费 token。
| 内容类型 | 放哪 |
|---|---|
| 静态上下文(技术栈/项目结构) | CLAUDE.md |
| 重复性工作流(代码审查/挖洞流程) | Skill |
| 必须执行的操作(格式化检查/自动测试) | Hook |
九、Skill vs CLAUDE.md vs Hook
| CLAUDE.md | Skill | Hook | |
|---|---|---|---|
| :-- | :--------- | :------ | :----- |
| 作用 | 项目上下文 | 可复用工作流 | 自动操作 |
| 加载时机 | 每次启动 | 按需加载 | 事件触发 |
| 自动性 | 始终在上下文中 | Claude 自行判断 | 强制执行 |
| 位置 | 项目根目录 | .claude/skills/*/SKILL.md | .claude/hooks/* |
| 适合 | 技术栈/命名规范 | 挖洞流程/代码审查 | git hook/lint |
十一、常见陷阱
| # | 陷阱 | 解决方案 |
|---|---|---|
| :- | :----- | :--------- |
| 1 | description 太笼统,Skill 从不自动触发 | 含具体关键词:SQL injection playbook. Use when input reaches SQL queries... |
| 2 | Skill 在错误场景触发 | 缩小 description 范围,或加 disable-model-invocation: true |
| 3 | 不会用 $ARGUMENTS | 参考 5.1 节变量替换语法 |
| 4 | Skill 太大(5000+行) | 一个 Skill 聚焦一个任务,切分成多个 |
| 5 | allowed-tools 没配,每步都弹 Yes/No | 加 allowed-tools: Read, Grep, Glob, Bash |
| 6 | 把项目配置写 Skill 里 | 静态项目信息放 CLAUDE.md |
| 7 | 目录名和 name: 不一致 | 保持一致,否则 / 命令名不确定 |
| 8 | 正文没有输出格式约束 | 加入 ## 输出格式 章节 |
十一、总结速查
一条命令创建新 Skill:
mkdir -p ~/.claude/skills/my-skill && cat > ~/.claude/skills/my-skill/SKILL.md << 'EOF'
---
name: my-skill
description: >-
What this skill does and when to use it.
Use when the user asks about X or Y scenario.
allowed-tools: Read, Bash
---
# My Skill
## Steps
1. Do A
2. Do B
## Output Format
...
EOF
一句话精要:
Skill = 给 Claude 写的「工作说明书」——写好
description(触发条件)+ 分步指令(干活流程)+ 输出格式(结果规范),Claude 就能在你需要的时候自动调用它。