Web安全技术与应用期末复习

Web安全技术与应用期末复习资料

题型分布

  • 填空题:(2*10)
  • 判断题:(2*10)
  • 问答题:(60) 4/5

复习建议

  • 熟记相关定义的英文缩写及中文名称,确保对各类概念有清晰理解。

第一篇 预备知识

项目1 Web 服务器平台安装与配置

  • 原理:搭建一个基本的 Web 服务器平台,包括操作系统 (Windows Server 2008)、Web 服务器 (Apache)、数据库 (MySQL) 和服务器端编程语言 (PHP)。

  • 概念:Web 服务器平台、操作系统、Web 服务器软件、数据库、服务器端编程语言、Web 开发基础 (HTML、CSS、JavaScript、PHP)。

  • 常见服务器操作系统

    • Windows Server
    • Linux/Unix
  • 主要Web服务器及市场占有率
    • Apache:47.0%
    • Nginx:37.7%
    • Microsoft IIS:10.0%
  • Apache优势
    • 开源、免费
    • 强大的社区支持
  • 关系型数据库管理系统(RDBMS)
    • Oracle, Microsoft SQL Server, IBM DB2, MySQL, PostgreSQL
  • 非关系型数据库(NoSQL)
    • MongoDB, Redis, Memcached
  • MySQL优势
    • 体积小、速度快、成本低
  • 服务器端编程语言
    • PHP(83.2%)
    • ASP, ASP.NET(13.8%)
    • Java(2.3%)

项目2 Web 开发基础

原理:学习 Web 开发基础,包括使用 MySQL 数据库进行数据操作,以及使用 HTML、CSS 和 JavaScript 进行静态网页和动态网页开发。

概念:数据库操作 (DDL、DML)、SQL 语句、HTML、CSS、JavaScript、PHP 动态网页开发。

知识储备

  1. 数据库管理系统 (DBMS)
  • 定义:操纵和管理数据库的大型软件,分为关系型和非关系型。

  • 常见DBMS:

    • 关系型:Oracle、MySQL、SQL Server。

    • 非关系型:MongoDB、Redis。

  • 特点:

    • 关系型数据库:支持事务完整性和一致性,使用SQL语言操作。
  1. 网页制作基础
  • 静态网页:

    • 仅供浏览,不与用户交互。

    • 示例:博客文章、QQ日志。

  • 动态网页:

    • 支持与Web服务器交互,如用户登录、评论功能。

    • 示例:微博、论坛。

  1. 网页前端语言
  • HTML:

    • 定义网页的结构。

    • 用标记语言描述内容,如表格、标题、图片。

  • CSS:

    • 定义网页的外观样式。

    • 层叠样式表,控制HTML元素的布局和设计。

  • JavaScript:

    • 定义网页的行为。

    • 添加交互功能,如动态时间显示。

  1. 网页后端语言
  • PHP:

    • 服务器端脚本语言,用于生成动态网页。

    • 特点:混合HTML标签编写,结果以HTML形式返回浏览器。

第二篇 SQL 注入攻击及防护

项目3 万能密码登录Post 型注入攻击

  • 原理:利用 SQL 注入攻击,通过构造特殊的用户名或密码,绕过登录验证,获取管理员权限。

  • 概念:SQL 注入攻击、万能密码、Session 验证、Post 请求、SQL 语句拼接。

URL
  • 定义:统一资源定位符(Uniform Resource Locator),用于定位Web资源。
  • 结构:由协议、域名、路径、参数组成。
表单 (Form)

概念:用于用户输入数据并提交给服务器的HTML组件,包括文本框、按钮、下拉列表等。

提交方式:

GET:

  • 参数通过URL传递,适合少量数据提交。

  • 不安全,数据会显示在地址栏。

POST:

  • 参数通过HTTP请求体传递,不显示在URL。

  • 安全性较高,适合大数据量传输。

对比见下表:

特性 Get方式 Post方式
URL显示 表单参数显示在URL中 表单参数不显示在URL中
长度限制 有限制(URL长度限制) 理论上无限
浏览器历史保存 参数保留在浏览器历史中 参数不保留在浏览器历史中
URL参数保存 可通过保存URL的方式保存参数 不可通过保存URL的方式保存参数
刷新提交机制 刷新不会重新提交 刷新会重新提交
字符编码限制 仅限ASCII字符(可能显示乱码) 无限制
Session机制

