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 动态网页开发。
知识储备
- 数据库管理系统 (DBMS)
定义:操纵和管理数据库的大型软件,分为关系型和非关系型。
常见DBMS:
关系型:Oracle、MySQL、SQL Server。
非关系型:MongoDB、Redis。
特点:
- 关系型数据库:支持事务完整性和一致性,使用SQL语言操作。
- 网页制作基础
静态网页:
仅供浏览,不与用户交互。
示例:博客文章、QQ日志。
动态网页:
支持与Web服务器交互,如用户登录、评论功能。
示例:微博、论坛。
- 网页前端语言
HTML:
定义网页的结构。
用标记语言描述内容,如表格、标题、图片。
CSS:
定义网页的外观样式。
层叠样式表,控制HTML元素的布局和设计。
JavaScript:
定义网页的行为。
添加交互功能,如动态时间显示。
- 网页后端语言
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 | if (!preg_match('/^[a-zA-Z0-9_]{5,16}$/', $username)) { |
通俗解释:
用户名只能是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 | $username = addslashes($username); |
通俗解释:
如果用户输入了'or 1=1--
,转义后会变成\''or 1=1--
,SQL语句就无法被注入。
参数化查询(最有效的方法):
将SQL语句和用户输入分开处理,防止用户输入被解释为SQL指令。
使用PDO或MySQLi支持参数化查询,避免SQL注入。
示例代码(PDO):
1 | $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND passcode = :passcode"); |
通俗解释:
数据库会先处理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 | SELECT * FROM books |
关键点:
information_schema
:MySQL内置数据库,保存数据库结构信息。UNION
:合并两个SELECT
结果集,要求列数和数据类型匹配。group_concat()
:将查询结果拼接为一行,方便显示。
Get型与Post型SQL注入的区别
特性 | Get型 | Post型 |
---|---|---|
提交方式 | 参数附加在URL后 | 参数嵌入HTTP请求体 |
数据传递位置 | 浏览器地址栏显示 | 不显示 |
适用场景 | 超链接传递参数 | 表单提交数据 |
典型漏洞 | 查询操作时的SQL拼接漏洞 | 表单提交数据时的SQL拼接漏洞 |
防护方式
使用转义函数
通过 转义用户输入的内容,避免特殊字符(如单引号 '
或双引号 "
)对SQL语句的破坏。
具体实现
使用PHP的
1 | mysqli_escape_string() |
函数对输入内容进行处理:
1 | $id = mysqli_escape_string($conn, $_GET['id']); |
作用:
将用户输入中可能影响SQL逻辑的字符进行转义,例如:
'
转换为\'
"
转换为\"
;
转换为\;
优点:
- 简单易用,能防护常见的注入攻击。
缺点:
- 宽字符绕过风险:在某些情况下,攻击者可以利用宽字符编码绕过转义。
- 仍然属于 SQL语句拼接 的方式,不是最佳实践。
使用参数化查询(推荐方法)
参数化查询 是目前最推荐的防护方式。它通过将用户输入与SQL语句分离,避免用户输入直接影响SQL逻辑。
为什么参数化查询更安全?
- 在参数化查询中,用户输入作为 参数 传递,而不是直接拼接到SQL语句中。
- 数据库会将参数当作 普通数据 处理,而不会解析其中的特殊字符。
具体实现方式
MySQLi参数化查询
使用 MySQLi 的 prepare()
和 bind_param()
方法:
1 |
|
代码解析:
prepare()
:预编译SQL语句,将用户输入作为参数。bind_param()
:绑定参数到SQL语句中。execute()
:执行SQL语句时,数据库将用户输入当作普通数据,不会解析为SQL逻辑。
优点:
- 防护效果好,从根本上解决了SQL注入问题。
- 安全性高,不需要额外处理转义或编码问题。
缺点:
- 需要学习和理解新语法。
PDO参数化查询
PDO 是PHP另一种操作数据库的方式,支持参数化查询。
代码实现:
1 |
|
代码解析:
:id
是占位符,用户输入通过bindParam()
绑定到占位符上。PDO::PARAM_INT
指定参数的类型为整数,进一步增强安全性。
优点:
- 同样能从根本上防护SQL注入攻击。
- 支持多种数据库(如MySQL、PostgreSQL、SQLite)。
缺点:
- 学习成本稍高。
其他防护措施
除了代码防护,还可以通过其他手段增强安全性:
限制用户输入
对用户输入的数据进行严格的格式验证,例如只允许数字或字母。
示例:
1
2
3if (!is_numeric($_GET['id'])) {
die("Invalid input");
}优点:能阻止部分注入攻击。
缺点:对复杂数据的防护有限。
限制数据库权限
最小权限原则:
- 应用程序使用的数据库账户只授予必要的权限(如查询和插入)。
- 禁止高权限操作(如删除或修改数据库结构)。
优点:即使注入攻击成功,损失也会减少。
缺点:无法完全杜绝攻击。
使用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
的密码被修改。
二阶注入攻击防护
PHP转义函数:
使用
mysqli_real_escape_string()
转义特殊字符。修改代码:
1
$username = mysqli_real_escape_string($conn, $_SESSION['username']);
测试结果:
重新登录并修改密码,数据库中
admin'#
的密码被更新,而admin
的密码保持不变。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();测试结果:
更新密码功能正常,防护二阶注入攻击。
正则表达式过滤:
对用户名和密码设置规范:
只能使用小写字母、数字和下划线,长度限制32字符。
示例代码:
1
2
3if (!preg_match('/^[a-z0-9_]{1,32}$/', $username)) {
die("用户名格式不合法");
}
项目6 Cookie 注入攻击
原理:利用 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注入攻击防护
转义函数:
使用
mysqli_real_escape_string()
对Cookie值进行转义。修改代码:
1
$cookee = mysqli_real_escape_string($con, $_COOKIE['account']);
测试结果:
- 修改Cookie内容后,SQL注入攻击失效。
参数化查询:
使用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欺骗攻击基础
- Session的工作原理:
- 用户登录后,服务器端生成Session用于保存用户状态,并创建一个SessionID作为用户身份标识。
- 浏览器通过Cookie存储SessionID,并在后续访问中将SessionID发送至服务器进行身份验证。
- Session欺骗攻击原理:
- 攻击者通过复制合法用户的SessionID,使未授权的用户伪装成已登录用户,从而获得相应的访问权限。
- 攻击者通常无法完成需要密码确认的操作(如修改密码)。
- Session欺骗的危害:
- 身份被冒用可能导致权限控制失效。
- 未经授权的用户可能访问敏感资源。
Session欺骗攻击测试
- 攻击步骤:
- 环境准备:利用已有登录功能的网站(如项目3),在不同浏览器上实施攻击。
- 获取SessionID:
- 在浏览器中登录后,通过开发者工具或插件(如Live HTTP Headers)获取SessionID。
- 实施攻击:
- 在另一浏览器中通过修改请求头中的SessionID,伪装为已登录用户。
- 测试现象:
- 未登录的情况下,通过伪造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失效。 - 此方法虽不能完全防护,但可增加攻击难度。
项目9 Cookie 欺骗攻击
原理:利用 Cookie 欺骗攻击,通过复制登录用户的 Cookie 信息,绕过登录验证,获取用户权限。
概念:Cookie 欺骗、信息泄露、特殊键值对、User-Agent 验证、退出登录。
Cookie工作原理
- Cookie定义:存储于客户端,用于保存用户信息的小型文本数据。
- 用途:会话保持、免登录认证等。
- 有效期:可以设置生命周期,短期存储会话信息或长期存储用户信息。
Cookie欺骗攻击
- 原理:攻击者获取或猜测合法用户的Cookie,将其伪装注入其他浏览器,绕过身份验证。
- 危害:
- 攻击者获得合法用户权限。
- Cookie长期有效,比Session更易被攻击。
Cookie欺骗测试
- 准备工作:
- 修改数据库(添加记录客户端信息的字段)。
- 在现有网站中启用Cookie认证。
- 测试过程:
- 方式一:直接猜测Cookie键值对。
- 方式二:在一个浏览器中登录获取Cookie信息,复制到另一浏览器实现欺骗。
防护措施
- 设置特殊键值对:
- 使用MD5散列登录密码生成不易猜测的键值对。
- 检测User-Agent一致性:
- 登录时将User-Agent信息保存为散列值,后续请求中比对一致性。
项目10 XSS 跨站攻击
原理:利用 XSS 跨站攻击,通过在用户输入的内容中嵌入恶意脚本,绕过浏览器安全机制,执行攻击者控制的代码。
概念:XSS 跨站攻击、持久型 XSS、非持久型 XSS、HTML 转义、JavaScript 转义、Cookie 的 HttpOnly 属性。
基础知识
- XSS跨站攻击原理:
- XSS表示Cross Site Scripting,用于区别于CSS(层叠样式表)。
- 本质:通过提交恶意HTML或JavaScript代码,当被嵌入网页后,代码会被执行,导致网页运行非设计功能的脚本。
- 常见场景:用户提交信息(如发帖、留言等)中嵌入恶意代码。
- XSS攻击分类:
- 非持久型XSS攻击:恶意代码不存储在数据库中。
- 持久型XSS攻击:恶意代码存储在数据库中,浏览器解析时会被执行。
- XSS攻击危害:
- 干扰网页正常功能(如弹窗攻击)。
- 窃取用户Cookie,威胁账号安全。
- 执行其他攻击(如Session欺骗、获取敏感信息等)。
XSS攻击防护
- 设置Cookie的HttpOnly属性:
- 修改PHP代码:使用
setcookie()
函数设置HttpOnly
。 - 效果:阻止JavaScript脚本访问Cookie,避免SessionID被窃取。
- 修改PHP代码:使用
- HTML转义:
- 方法:对用户输入的HTML代码进行转义。
- 示例:使用
htmlentities()
或htmlspecialchars()
函数。 - 效果:防止恶意HTML或JavaScript代码被浏览器解析和执行。
- JavaScript转义:
- 问题:JavaScript中可通过Unicode编码绕过HTML转义。
- 解决方案:使用
json_encode()
函数对用户数据进行安全编码。
项目11 CSRF 跨站伪造请求攻击
原理:利用 CSRF 跨站伪造请求攻击,通过诱导用户点击恶意链接,以用户的名义向目标网站发送请求,执行恶意操作。
概念:CSRF 跨站攻击、同源策略、HTTP Referer 验证、操作确认对话框、Token 验证。
CSRF攻击基础知识
- CSRF攻击的原理:
- 全称:Cross Site Request Forgery(跨站伪造请求)。
- 核心机制:利用用户浏览器中保存的身份认证信息(如Cookie),在用户不知情的情况下伪造请求并冒用用户身份。
- 形成条件:
- 用户已登录目标网站,浏览器中保存了认证Cookie。
- 用户访问了另一个含有恶意代码的网页,该网页向目标网站发起伪造请求。
- 关键特点:攻击者无法直接获取用户数据,但可冒充用户操作。
- CSRF攻击的危害:
- 在用户不知情的情况下完成伪造操作(如转账、消费积分、修改信息等)。
- 破坏网站的权限控制机制。
- 危害程度依赖于目标网站的敏感操作内容。
CSRF攻击测试
- 测试过程:
- 测试前提:用户在浏览器中已登录目标网站。
- 测试实施:
- 在保持目标网站登录状态的浏览器中,访问攻击网页(
csrf.html
)。 - 点击攻击链接,目标网站后台接收伪造请求并添加恶意用户。
- 在保持目标网站登录状态的浏览器中,访问攻击网页(
- 测试现象:
- 用户未察觉情况下,目标网站新增了恶意用户。
- 测试条件分析:
- 成功的CSRF攻击需满足以下条件:
- 用户登录目标网站。
- 用户访问了含有恶意代码的网页。
- 成功的CSRF攻击需满足以下条件:
- 测试结论:
- CSRF攻击的本质是利用了用户身份认证机制的漏洞。
- Get和Post请求均可用于CSRF攻击(通过隐藏表单实现Post提交)。
CSRF攻击防护
防护方法1:HTTP Referer验证
原理:
- 检查请求头中的Referer字段,验证请求来源是否合法。
实现步骤:
修改
do_adduser.php
文件,添加Referer验证函数:1
2
3
4
5
6function check_referrer($referer) {
if ($_SERVER['HTTP_REFERER'] !== $referer) {
die('Invalid request source');
}
}
check_referrer('http://localhost/csrf/newuser.html');重复CSRF攻击测试,验证攻击失败。
优缺点:
- 优点:有效拦截非正常来源的请求。
- 缺点:依赖于浏览器的Referer字段支持,部分浏览器可能关闭此字段。
防护方法2:操作确认对话框
- 原理:
- 在敏感操作前弹出确认对话框,用户手动确认操作真实性。
- 实现步骤:
- 修改
do_adduser.php
文件,添加操作确认提示。 - 当用户点击恶意链接时,弹出提示,选择“否”可阻止伪造操作。
- 修改
- 优缺点:
- 优点:阻止用户误操作。
- 缺点:用户可能忽略提示直接确认。
其他防护方法:
- 使用Token验证:
- 在表单中嵌入唯一Token,提交请求时验证Token是否合法。
- 缺点:攻击者可通过先访问合法表单获取Token后再发起伪造请求。
- 设置Cookie的
HttpOnly
属性:- 阻止JavaScript访问Cookie,减少SessionID被窃取的风险。
项目12 验证码
原理:利用验证码,通过人工识别的方式,防止自动化工具进行密码破解等恶意攻击。
概念:验证码、CAPTCHA、OCR、机器学习、在线暴力攻击、人机识别。
基础知识
- Web登录密码暴力破解原理:
- 暴力破解方法:利用字典枚举所有可能的用户名和密码组合,逐一尝试登录。
- 自动化工具:通过软件模拟HTTP登录请求,检查服务器返回信息确认登录是否成功。
- 常用工具:Hydra,支持多种协议的在线密码暴力破解工具。
- 验证码的作用:
- 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。验证码用于区分计算机与人类用户,防止自动化攻击。
- 常见用途:
- 防止密码暴力破解。
- 防止自动化批量注册。
- 防止恶意搜索和刷票等活动。
- 验证码设计要点:
- 服务器端生成验证码,确保无法通过客户端伪造。
- 验证码需有有效期和使用限制,避免重复使用。
- 验证码复杂度需平衡安全性与用户体验。
- 验证码面临的挑战:
- OCR(光学字符识别)技术和机器学习的发展使简单验证码易被破解。
- 图片滑动验证(如阿里云)和reCAPTCHA等复杂验证方式是应对现代攻击的主流方案。
拓展思考
- 哪些功能需要验证码?
- 登录页面、防止暴力破解。
- 用户注册、防止批量注册。
- 敏感操作(如密码重置、防止账户盗用)。
- 验证码能否杜绝自动化攻击?
- 验证码难以完全杜绝自动化攻击,但能大幅提高攻击成本。
- 强化验证码方案(如短信验证、滑动验证)是更安全的选择。
- 如何应对高级攻击?
- 结合多因素认证(如动态口令、硬件令牌)。
- 监控异常登录行为并触发额外验证。
第四篇 文件漏洞及防护
项目13 文件上传漏洞
原理:利用文件上传漏洞,上传恶意文件,获取服务器权限,甚至控制整个系统。
概念:文件上传漏洞、MIME 类型检测、文件类型过滤、0x00 截断、文件解析漏洞、白名单过滤、黑名单过滤。
基础知识
- 文件上传漏洞概述:
- 文件上传是Web系统中常见功能,但由于控制不严格,攻击者可能通过漏洞上传恶意文件(如网页木马),实现对服务器的控制。
- 主要的文件上传漏洞类型:
- MIME类型检测绕过。
- 文件类型过滤不严格。
- 文件名/路径0x00截断漏洞。
- 常见文件上传漏洞类型:
- MIME文件上传漏洞:
- MIME(多用途互联网邮件扩展类型)通过HTTP协议为文件提供数据格式标识。
- 攻击方式:利用抓包工具修改文件的MIME类型,绕过服务器检测。
- 文件类型过滤不严格:
- 文件扩展名检查时未考虑大小写或未严格匹配。
- 例如:通过
.Php
绕过.php
过滤规则。
- 文件名/路径0x00截断漏洞:
- 利用0x00(空字符)的截断特性,使服务器保存的文件名被截断。
- 例:文件名
1.php 0x00 abc.jpg
在某些低版本PHP中被保存为1.php
。
- MIME文件上传漏洞:
文件上传漏洞攻击测试
- 工具选择:
- 使用Fiddler进行抓包和HTTP数据包编辑。
- 其他抓包工具(如Burp Suite、Wireshark)也可用于类似测试。
- 漏洞攻击类型:
- MIME文件上传漏洞:
- 步骤:
- 创建一个
.php
文件(如info.php
),测试直接上传是否被服务器阻止。 - 使用Fiddler抓包,修改文件的MIME类型为允许的类型(如
image/jpeg
)。 - 重放修改后的请求,成功绕过文件类型检测,上传
.php
文件。 - 通过浏览器访问上传的
.php
文件,确认被服务器解析。
- 创建一个
- 原理:服务器通过
$_FILES['file']['type']
读取MIME类型,容易被抓包工具篡改。
- 步骤:
- 0x00截断路径上传漏洞:
- 步骤:
- 将
.php
文件改名为.jpg
,上传时使用Fiddler抓包。 - 在上传路径中插入
0x00
(空字符),如1.php0x00info.jpg
。 - 重放修改后的请求,成功将文件保存为
.php
类型,并利用漏洞访问。
- 将
- 原理:低版本PHP中未对路径合法性进行严格检查,
0x00
之后的内容会被截断。
- 步骤:
- MIME文件上传漏洞:
- 攻击分析:
- MIME类型检测不可靠,易被抓包工具修改绕过。
- 文件名/路径的
0x00
截断漏洞在低版本PHP中存在,但高版本PHP已修复。
文件上传漏洞防护
- 防护方法:
- 判断路径变量:
- 使用路径白名单机制,限制路径变量为预定义的合法值。
- 在低版本PHP中,可有效防护路径截断攻击。
- 文件重命名:
- 上传文件时,重新生成唯一文件名,并以白名单中允许的扩展名保存。
- 优点:防止文件名截断和超长文件名攻击。
- 缺点:无法防止路径截断问题。
- 设置非Web目录保存文件:
- 将上传文件存储在非Web目录下(如
C:\uploads
),避免直接访问上传文件。 - 使用
readfile()
函数读取文件内容并提供下载。
- 将上传文件存储在非Web目录下(如
- 判断路径变量:
- 防护效果测试:
- 升级PHP版本后,确认
0x00
路径截断漏洞修复。 - 针对MIME检测绕过,验证文件扩展名过滤的可靠性。
- 测试非Web目录方案,确保文件无法直接通过URL访问。
- 升级PHP版本后,确认
拓展思考
- 如何利用0x00截断攻击上传文件?
- 在上传路径中插入
0x00
字符,截断路径或文件名以实现攻击。 - 示例路径:
uploads/1.php0x00info.jpg
。
- 在上传路径中插入
- 如何使用黑名单过滤文件上传?
- 列出所有不允许的文件扩展名(如
.php
、.exe
)。 - 缺点:无法穷尽所有可能的恶意扩展名,不如白名单可靠。
- 列出所有不允许的文件扩展名(如
项目14 文件下载漏洞
原理:利用文件下载漏洞,下载服务器中的敏感信息,例如数据库、配置文件等。
概念:文件下载漏洞、open_basedir 安全选项、正则表达式过滤、路径参数过滤。
定义:攻击者通过漏洞下载服务器中的敏感文件
防护方法
- 使用
open_basedir
限制PHP脚本访问目录 - 使用正则表达式过滤路径参数
- 验证并限制用户输入的路径参数
项目15 文件解析漏洞
原理:利用 Apache 服务器的文件解析漏洞,绕过文件类型限制,上传 PHP 木马文件,获取服务器权限。
概念:文件解析漏洞、Apache 解析特性、.htaccess 文件、文件类型限制、危险函数。
定义:绕过文件类型限制,上传并解析恶意文件获取服务器权限
防护方法
- 使用
.htaccess
限制文件解析类型 - 严格文件类型检查,允许特定类型
- 禁用危险函数(如
exec()
,system()
)
项目16 文件包含漏洞
原理:利用文件包含漏洞,包含服务器中的非法文件,执行恶意代码,获取服务器权限。
概念:文件包含漏洞、open_basedir 安全选项、正则表达式过滤、文件名过滤。
定义:通过包含非法文件执行恶意代码,获取服务器权限
防护方法
- 使用
open_basedir
限制包含文件目录 - 使用正则表达式过滤文件名
- 仅允许特定文件名或路径包含