CISP学习指南:高级安全主题

  1. 八、IIS访问控制
  2. 九、缓冲区溢出漏洞
  3. 十、IP欺骗政击
  4. 十一、漏洞扫描工具
  5. 十二、DHCP Snooping
  6. 十三、数据库完整性

本指南涵盖CISP认证中的高级安全主题,包括缓冲区溢出漏洞、IP欺骗攻击、漏洞扫描工具、DHCP Snooping、数据库完整性约束和恶意软件识别等关键知识点。

八、IIS访问控制

8.1 IIS服务器访问控制

🌐 IIS访问控制

**IIS(Internet Information Services)**是微软的Web服务器,支持多种访问控制机制。

支持的访问控制类型:

  • ✅ 网络地址访问控制
  • ✅ Web服务器许可
  • ✅ NTFS许可
  • ❌ 异常行为过滤(不是IIS的访问控制类型)

7.2 IIS访问控制类型详解

网络地址访问控制(IP Address and Domain Restrictions):

网络地址访问控制:
├── 基于IP地址
│   ├── 允许特定IP访问
│   ├── 拒绝特定IP访问
│   ├── IP地址范围
│   └── 子网掩码
├── 基于域名
│   ├── 允许特定域
│   └── 拒绝特定域
├── 配置位置
│   ├── 服务器级别
│   ├── 站点级别
│   └── 应用程序级别
└── 应用场景
    ├── 限制访问来源
    ├── 防止恶意IP
    └── 地理位置限制

Web服务器许可(Web Permissions):

Web服务器许可:
├── 权限类型
│   ├── 读取(Read)
│   ├── 写入(Write)
│   ├── 脚本执行(Script)
│   ├── 执行(Execute)
│   └── 浏览目录(Directory Browsing)
├── 配置级别
│   ├── 虚拟目录
│   ├── 物理目录
│   └── 文件
├── 安全原则
│   ├── 最小权限原则
│   ├── 禁用不需要的权限
│   └── 分离静态和动态内容
└── 常见配置
    ├── 静态内容:只读
    ├── 上传目录:读写,禁止执行
    └── 脚本目录:读取+脚本执行

NTFS许可(NTFS Permissions):

NTFS许可:
├── 文件系统级别权限
│   ├── 完全控制
│   ├── 修改
│   ├── 读取和执行
│   ├── 读取
│   └── 写入
├── 与Web权限关系
│   ├── 两者都必须允许
│   ├── 取最严格的权限
│   └── NTFS是底层保护
├── 用户账户
│   ├── IIS应用程序池标识
│   ├── IUSR(匿名用户)
│   └── 认证用户
└── 最佳实践
    ├── 限制IIS账户权限
    ├── 分离内容和日志目录
    └── 定期审计权限

为什么异常行为过滤不是IIS访问控制类型:

💡 异常行为过滤

异常行为过滤是IDS/IPS或WAF(Web应用防火墙)的功能,不是IIS的访问控制类型。

区别:

  • IIS访问控制:基于静态规则(IP、权限)
  • 异常行为过滤:基于动态分析(行为模式)
  • IIS:Web服务器
  • IDS/WAF:安全检测设备

7.3 IIS访问控制配置示例

IP地址限制配置:

<!-- IIS配置文件示例 -->
<configuration>
  <system.webServer>
    <security>
      <ipSecurity allowUnlisted="false">
        <!-- 允许特定IP -->
        <add ipAddress="192.168.1.100" allowed="true" />
        <!-- 允许IP段 -->
        <add ipAddress="10.0.0.0" subnetMask="255.255.255.0" allowed="true" />
        <!-- 拒绝特定IP -->
        <add ipAddress="203.0.113.50" allowed="false" />
      </ipSecurity>
    </security>
  </system.webServer>
</configuration>

Web权限配置:

<configuration>
  <system.webServer>
    <directoryBrowse enabled="false" />
    <handlers accessPolicy="Read, Script" />
  </system.webServer>
</configuration>

7.4 IIS访问控制最佳实践

安全配置建议:

IIS安全最佳实践:
├── 网络层
│   ├── 限制管理端口访问
│   ├── 使用IP白名单
│   └── 配置防火墙规则
├── 权限层
│   ├── 最小权限原则
│   ├── 禁用目录浏览
│   ├── 分离执行权限
│   └── 限制上传目录权限
├── 认证层
│   ├── 禁用匿名访问(敏感区域)
│   ├── 使用Windows认证
│   ├── 实施强密码策略
│   └── 启用SSL/TLS
├── 监控层
│   ├── 启用日志记录
│   ├── 监控失败登录
│   ├── 审计权限变更
│   └── 定期安全审计
└── 维护层
    ├── 及时安装补丁
    ├── 删除默认站点
    ├── 移除示例应用
    └── 定期备份配置