原理:

  • HTTP协议是无状态的,Session通过存储用户状态信息解决此问题。

  • 用户登录成功后,服务器生成Session ID,用户浏览器保存该ID。

  • 每次请求时携带Session ID,服务器验证用户状态。

流程:

  • 用户提交账号密码登录。

  • 服务器验证信息后建立Session会话。

  • 用户操作结束后,可通过注销功能销毁Session。

SQL注入攻击

原理:

通过在输入参数中插入恶意SQL语句,破坏原有SQL逻辑。

典型形式:万能密码,如 ‘ OR ‘1’=’1,条件恒成立,绕过登录验证。

1
SELECT * FROM users WHERE username='' OR '1'='1' AND passcode='任意内容';

常见变体:

  • 注释型:’or 1=1— (将后续语句注释掉)。

  • 条件型:’or 1=1#(将后续语句截断)。

危害:

  • 绕过权限登录。

  • 非授权访问、篡改数据库。

  • 挂马攻击、控制服务器。

防护方法

输入限制

使用正则表达式过滤

限制用户名和密码输入的字符类型,只允许字母、数字和下划线,禁止单引号等危险符号。

示例代码:

1
2
3
4
if (!preg_match('/^[a-zA-Z0-9_]{5,16}$/', $username)) {
echo "用户名格式错误!";
exit();
}

通俗解释
用户名只能是5到16位的英文字母、数字或下划线,如果输入包含'--等危险字符,会直接拦截。

前端校验

使用HTML5的pattern属性或JavaScript限制用户输入格式。

示例代码:

1
<input type="text" name="username" pattern="[a-zA-Z0-9_]{5,16}" required>

SQL查询优化

转义特殊字符

使用PHP函数对用户输入进行处理,转义SQL语句中的特殊字符,避免破坏语句结构。

常用函数:

  • addslashes():为单引号、双引号等特殊字符添加反斜杠。
  • mysqli_real_escape_string():更安全地转义SQL语句中的特殊字符。

示例代码:

1
2
$username = addslashes($username);
$password = addslashes($password);

通俗解释
如果用户输入了'or 1=1--,转义后会变成\''or 1=1--,SQL语句就无法被注入。

参数化查询(最有效的方法):

将SQL语句和用户输入分开处理,防止用户输入被解释为SQL指令。

使用PDO或MySQLi支持参数化查询,避免SQL注入。

示例代码(PDO):

1
2
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND passcode = :passcode");
$stmt->execute([':username' => $username, ':passcode' => $password]);

通俗解释
数据库会先处理SQL语句,再将用户输入作为参数加入,这样即使输入恶意代码,也只会当成普通文本。

防护方法对比

方法 优点 缺点
正则表达式过滤 简单易用,限制性强 需要严格定义规则,可能误判合法输入
转义特殊字符 使用方便,兼容性好 需注意宽字节字符集的风险
参数化查询 安全性高,根本性防护SQL注入 程序复杂性增加,对旧项目兼容性一般

项目4 数据库暴库Get 型注入攻击

  • 原理:利用 SQL 注入攻击,通过构造特殊的 URL 参数,获取数据库中的敏感信息,例如所有数据库名、所有数据表名、所有列名和所有数据。

  • 概念:SQL 注入攻击、Get 请求、SQL 语句拼接、联合查询、信息泄露。

HTML Get方式提交原理

Get方式特点:

表单数据以 变量=值 的形式附加到URL后,使用 ? 连接。

多个变量之间使用&分隔,例如:

1
http://example.com/?id=1&name=test

仅支持ASCII字符,非ASCII字符需通过URL编码(%加16进制)传递。

数据库暴库

定义:通过SQL注入等漏洞非法获取数据库内容。

实现原理:

利用SQL的UNION操作符,将攻击者构造的查询结果与正常查询结果合并。

结合MySQL内置的information_schema数据库,可获取数据库、表及列的结构信息。

示例查询:

1
2
3
SELECT * FROM books 
WHERE id='-1' UNION SELECT 1, group_concat(schema_name), 3
FROM information_schema.schemata;

关键点:

  • information_schema:MySQL内置数据库,保存数据库结构信息。
  • UNION:合并两个SELECT结果集,要求列数和数据类型匹配。
  • group_concat():将查询结果拼接为一行,方便显示。
