常见的 Web 攻击方法

496 阅读7分钟

1. 跨站脚本攻击(XSS,Cross-Site Scripting)

描述:  XSS 是一种常见的 Web 安全漏洞,攻击者通过向受信任的网页中注入恶意 JavaScript 脚本,使其在其他用户的浏览器中执行。常见的目标包括窃取 Cookie、会话令牌、或通过伪造页面来欺骗用户。

防御方法:

  • 对所有用户输入进行 输出编码,特别是在 HTML、JavaScript 和 URL 中输出时。
  • 使用安全的 JavaScript 模板引擎或库,如 DOMPurify
  • 使用 Content Security Policy (CSP) 限制恶意脚本的执行。

攻击示例:  攻击者在评论区输入恶意脚本,导致其他用户访问该页面时触发脚本:

<input type="text" value="<script>alert('XSS');</script>">

修正示例:  使用输出编码,确保用户输入不会被浏览器解释为代码:

function escapeHTML(text) {
    return text.replace(/</g, "&lt;").replace(/>/g, "&gt;");
}
const safeValue = escapeHTML(userInput);
document.querySelector('input').value = safeValue;

2. 跨站请求伪造(CSRF,Cross-Site Request Forgery)

描述:  CSRF 攻击利用用户在目标网站上的身份发起未授权的请求。攻击者通过引诱用户点击恶意链接或加载特定页面,导致用户在不知情的情况下执行了某些敏感操作(如修改账户信息或进行资金转账)。

防御方法:

  • 使用 CSRF 令牌 来验证请求的合法性,每个表单或请求都应包含唯一的令牌。
  • 验证请求的来源,使用 Referer 或 Origin 头来确认请求来源的合法性。
  • 对关键操作使用双重验证(如短信或邮箱验证)。

攻击示例:  攻击者诱导用户点击恶意链接,伪造转账请求:

<img src="<https://bank.com/transfer?amount=1000&to=attacker_account>" style="display:none;">

修正示例:  使用 CSRF 令牌确保请求的合法性:

<form action="/transfer" method="POST">
    <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
    <input type="text" name="amount">
    <button type="submit">Transfer</button>
</form>

服务器验证 csrf_token 的有效性,防止 CSRF 攻击。

3. SQL 注入(SQL Injection)

描述:  SQL 注入是指攻击者通过向应用程序输入恶意的 SQL 语句来操控数据库查询。这种攻击可能导致数据库数据泄露、篡改,甚至在严重的情况下完全删除数据库。

防御方法:

  • 使用 预编译语句 或 参数化查询,避免将用户输入直接拼接到 SQL 语句中。
  • 对用户输入进行严格的类型验证,避免非法字符的注入。
  • 限制数据库用户的权限,确保即使发生攻击,也只能最小化损失。

攻击示例:  攻击者通过输入构造的 SQL 语句绕过认证:

SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1';

这条查询语句会使登录认证失效,允许攻击者绕过密码验证。

修正示例:  使用参数化查询防止 SQL 注入:

const query = "SELECT * FROM users WHERE username = ? AND password = ?";
db.query(query, [username, password], (err, results) => {
    if (err) throw err;
    // 处理查询结果
});

这种方式会确保用户输入被当作参数处理,而不是 SQL 语句的一部分。

4. 命令注入(Command Injection)

描述:  命令注入是一种通过向应用程序提供恶意输入,导致服务器执行未授权的系统命令的攻击方式。攻击者可以通过构造输入直接控制服务器,执行任意命令,窃取数据或破坏系统。

防御方法:

  • 避免直接使用用户输入来构建系统命令,使用语言的安全 API 来处理系统命令。
  • 对用户输入进行严格的校验,只允许符合预期格式的输入。
  • 限制应用程序对系统命令的访问权限,使用容器化或沙盒技术隔离风险。

攻击示例:  攻击者通过输入 & rm -rf / 删除服务器的文件:

const exec = require('child_process').exec;
exec('ls ' + userInput);  // 如果 userInput 是 '& rm -rf /',可能导致系统崩溃

修正示例:  使用参数化的方式避免注入风险:

const execFile = require('child_process').execFile;
execFile('ls', [userInput], (error, stdout, stderr) => {
    if (error) throw error;
    console.log(stdout);
});