九、缓冲区溢出漏洞

9.1 缓冲区溢出概述

🚨 缓冲区溢出漏洞

**缓冲区溢出(Buffer Overflow)**是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据会覆盖在合法数据上,可能导致程序崩溃或被攻击者利用执行恶意代码。

核心特征:

  • 数据超过缓冲区容量
  • 溢出数据覆盖相邻内存
  • 可能覆盖返回地址
  • 可被利用执行任意代码

9.2 漏洞类型辨析

💡 漏洞类型对比

A. SQL注入

  • ❌ 不是缓冲区溢出
  • 攻击数据库
  • 通过恶意SQL语句
  • 利用输入验证不足

B. XSS(跨站脚本攻击)

  • ❌ 不是缓冲区溢出
  • 攻击Web应用
  • 注入恶意脚本
  • 在浏览器中执行

C. 缓冲区溢出

  • ✅ 正确描述
  • 数据超过缓冲区容量
  • 溢出数据覆盖合法数据
  • 可导致代码执行

D. 信息技术缺陷

  • ❌ 过于宽泛
  • 不是具体漏洞类型
  • 是一般性描述

漏洞类型对比表:

漏洞类型 攻击目标 攻击方式 影响
SQL注入 数据库 恶意SQL语句 数据泄露、篡改
XSS Web浏览器 恶意脚本注入 会话劫持、钓鱼
缓冲区溢出 内存 超长数据输入 代码执行、权限提升
CSRF Web应用 伪造请求 未授权操作

9.3 缓冲区溢出原理

内存布局示意:

正常内存布局:
┌─────────────────┐ 高地址
│  命令行参数      │
├─────────────────┤
│  环境变量        │
├─────────────────┤
│  栈(Stack)     │
│  ├─返回地址      │
│  ├─保存的EBP     │
│  ├─局部变量      │
│  └─缓冲区        │ ← 正常数据填充
├─────────────────┤
│  堆(Heap)      │
├─────────────────┤
│  BSS段          │
├─────────────────┤
│  数据段          │
├─────────────────┤
│  代码段          │
└─────────────────┘ 低地址

缓冲区溢出:
┌─────────────────┐
│  返回地址        │ ← 被覆盖!
├─────────────────┤
│  保存的EBP       │ ← 被覆盖!
├─────────────────┤
│  局部变量        │ ← 被覆盖!
├─────────────────┤
│  缓冲区          │
│  [正常数据]      │
│  [溢出数据]      │ ← 超出缓冲区
│  [溢出数据]      │ ← 覆盖相邻内存
│  [恶意代码地址]  │ ← 覆盖返回地址
└─────────────────┘

攻击流程:

sequenceDiagram participant A as 攻击者 participant P as 易受攻击程序 participant M as 内存 participant C as CPU A->>P: 发送超长输入 P->>M: 写入缓冲区 Note over M: 数据超过缓冲区大小 M->>M: 溢出数据覆盖相邻内存 M->>M: 覆盖返回地址 Note over M: 返回地址被修改为
恶意代码地址 P->>C: 函数返回 C->>M: 读取返回地址 C->>C: 跳转到恶意代码 Note over C: 执行攻击者的代码

9.4 缓冲区溢出类型

按位置分类:

缓冲区溢出类型:
├── 栈溢出(Stack Overflow)
│   ├── 最常见的类型
│   ├── 覆盖返回地址
│   ├── 控制程序流程
│   └── 执行任意代码
├── 堆溢出(Heap Overflow)
│   ├── 覆盖堆中的数据
│   ├── 破坏数据结构
│   ├── 利用相对复杂
│   └── 可能导致代码执行
├── 整数溢出(Integer Overflow)
│   ├── 整数运算结果超出范围
│   ├── 导致缓冲区大小计算错误
│   ├── 间接导致缓冲区溢出
│   └── 难以检测
└── 格式化字符串漏洞
    ├── 不正确使用printf等函数
    ├── 读取或写入任意内存
    ├── 可导致信息泄露
    └── 可导致代码执行

9.5 缓冲区溢出示例

易受攻击的代码:

// 易受攻击的C代码
#include <stdio.h>
#include <string.h>

void vulnerable_function(char *input) {
    char buffer[64];  // 64字节的缓冲区
    
    // 危险!没有检查输入长度
    strcpy(buffer, input);  // 如果input超过64字节,会溢出
    
    printf("You entered: %s\n", buffer);
}

