一、攻击类型快速判定表
攻击类型 | 典型特征 | 检测方法 |
---|---|---|
SQL注入 | URL中含' 、UNION SELECT 等关键字 | 日志正则匹配 |
XSS攻击 | 请求参数包含<script> 或javascript: | 输入内容过滤 |
暴力破解 | 同一IP高频POST /login 请求 | 登录失败计数监控 |
端口扫描 | 短时间内大量SYN 包发往不同端口 | TCP连接状态分析 |
文件上传漏洞 | 上传文件扩展名为.php 、.jsp | 文件类型白名单校验 |
CSRF攻击 | 请求头无Referer 或与域名不匹配 | Token验证机制 |
二、攻击检测与自愈代码实战
1. SQL注入实时阻断(Python +正则)
# Web中间件检测SQL注入(保存为sqli_blocker.py)
from flask import Flask, request, abort
import re
app = Flask(__name__)
SQLI_PATTERNS = [
r"union\s+select",
r"\d+\s+or\s+\d+",
r"';?\s*--"
]
@app.before_request
def check_sqli():
for arg in request.values.values():
if any(re.search(pattern, arg, re.I) for pattern in SQLI_PATTERNS):
ip = request.remote_addr
print(f"SQLi detected from {ip}: {arg}")
abort(403, description="非法请求已被拦截")
if __name__ == "__main__":
app.run(port=8080)
测试命令:
curl "http://localhost:8080/?id=1' OR 1=1--"
# 输出:403 Forbidden - 非法请求已被拦截
2. XSS攻击防御(前端+后端双重过滤)
前端过滤(JavaScript):
// 输入内容消毒
function sanitizeInput(input) {
return input.replace(/<[^>]*>?/gm, '')
.replace(/javascript:/gi, '')
.replace(/onerror=/gi, '');
}
// 使用示例
document.getElementById('comment').addEventListener('input', function(e) {
this.value = sanitizeInput(this.value);
});
后端加固(Node.js):
const xss = require('xss');
app.post('/comment', (req, res) => {
const cleanContent = xss(req.body.content, {
whiteList: {}, // 禁止所有HTML标签
stripIgnoreTag: true
});
// 存储cleanContent到数据库
});
三、自动化防御工具链搭建
1. 基于Fail2ban的暴力破解拦截
# 安装Fail2ban
sudo apt install fail2ban
# 配置Jail规则(/etc/fail2ban/jail.local)
[sshd]
enabled = true
maxretry = 3
bantime = 1h
# 自定义Nginx登录防护规则
[nginx-login]
enabled = true
port = http,https
filter = nginx-login
logpath = /var/log/nginx/access.log
maxretry = 5
2. 端口扫描实时告警(Python + Scapy)
# 实时检测SYN扫描(保存为portscan_detect.py)
from scapy.all import *
from collections import defaultdict
port_counter = defaultdict(int)
def packet_handler(pkt):
if pkt.haslayer(TCP) and pkt[TCP].flags == 'S':
src_ip = pkt[IP].src
port_counter[src_ip] += 1
if port_counter[src_ip] > 50: # 阈值:50个SYN包/分钟
print(f"[!] 端口扫描检测: {src_ip}")
os.system(f"iptables -A INPUT -s {src_ip} -j DROP")
sniff(filter="tcp", prn=packet_handler, store=0)
启动命令:
sudo python3 portscan_detect.py