5. 文件上传漏洞

描述:  文件上传漏洞是指应用允许攻击者上传恶意文件(如脚本文件、木马等),然后在服务器上执行这些文件。攻击者可以通过上传精心构造的文件,来执行恶意代码或获取服务器敏感信息。

防御方法:

  • 对上传的文件类型和扩展名进行严格的验证,限制可接受的文件格式。
  • 将上传文件存储在不可执行的目录中,避免直接在服务器上运行用户上传的文件。
  • 为上传的文件生成随机文件名,防止文件被覆盖。

攻击示例:  攻击者上传一个 .php 文件,服务器错误地允许执行该文件:

<?php
echo "File uploaded successfully!";
system($_GET['cmd']);  // 可以执行任意命令
?>

修正示例:  通过验证文件类型和扩展名,避免文件被执行:

const allowedTypes = ['image/jpeg', 'image/png'];
if (!allowedTypes.includes(file.mimetype)) {
    throw new Error('Invalid file type');
}

6. 目录遍历攻击(Directory Traversal)

描述:  目录遍历攻击(也称为路径遍历攻击)是指攻击者通过修改 URL 或输入路径参数,访问到服务器上未授权的文件或目录,可能导致泄露敏感文件,如配置文件、用户信息等。

防御方法:

  • 对用户输入的文件路径进行严格过滤,禁止使用 ../ 等跳转符号。
  • 限制应用程序只能访问特定的目录,并确保对文件系统进行最小权限访问。
  • 使用安全的文件系统 API,避免直接处理用户输入的路径。

攻击示例:  攻击者通过输入 ../../etc/passwd 访问服务器上的敏感文件:

<http://example.com/view?file=../../etc/passwd>

修正示例:  验证输入路径,并使用安全的文件路径处理方法:

const path = require('path');
const safePath = path.join(__dirname, 'uploads', fileName);
if (!safePath.startsWith(path.join(__dirname, 'uploads'))) {
    throw new Error('Invalid path');
}

7. 拒绝服务攻击(DoS/DDoS,Denial of Service)

描述:  拒绝服务攻击通过大量的请求耗尽服务器资源,导致合法用户无法正常访问服务。分布式拒绝服务攻击(DDoS)是通过多个来源同时发起攻击,进一步加大服务器的压力。

防御方法:

  • 实施流量限制(rate limiting),限制单个用户的请求频率。
  • 使用负载均衡和 CDN(内容分发网络)来分散流量。
  • 实时监控服务器状态,配置自动扩展以应对突发流量。

攻击示例:  攻击者通过发送大量无效请求,使服务器资源耗尽:

while true; do curl <http://example.com>; done

修正示例:  通过流量限制机制限制单个用户的请求频率:

const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15 分钟窗口
    max: 100 // 每个 IP 最多 100 次请求
});
app.use(limiter);

8. 点击劫持(Clickjacking)

描述:  点击劫持是一种欺骗用户点击网页上隐藏按钮的攻击方式。攻击者在透明的 iframe 中嵌入目标网站,引导用户在不知情的情况下点击,执行攻击者意图的操作

防御方法:

  • 使用 X-Frame-Options HTTP 头,阻止页面被嵌入到 iframe 中。
  • 配置 Content Security Policy (CSP) 以限制页面加载的外部资源。

攻击示例:  攻击者使用 iframe 将敏感页面嵌入到其恶意网站中,并诱导用户点击:

<iframe src="<https://bank.com/transfer>" style="opacity:0; position:absolute;"></iframe>

修正示例:  通过设置 X-Frame-Options 头,防止页面被嵌入:

X-Frame-Options: DENY

总结

Web 攻击方式千变万化,但了解并实施适当的防御措施可以有效防止大多数攻击。关键的防御策略包括:

  • 输入验证和输出编码:避免注入攻击,如 XSS 和 SQL 注入。
  • CSRF 令牌和安全性验证:防止 CSRF 攻击。
  • 安全配置和权限控制:防止文件上传、目录遍历等风险。
  • 流量限制和监控:应对拒绝服务攻击。
  • HTTP 头和 CSP:增强网页的安全性,防止点击劫持等攻击。

通过这些措施,你可以显著提高 Web 应用的安全性,保护用户和数据免受攻击。