int main(int argc, char *argv[]) {
    if (argc > 1) {
        vulnerable_function(argv[1]);
    }
    return 0;
}

攻击示例:

# 正常输入(不会溢出)
./vulnerable_program "Hello World"

# 恶意输入(导致溢出)
./vulnerable_program "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x90\x90\x90\x90\xef\xbe\xad\xde"
#                     ↑ 64个A填满缓冲区                                                              ↑ NOP滑梯  ↑ 返回地址

安全的代码:

// 安全的C代码
#include <stdio.h>
#include <string.h>

void safe_function(char *input) {
    char buffer[64];
    
    // 安全!限制复制的字节数
    strncpy(buffer, input, sizeof(buffer) - 1);
    buffer[sizeof(buffer) - 1] = '\0';  // 确保字符串终止
    
    printf("You entered: %s\n", buffer);
}

int main(int argc, char *argv[]) {
    if (argc > 1) {
        safe_function(argv[1]);
    }
    return 0;
}

9.6 缓冲区溢出防护

防护措施:

缓冲区溢出防护:
├── 编码层面
│   ├── 使用安全函数
│   │   ├── strncpy代替strcpy
│   │   ├── snprintf代替sprintf
│   │   ├── fgets代替gets
│   │   └── strncat代替strcat
│   ├── 输入验证
│   │   ├── 检查输入长度
│   │   ├── 验证数据类型
│   │   └── 边界检查
│   └── 代码审查
│       ├── 静态代码分析
│       ├── 人工审查
│       └── 安全编码规范
├── 编译器保护
│   ├── 栈保护(Stack Canary)
│   │   ├── 在返回地址前放置金丝雀值
│   │   ├── 函数返回前检查
│   │   └── GCC: -fstack-protector
│   ├── ASLR(地址空间布局随机化)
│   │   ├── 随机化内存布局
│   │   ├── 增加攻击难度
│   │   └── 操作系统级别
│   ├── DEP/NX(数据执行保护)
│   │   ├── 标记内存页为不可执行
│   │   ├── 防止代码注入
│   │   └── 硬件支持
│   └── PIE(位置无关可执行文件)
│       ├── 代码段地址随机化
│       └── 配合ASLR使用
├── 运行时保护
│   ├── 内存安全工具
│   │   ├── Valgrind
│   │   ├── AddressSanitizer
│   │   └── MemorySanitizer
│   ├── 沙箱技术
│   │   ├── 限制程序权限
│   │   ├── 隔离执行环境
│   │   └── 容器化
│   └── 监控和检测
│       ├── IDS/IPS
│       ├── 异常检测
│       └── 日志分析
└── 语言选择
    ├── 使用内存安全语言
    │   ├── Java
    │   ├── Python
    │   ├── Rust
    │   └── Go
    └── 避免不安全的C/C++特性

编译器保护选项:

# GCC编译选项
gcc -fstack-protector-all \  # 栈保护
    -D_FORTIFY_SOURCE=2 \     # 运行时检查
    -fPIE -pie \              # 位置无关可执行文件
    -Wl,-z,relro \            # 只读重定位
    -Wl,-z,now \              # 立即绑定
    -o program program.c

# 检查保护机制
checksec --file=program

9.7 著名的缓冲区溢出漏洞

历史上的重大漏洞:

漏洞名称 年份 影响 描述
Morris蠕虫 1988 互联网瘫痪 利用fingerd缓冲区溢出
Code Red 2001 数十万服务器 IIS缓冲区溢出
Slammer 2003 全球网络减速 SQL Server缓冲区溢出
Heartbleed 2014 OpenSSL 堆缓冲区过度读取
EternalBlue 2017 WannaCry勒索软件 SMB协议缓冲区溢出

十、IP欺骗政击

10.1 IP欺骗原理

🎭 IP欺骗攻击

IP欺骗(IP Spoof)是利用TCP/IP协议中对源IP地址的鉴别方式的漏洞进行攻击的。

核心漏洞:

  • TCP/IP协议不验证源IP地址的真实性
  • 攻击者可以伪造源IP地址
  • 利用IP协议寻址机制的缺陷
  • 绕过基于IP地址的访问控制

10.2 IP欺骗攻击类型

常见的IP欺骗攻击:

IP欺骗攻击类型:
├── 非盲攻IP欺骗
│   ├── 攻击者在同一网段
│   ├── 可以监听响应
│   ├── 利用信任关系
│   └── 示例:ARP欺骗配合IP欺骗
├── 盲攻IP欺骗
│   ├── 攻击者不在同一网段
│   ├── 无法监听响应
│   ├── 需要预测序列号
│   └── 示例:TCP序列号预测攻击
└── DoS攻击中IP欺骗
    ├── Smurf攻击
    ├── Land攻击
    └── 隐藏攻击源