Get型与Post型SQL注入的区别
特性 Get型 Post型
提交方式 参数附加在URL后 参数嵌入HTTP请求体
数据传递位置 浏览器地址栏显示 不显示
适用场景 超链接传递参数 表单提交数据
典型漏洞 查询操作时的SQL拼接漏洞 表单提交数据时的SQL拼接漏洞
防护方式
使用转义函数

通过 转义用户输入的内容,避免特殊字符(如单引号 ' 或双引号 ")对SQL语句的破坏。

具体实现

使用PHP的

1
mysqli_escape_string()

函数对输入内容进行处理:

1
2
3
$id = mysqli_escape_string($conn, $_GET['id']);
$sql = "SELECT * FROM books WHERE id='$id'";
$result = $conn->query($sql);

作用:

将用户输入中可能影响SQL逻辑的字符进行转义,例如:

  • ' 转换为 \'
  • " 转换为 \"
  • ; 转换为 \;

优点:

  • 简单易用,能防护常见的注入攻击。

缺点:

  • 宽字符绕过风险:在某些情况下,攻击者可以利用宽字符编码绕过转义。
  • 仍然属于 SQL语句拼接 的方式,不是最佳实践。
使用参数化查询(推荐方法)

参数化查询 是目前最推荐的防护方式。它通过将用户输入与SQL语句分离,避免用户输入直接影响SQL逻辑。

为什么参数化查询更安全?

  • 在参数化查询中,用户输入作为 参数 传递,而不是直接拼接到SQL语句中。
  • 数据库会将参数当作 普通数据 处理,而不会解析其中的特殊字符。

具体实现方式

MySQLi参数化查询

使用 MySQLi 的 prepare()bind_param() 方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$conn = new mysqli("localhost", "username", "password", "lab");

// 检查连接是否成功
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

// 准备SQL语句
$stmt = $conn->prepare("SELECT * FROM books WHERE id = ?");
$stmt->bind_param("i", $_GET['id']); // "i" 表示参数是整数类型

// 执行SQL查询
$stmt->execute();
$result = $stmt->get_result();

// 输出结果
while ($row = $result->fetch_assoc()) {
echo "Name: " . $row["name"] . " - Description: " . $row["description"] . "<br>";
}

$stmt->close();
$conn->close();
?>

代码解析

  • prepare():预编译SQL语句,将用户输入作为参数。
  • bind_param():绑定参数到SQL语句中。
  • execute():执行SQL语句时,数据库将用户输入当作普通数据,不会解析为SQL逻辑。

优点

  • 防护效果好,从根本上解决了SQL注入问题。
  • 安全性高,不需要额外处理转义或编码问题。

缺点

  • 需要学习和理解新语法。

PDO参数化查询

PDO 是PHP另一种操作数据库的方式,支持参数化查询。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$dsn = "mysql:host=localhost;dbname=lab";
$username = "root";
$password = "";

try {
$pdo = new PDO($dsn, $username, $password);

// 设置PDO错误模式为异常
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 准备参数化SQL语句
$stmt = $pdo->prepare("SELECT * FROM books WHERE id = :id");
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT);

// 执行SQL语句
$stmt->execute();

// 获取查询结果
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "Name: " . $row["name"] . " - Description: " . $row["description"] . "<br>";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>

代码解析

  • :id 是占位符,用户输入通过 bindParam() 绑定到占位符上。
  • PDO::PARAM_INT 指定参数的类型为整数,进一步增强安全性。

优点

  • 同样能从根本上防护SQL注入攻击。
  • 支持多种数据库(如MySQL、PostgreSQL、SQLite)。

缺点

  • 学习成本稍高。
其他防护措施

除了代码防护,还可以通过其他手段增强安全性:

  1. 限制用户输入

    对用户输入的数据进行严格的格式验证,例如只允许数字或字母。

    示例:

    1
    2
    3
    if (!is_numeric($_GET['id'])) {
    die("Invalid input");
    }

    优点:能阻止部分注入攻击。

    缺点:对复杂数据的防护有限。

  2. 限制数据库权限

    最小权限原则:

    • 应用程序使用的数据库账户只授予必要的权限(如查询和插入)。
    • 禁止高权限操作(如删除或修改数据库结构)。

    优点:即使注入攻击成功,损失也会减少。

    缺点:无法完全杜绝攻击。

  3. 使用Web应用防火墙(WAF)

    • 部署WAF可以检测和拦截常见的SQL注入攻击请求。
    • 优点:无需修改代码即可提供额外防护。
    • 缺点:需要额外的资源和配置。
防护对比总结
防护方式 优点 缺点
转义函数 简单易用,能防护基本攻击 有宽字符绕过风险,不彻底
参数化查询 根本性解决注入问题,安全性高 需要学习新的语法,稍复杂
限制用户输入 简单直接,适用于简单场景 不适用于复杂的数据输入
限制数据库权限 减少攻击损失,增强数据库安全 不能防止注入攻击发生
Web应用防火墙 提供额外的安全层,拦截多种攻击 需要额外配置,可能影响性能

项目5 更新密码二阶注入攻击

  • 原理:利用 SQL 注入攻击,通过注册一个特殊的账号,并使用修改密码功能,绕过权限检查,修改其他账号的密码。

  • 概念:SQL 注入攻击、二阶注入攻击、Session 验证、SQL 语句拼接、信息泄露。

二阶SQL注入

定义

  • 一阶注入:攻击字符串直接通过HTTP请求注入数据库,立即执行(如万能密码)。
  • 二阶注入:攻击字符串先存储在数据库中,再通过后续查询或更新操作引发攻击。

特点

  • 隐蔽性强,绕过一次性防护措施(如转义)。
  • 攻击在二次数据库交互时发生。

危害

  • 修改或删除数据库内容。
  • 篡改敏感数据(如用户密码)。
更新密码与二阶注入攻击

在密码更新过程中,若SQL语句未对输入数据进行防护,可能引发二阶注入。

示例:更新密码时,使用未处理的用户数据构造SQL语句:

1
UPDATE users SET passcode = '$pass' WHERE username = '$username';

如果$username中包含恶意SQL代码(如admin'#),可能导致更新逻辑被破坏。

分析

注册功能

使用转义函数处理输入,将单引号和井号转义后存储,未破坏SQL语句逻辑。

示例SQL语句:

1
INSERT INTO users (username, passcode) VALUES ('admin\'#', '123456');

更新密码功能

更新密码时未对输入参数进行完整防护。

构造的SQL语句:

1
UPDATE users SET passcode = 'admin' WHERE username = 'admin'# AND passcode = '123456';

#注释掉后续条件,使得查询条件变为:

1
UPDATE users SET passcode = 'admin' WHERE username = 'admin';

结果:仅用户admin的密码被修改。

二阶注入攻击防护
  1. PHP转义函数

    使用 mysqli_real_escape_string() 转义特殊字符。

    修改代码:

    1
    $username = mysqli_real_escape_string($conn, $_SESSION['username']);

    测试结果:

    重新登录并修改密码,数据库中admin'#的密码被更新,而admin的密码保持不变。

  2. MySQLi参数化更新

    使用参数化查询防护注入攻击。

    示例代码:

    1
    2
    3
    $stmt = $conn->prepare("UPDATE users SET passcode = ? WHERE username = ? AND passcode = ?");
    $stmt->bind_param("sss", $new_pass, $username, $current_pass);
    $stmt->execute();

    测试结果:

    更新密码功能正常,防护二阶注入攻击。

  3. 正则表达式过滤

    对用户名和密码设置规范:

    只能使用小写字母、数字和下划线,长度限制32字符。

    示例代码:

    1
    2
    3
    if (!preg_match('/^[a-z0-9_]{1,32}$/', $username)) {
    die("用户名格式不合法");
    }
  • 原理:利用 SQL 注入攻击,通过修改浏览器的 Cookie 信息,绕过登录验证,获取用户权限。

  • 概念:SQL 注入攻击、Cookie、SessionID、信息泄露、Cookie 编辑插件。

Cookie的概念
  • 定义
    • Cookie是Web服务器存储在客户端的一小段数据,用于保存用户状态。
    • 应用场景:免登录功能、保存用户偏好、统计访问数据等。
  • 格式
    • 键值对:key=value
    • URL编码:键和值必须进行URL编码。
    • 多对Cookie之间用分号和空格分隔。
  • 生命周期
    • 设置Expires属性决定Cookie的有效期。
    • 不设置Expires:浏览器关闭后Cookie失效。
Cookie与Session的区别
特性 Cookie Session
存储位置 客户端 服务器
信息安全性 较低,用户可查看和修改 较高,用户无法直接访问
适用场景 保存用户偏好、免登录等 保存用户状态(如登录状态)
Cookie注入攻击
  • 原理
    • 攻击者通过修改Cookie的内容,将恶意SQL语句嵌入其中,提交给服务器。
    • 攻击过程类似于Post型或Get型SQL注入,但更隐蔽。
  • 危害
    • 数据库暴露:泄露敏感数据。
    • 系统篡改:修改或破坏数据库内容。
    • Cookie SQL 注入攻击与常见的 GET/POST SQL 注入方式类似,其区别仅在于数据提交方式的不同,但危害一致。通过不当的查询操作,攻击者可访问甚至更改数据库中的敏感信息。
Cookie注入攻击防护
  1. 转义函数

    • 使用mysqli_real_escape_string()对Cookie值进行转义。

    • 修改代码:

      1
      $cookee = mysqli_real_escape_string($con, $_COOKIE['account']);
    • 测试结果:

      • 修改Cookie内容后,SQL注入攻击失效。
  2. 参数化查询

    • 使用MySQLi或PDO实现参数化查询。

    • 示例代码:

      1
      2
      3
      $stmt = $con->prepare("SELECT * FROM users WHERE username = ?");
      $stmt->bind_param("s", $_COOKIE['account']);
      $stmt->execute();

项目7 HTTP 头部注入攻击

  • 原理:利用 SQL 注入攻击,通过修改浏览器的 HTTP 头部信息,绕过登录验证,获取用户权限。

  • 概念:SQL 注入攻击、HTTP 头部、User-Agent、信息泄露、Live HTTP Headers 插件。

第三篇 前端攻击及防护

项目8 Session 欺骗攻击

  • 原理:利用 Session 欺骗攻击,通过复制登录用户的 SessionID,绕过登录验证,获取用户权限。

  • 概念:Session 欺骗、SessionID、信息泄露、User-Agent 验证、退出登录。

Session欺骗攻击基础
  1. Session的工作原理
    • 用户登录后,服务器端生成Session用于保存用户状态,并创建一个SessionID作为用户身份标识。
    • 浏览器通过Cookie存储SessionID,并在后续访问中将SessionID发送至服务器进行身份验证。
  2. Session欺骗攻击原理
    • 攻击者通过复制合法用户的SessionID,使未授权的用户伪装成已登录用户,从而获得相应的访问权限。
    • 攻击者通常无法完成需要密码确认的操作(如修改密码)。
  3. Session欺骗的危害
    • 身份被冒用可能导致权限控制失效。
    • 未经授权的用户可能访问敏感资源。
Session欺骗攻击测试
  1. 攻击步骤
    • 环境准备:利用已有登录功能的网站(如项目3),在不同浏览器上实施攻击。
    • 获取SessionID:
      • 在浏览器中登录后,通过开发者工具或插件(如Live HTTP Headers)获取SessionID。
    • 实施攻击:
      • 在另一浏览器中通过修改请求头中的SessionID,伪装为已登录用户。
  2. 测试现象
    • 未登录的情况下,通过伪造SessionID可以直接获得与登录用户相同的权限。
Session欺骗防护措施
1. 使用注销机制
  • 用户退出登录时调用服务器端的注销函数(如logout.php),销毁Session。
  • 避免仅关闭浏览器,而未主动注销登录造成Session仍有效。
2. 设置Session的生存时间
  • PHP默认Session有效期为1440秒(24分钟)。
  • 在程序中严格控制Session生存时间,避免长期暴露的SessionID被盗用。
3. 检测User-Agent的一致性
  • 登录后将浏览器的User-Agent信息存储在Session中。
  • 每次请求时比对User-Agent是否一致,不一致则判定为异常访问。
4. 重置SessionID
  • 在Session会话启动或刷新时调用session_regenerate_id(true)重置SessionID,使旧的SessionID失效。
  • 此方法虽不能完全防护,但可增加攻击难度。
  • 原理:利用 Cookie 欺骗攻击,通过复制登录用户的 Cookie 信息,绕过登录验证,获取用户权限。

  • 概念:Cookie 欺骗、信息泄露、特殊键值对、User-Agent 验证、退出登录。

Cookie工作原理
  • Cookie定义:存储于客户端,用于保存用户信息的小型文本数据。
  • 用途:会话保持、免登录认证等。
  • 有效期:可以设置生命周期,短期存储会话信息或长期存储用户信息。
Cookie欺骗攻击
  • 原理:攻击者获取或猜测合法用户的Cookie,将其伪装注入其他浏览器,绕过身份验证。
  • 危害:
    • 攻击者获得合法用户权限。
    • Cookie长期有效,比Session更易被攻击。
Cookie欺骗测试
  1. 准备工作:
    • 修改数据库(添加记录客户端信息的字段)。
    • 在现有网站中启用Cookie认证。
  2. 测试过程:
    • 方式一:直接猜测Cookie键值对。
    • 方式二:在一个浏览器中登录获取Cookie信息,复制到另一浏览器实现欺骗。
防护措施
  1. 设置特殊键值对:
    • 使用MD5散列登录密码生成不易猜测的键值对。
  2. 检测User-Agent一致性:
    • 登录时将User-Agent信息保存为散列值,后续请求中比对一致性。

项目10 XSS 跨站攻击

  • 原理:利用 XSS 跨站攻击,通过在用户输入的内容中嵌入恶意脚本,绕过浏览器安全机制,执行攻击者控制的代码。

  • 概念:XSS 跨站攻击、持久型 XSS、非持久型 XSS、HTML 转义、JavaScript 转义、Cookie 的 HttpOnly 属性。

基础知识
  1. XSS跨站攻击原理
    • XSS表示Cross Site Scripting,用于区别于CSS(层叠样式表)。
    • 本质:通过提交恶意HTML或JavaScript代码,当被嵌入网页后,代码会被执行,导致网页运行非设计功能的脚本。
    • 常见场景:用户提交信息(如发帖、留言等)中嵌入恶意代码。
  2. XSS攻击分类
    • 非持久型XSS攻击:恶意代码不存储在数据库中。
    • 持久型XSS攻击:恶意代码存储在数据库中,浏览器解析时会被执行。
  3. XSS攻击危害
    • 干扰网页正常功能(如弹窗攻击)。
    • 窃取用户Cookie,威胁账号安全。
    • 执行其他攻击(如Session欺骗、获取敏感信息等)。
XSS攻击防护
  • 设置Cookie的HttpOnly属性:
    • 修改PHP代码:使用setcookie()函数设置HttpOnly
    • 效果:阻止JavaScript脚本访问Cookie,避免SessionID被窃取。
  • HTML转义:
    • 方法:对用户输入的HTML代码进行转义。
    • 示例:使用htmlentities()htmlspecialchars()函数。
    • 效果:防止恶意HTML或JavaScript代码被浏览器解析和执行。
  • JavaScript转义:
    • 问题:JavaScript中可通过Unicode编码绕过HTML转义。
    • 解决方案:使用json_encode()函数对用户数据进行安全编码。

项目11 CSRF 跨站伪造请求攻击

  • 原理:利用 CSRF 跨站伪造请求攻击,通过诱导用户点击恶意链接,以用户的名义向目标网站发送请求,执行恶意操作。

  • 概念:CSRF 跨站攻击、同源策略、HTTP Referer 验证、操作确认对话框、Token 验证。

CSRF攻击基础知识
  1. CSRF攻击的原理
    • 全称:Cross Site Request Forgery(跨站伪造请求)。
    • 核心机制:利用用户浏览器中保存的身份认证信息(如Cookie),在用户不知情的情况下伪造请求并冒用用户身份。
    • 形成条件:
      • 用户已登录目标网站,浏览器中保存了认证Cookie。
      • 用户访问了另一个含有恶意代码的网页,该网页向目标网站发起伪造请求。
    • 关键特点:攻击者无法直接获取用户数据,但可冒充用户操作。
  2. CSRF攻击的危害
    • 在用户不知情的情况下完成伪造操作(如转账、消费积分、修改信息等)。
    • 破坏网站的权限控制机制。
    • 危害程度依赖于目标网站的敏感操作内容。
CSRF攻击测试
  1. 测试过程
    • 测试前提:用户在浏览器中已登录目标网站。
    • 测试实施:
      • 在保持目标网站登录状态的浏览器中,访问攻击网页(csrf.html)。
      • 点击攻击链接,目标网站后台接收伪造请求并添加恶意用户。
    • 测试现象:
      • 用户未察觉情况下,目标网站新增了恶意用户。
    • 测试条件分析:
      • 成功的CSRF攻击需满足以下条件:
        1. 用户登录目标网站。
        2. 用户访问了含有恶意代码的网页。
  2. 测试结论
    • CSRF攻击的本质是利用了用户身份认证机制的漏洞。
    • Get和Post请求均可用于CSRF攻击(通过隐藏表单实现Post提交)。
CSRF攻击防护

防护方法1:HTTP Referer验证

  • 原理:

    • 检查请求头中的Referer字段,验证请求来源是否合法。
  • 实现步骤:

    1. 修改do_adduser.php文件,添加Referer验证函数:

      1
      2
      3
      4
      5
      6
      function check_referrer($referer) {
      if ($_SERVER['HTTP_REFERER'] !== $referer) {
      die('Invalid request source');
      }
      }
      check_referrer('http://localhost/csrf/newuser.html');
    2. 重复CSRF攻击测试,验证攻击失败。

  • 优缺点:

    • 优点:有效拦截非正常来源的请求。
    • 缺点:依赖于浏览器的Referer字段支持,部分浏览器可能关闭此字段。

防护方法2:操作确认对话框

  • 原理:
    • 在敏感操作前弹出确认对话框,用户手动确认操作真实性。
  • 实现步骤:
    1. 修改do_adduser.php文件,添加操作确认提示。
    2. 当用户点击恶意链接时,弹出提示,选择“否”可阻止伪造操作。
  • 优缺点:
    • 优点:阻止用户误操作。
    • 缺点:用户可能忽略提示直接确认。

其他防护方法

  • 使用Token验证:
    • 在表单中嵌入唯一Token,提交请求时验证Token是否合法。
    • 缺点:攻击者可通过先访问合法表单获取Token后再发起伪造请求。
  • 设置Cookie的HttpOnly属性:
    • 阻止JavaScript访问Cookie,减少SessionID被窃取的风险。

项目12 验证码

  • 原理:利用验证码,通过人工识别的方式,防止自动化工具进行密码破解等恶意攻击。

  • 概念:验证码、CAPTCHA、OCR、机器学习、在线暴力攻击、人机识别。

基础知识
  1. Web登录密码暴力破解原理
    • 暴力破解方法:利用字典枚举所有可能的用户名和密码组合,逐一尝试登录。
    • 自动化工具:通过软件模拟HTTP登录请求,检查服务器返回信息确认登录是否成功。
    • 常用工具:Hydra,支持多种协议的在线密码暴力破解工具。
  2. 验证码的作用
    • 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。验证码用于区分计算机与人类用户,防止自动化攻击。
    • 常见用途:
      • 防止密码暴力破解。
      • 防止自动化批量注册。
      • 防止恶意搜索和刷票等活动。
  3. 验证码设计要点
    • 服务器端生成验证码,确保无法通过客户端伪造。
    • 验证码需有有效期和使用限制,避免重复使用。
    • 验证码复杂度需平衡安全性与用户体验。
  4. 验证码面临的挑战
    • OCR(光学字符识别)技术和机器学习的发展使简单验证码易被破解。
    • 图片滑动验证(如阿里云)和reCAPTCHA等复杂验证方式是应对现代攻击的主流方案。
拓展思考
  1. 哪些功能需要验证码?
    • 登录页面、防止暴力破解。
    • 用户注册、防止批量注册。
    • 敏感操作(如密码重置、防止账户盗用)。
  2. 验证码能否杜绝自动化攻击?
    • 验证码难以完全杜绝自动化攻击,但能大幅提高攻击成本。
    • 强化验证码方案(如短信验证、滑动验证)是更安全的选择。
  3. 如何应对高级攻击?
    • 结合多因素认证(如动态口令、硬件令牌)。
    • 监控异常登录行为并触发额外验证。

第四篇 文件漏洞及防护

项目13 文件上传漏洞

  • 原理:利用文件上传漏洞,上传恶意文件,获取服务器权限,甚至控制整个系统。

  • 概念:文件上传漏洞、MIME 类型检测、文件类型过滤、0x00 截断、文件解析漏洞、白名单过滤、黑名单过滤。

基础知识
  1. 文件上传漏洞概述
    • 文件上传是Web系统中常见功能,但由于控制不严格,攻击者可能通过漏洞上传恶意文件(如网页木马),实现对服务器的控制。
    • 主要的文件上传漏洞类型:
      • MIME类型检测绕过
      • 文件类型过滤不严格
      • 文件名/路径0x00截断漏洞
  2. 常见文件上传漏洞类型
    • MIME文件上传漏洞:
      • MIME(多用途互联网邮件扩展类型)通过HTTP协议为文件提供数据格式标识。
      • 攻击方式:利用抓包工具修改文件的MIME类型,绕过服务器检测。
    • 文件类型过滤不严格:
      • 文件扩展名检查时未考虑大小写或未严格匹配。
      • 例如:通过.Php绕过.php过滤规则。
    • 文件名/路径0x00截断漏洞:
      • 利用0x00(空字符)的截断特性,使服务器保存的文件名被截断。
      • 例:文件名1.php 0x00 abc.jpg在某些低版本PHP中被保存为1.php
文件上传漏洞攻击测试
  1. 工具选择
    • 使用Fiddler进行抓包和HTTP数据包编辑。
    • 其他抓包工具(如Burp Suite、Wireshark)也可用于类似测试。
  2. 漏洞攻击类型
    • MIME文件上传漏洞
      • 步骤:
        1. 创建一个.php文件(如info.php),测试直接上传是否被服务器阻止。
        2. 使用Fiddler抓包,修改文件的MIME类型为允许的类型(如image/jpeg)。
        3. 重放修改后的请求,成功绕过文件类型检测,上传.php文件。
        4. 通过浏览器访问上传的.php文件,确认被服务器解析。
      • 原理:服务器通过$_FILES['file']['type']读取MIME类型,容易被抓包工具篡改。
    • 0x00截断路径上传漏洞
      • 步骤:
        1. .php文件改名为.jpg,上传时使用Fiddler抓包。
        2. 在上传路径中插入0x00(空字符),如1.php0x00info.jpg
        3. 重放修改后的请求,成功将文件保存为.php类型,并利用漏洞访问。
      • 原理:低版本PHP中未对路径合法性进行严格检查,0x00之后的内容会被截断。
  3. 攻击分析
    • MIME类型检测不可靠,易被抓包工具修改绕过。
    • 文件名/路径的0x00截断漏洞在低版本PHP中存在,但高版本PHP已修复。
文件上传漏洞防护
  1. 防护方法
    • 判断路径变量:
      • 使用路径白名单机制,限制路径变量为预定义的合法值。
      • 在低版本PHP中,可有效防护路径截断攻击。
    • 文件重命名:
      • 上传文件时,重新生成唯一文件名,并以白名单中允许的扩展名保存。
      • 优点:防止文件名截断和超长文件名攻击。
      • 缺点:无法防止路径截断问题。
    • 设置非Web目录保存文件:
      • 将上传文件存储在非Web目录下(如C:\uploads),避免直接访问上传文件。
      • 使用readfile()函数读取文件内容并提供下载。
  2. 防护效果测试
    • 升级PHP版本后,确认0x00路径截断漏洞修复。
    • 针对MIME检测绕过,验证文件扩展名过滤的可靠性。
    • 测试非Web目录方案,确保文件无法直接通过URL访问。
拓展思考
  1. 如何利用0x00截断攻击上传文件?
    • 在上传路径中插入0x00字符,截断路径或文件名以实现攻击。
    • 示例路径:uploads/1.php0x00info.jpg
  2. 如何使用黑名单过滤文件上传?
    • 列出所有不允许的文件扩展名(如.php.exe)。
    • 缺点:无法穷尽所有可能的恶意扩展名,不如白名单可靠。

项目14 文件下载漏洞

  • 原理:利用文件下载漏洞,下载服务器中的敏感信息,例如数据库、配置文件等。

  • 概念:文件下载漏洞、open_basedir 安全选项、正则表达式过滤、路径参数过滤。

定义:攻击者通过漏洞下载服务器中的敏感文件

防护方法

  1. 使用open_basedir限制PHP脚本访问目录
  2. 使用正则表达式过滤路径参数
  3. 验证并限制用户输入的路径参数

项目15 文件解析漏洞

  • 原理:利用 Apache 服务器的文件解析漏洞,绕过文件类型限制,上传 PHP 木马文件,获取服务器权限。

  • 概念:文件解析漏洞、Apache 解析特性、.htaccess 文件、文件类型限制、危险函数。

定义:绕过文件类型限制,上传并解析恶意文件获取服务器权限

防护方法

  1. 使用.htaccess限制文件解析类型
  2. 严格文件类型检查,允许特定类型
  3. 禁用危险函数(如exec(), system()

项目16 文件包含漏洞

  • 原理:利用文件包含漏洞,包含服务器中的非法文件,执行恶意代码,获取服务器权限。

  • 概念:文件包含漏洞、open_basedir 安全选项、正则表达式过滤、文件名过滤。

定义:通过包含非法文件执行恶意代码,获取服务器权限

防护方法

  1. 使用open_basedir限制包含文件目录
  2. 使用正则表达式过滤文件名
  3. 仅允许特定文件名或路径包含