10.3 IP欺骗攻击示例

TCP序列号预测攻击:

sequenceDiagram participant A as 攻击者 participant V as 受害者 participant T as 目标服务器 Note over A: 1. 监听通信,预测TCP序列号 A->>T: 伪造源IP(受害者IP)
SYN包 T->>V: SYN-ACK(发送给受害者) Note over A: 2. 政击者预测序列号 A->>T: 伪造源IP
ACK包(预测的序列号) Note over T: 3. 连接建立,认为来自受害者 A->>T: 伪造源IP
恶意命令 Note over T: 4. 执行命令,认为是受害者发送

10.4 IP欺骗防护措施

防护策略:

IP欺骗防护措施:
├── 网络层防护
│   ├── 入站过滤(Ingress Filtering)
│   │   ├── 过滤来自外部的内部IP
│   │   ├── 过滤私有IP地址
│   │   └── RFC 2827标准
│   ├── 出站过滤(Egress Filtering)
│   │   ├── 防止内部主机伪造IP
│   │   ├── 限制源IP地址范围
│   │   └── 防止成为攻击源
│   └── 反向路径转发(RPF)
│       ├── 验证源IP地址可达性
│       └── 丢弃不可达源IP的数据包
├── 传输层防护
│   ├── TCP序列号随机化
│   ├── SYN Cookie
│   └── 连接状态跟踪
├── 应用层防护
│   ├── 强身份认证
│   ├── 不仅依赖IP地址
│   ├── 使用加密通信
│   └── 数字签名验证
└── 监控和检测
    ├── 入侵检测系统
    ├── 异常流量分析
    └── 日志审计

十一、漏洞扫描工具

11.1 常用漏洞扫描工具

🔍 漏洞扫描工具

常用的漏洞扫描工具包括:

✅ BT5(BackTrack 5)

  • 渗透测试操作系统
  • 集成多种安全工具
  • 支持漏洞扫描

✅ NMAP

  • 网络扫描工具
  • 端口扫描和服务识别
  • 支持漏洞检测脚本

✅ Nessus

  • 专业漏洞扫描器
  • 广泛的漏洞库
  • 自动化扫描和报告

11.2 不支持漏洞扫描的工具

❌ Wireshark不支持漏洞扫描

Wireshark不支持漏洞扫描。

原因:

  • Wireshark是网络协议分析器
  • 用于捕获和分析网络数据包
  • 不具备主动扫描功能
  • 不包含漏洞检测逻辑

工具功能对比:

工具 类型 主要功能 支持漏洞扫描
BT5 渗透测试系统 集成安全工具集 ✅ 是
NMAP 网络扫描 端口扫描、服务识别 ✅ 是(通过NSE)
Wireshark 协议分析 数据包捕获和分析 ❌ 否
Nessus 漏洞扫描 专业漏洞扫描 ✅ 是

十二、DHCP Snooping

12.1 DHCP Snooping概述

🔒 DHCP Snooping安全特性

**DHCP监听(DHCP Snooping)**是一种DHCP安全特性,可以有效防范DHCP攻击。

主要功能:

  • 防止伪造DHCP服务器
  • 防止DHCP饵饿攻击
  • 防止IP地址欺骗
  • 保护DHCP服务器

12.2 DHCP Snooping安全特性

DHCP Snooping的安全特性:

DHCP Snooping安全特性:
├── ✅ 比较DHCP请求报文的源MAC地址和CHADDR字段是否一致
│   ├── 防止MAC地址伪造
│   ├── 确保请求来源真实性
│   └── 丢弃不一致的请求
├── ✅ 将交换机端口划分为信任端口和非信任端口两类
│   ├── 信任端口:连接DHCP服务器或上行设备
│   ├── 非信任端口:连接用户设备
│   ├── 只允许信任端口发送DHCP服务器响应
│   └── 防止伪造DHCP服务器
├── ❌ 限制端口被允许访问的MAC地址的最大条目
│   ├── 这是端口安全(Port Security)的功能
│   ├── 不是DHCP Snooping的特性
│   └── 两者可以配合使用
└── ✅ 对端口的DHCP报文进行限速
    ├── 防止DHCP饵饿攻击
    ├── 限制DHCP请求速率
    └── 保护DHCP服务器资源

12.3 DHCP Snooping配置示例

Cisco交换机DHCP Snooping配置:

! 启用DHCP Snooping
ip dhcp snooping
ip dhcp snooping vlan 10,20

! 配置信任端口(连接DHCP服务器)
interface GigabitEthernet0/1
  description "To DHCP Server"
  ip dhcp snooping trust
  
! 配置非信任端口(连接用户)
interface range GigabitEthernet0/2-24
  description "User Ports"
  ip dhcp snooping limit rate 10
  
! 启用MAC地址验证
ip dhcp snooping verify mac-address

! 查看DHCP Snooping绑定表
show ip dhcp snooping binding

12.4 DHCP Snooping与端口安全的区别

DHCP Snooping vs 端口安全:

特性 DHCP Snooping 端口安全(Port Security)
主要功能 防止DHCP攻击 限制MAC地址数量
作用层次 DHCP协议 数据链路层
信任端口 ✅ 支持 ❌ 不支持
MAC验证 ✅ 支持 ✅ 支持
限制MAC数量 ❌ 不支持 ✅ 支持
限速 ✅ 支持 ❌ 不支持

十三、数据库完整性

8.1 数据库完整性约束

🗄️ 数据库完整性

数据库完整性约束确保数据的准确性和一致性。

三类完整性约束:

  1. 实体完整性
  2. 参照完整性
  3. 用户定义完整性

8.2 实体完整性

🔑 实体完整性约束

实体完整性要求表中的每一行都有唯一标识,通过**主键(PRIMARY KEY)**实现。

主键约束:

  • 唯一性:主键值必须唯一
  • 非空性:主键不能为NULL
  • 不可变性:主键值不应改变

SQL示例分析:

CREATE TABLE Student (
  id CHAR(8),
  Sname CHAR(20) NOT NULL,
  Sage SMALLINT,
  PRIMARY KEY(id)
)

约束类型识别:

约束 类型 说明
PRIMARY KEY(id) ✅ 实体完整性 定义主键,确保每行唯一
NOT NULL 用户定义完整性 列级约束,不允许空值

8.3 三类完整性约束详解

实体完整性(Entity Integrity):

-- 实体完整性示例
CREATE TABLE Employee (
  emp_id INT PRIMARY KEY,           -- 主键约束
  emp_name VARCHAR(50) NOT NULL,
  dept_id INT
);

-- 或使用表级约束
CREATE TABLE Employee (
  emp_id INT,
  emp_name VARCHAR(50) NOT NULL,
  dept_id INT,
  PRIMARY KEY (emp_id)              -- 表级主键约束
);

-- 复合主键
CREATE TABLE Enrollment (
  student_id INT,
  course_id INT,
  grade DECIMAL(3,1),
  PRIMARY KEY (student_id, course_id)  -- 复合主键
);

参照完整性(Referential Integrity):

-- 参照完整性示例
CREATE TABLE Department (
  dept_id INT PRIMARY KEY,
  dept_name VARCHAR(50)
);

CREATE TABLE Employee (
  emp_id INT PRIMARY KEY,
  emp_name VARCHAR(50),
  dept_id INT,
  FOREIGN KEY (dept_id) REFERENCES Department(dept_id)  -- 外键约束
);

用户定义完整性(User-Defined Integrity):

-- 用户定义完整性示例
CREATE TABLE Student (
  id CHAR(8) PRIMARY KEY,
  Sname CHAR(20) NOT NULL,          -- 非空约束
  Sage SMALLINT CHECK (Sage >= 0 AND Sage <= 150),  -- 检查约束
  Gender CHAR(1) CHECK (Gender IN ('M', 'F')),      -- 值域约束
  Email VARCHAR(100) UNIQUE         -- 唯一约束
);

8.4 完整性约束对比

三类约束对比表:

约束类型 目的 实现方式 示例
实体完整性 确保每行唯一可识别 PRIMARY KEY PRIMARY KEY(id)
参照完整性 维护表间关系一致性 FOREIGN KEY FOREIGN KEY(dept_id)
用户定义完整性 满足业务规则 NOT NULL, CHECK, UNIQUE CHECK (age >= 0)

8.5 完整性约束的重要性

数据完整性的作用:

数据完整性的重要性:
├── 数据质量保证
│   ├── 防止无效数据
│   ├── 确保数据准确性
│   └── 维护数据一致性
├── 业务规则实施
│   ├── 强制业务逻辑
│   ├── 自动验证
│   └── 减少应用层代码
├── 数据安全
│   ├── 防止数据损坏
│   ├── 维护引用关系
│   └── 避免孤立记录
└── 系统可靠性
    ├── 减少错误
    ├── 简化维护
    └── 提高信任度
分享到