WAF开发之防护HTTP洪水攻击

2025-04-11 7 0

一、HTTP洪水攻击概述

HTTP洪水攻击(HTTP Flood)是一种分布式拒绝服务攻击(DDoS),攻击者通过大量伪造的HTTP请求(如GET/POST)淹没目标服务器,耗尽服务器资源(如连接数、CPU、内存),导致正常用户无法访问服务。与CC攻击不同,HTTP洪水攻击更侧重于‌高频次、低复杂度的请求冲击‌,攻击流量通常模拟正常用户行为,难以直接过滤。

二、HTTP洪水攻击防护策略

防护的核心目标是‌区分正常流量与恶意流量‌,并动态拦截攻击源。常用策略包括:

  1. 请求频率限制
    基于IP或会话(Session)统计单位时间内的请求次数,超出阈值则触发防护动作。

  2. 浏览器指纹验证
    通过JavaScript收集客户端浏览器特征(如User-Agent、Canvas指纹),验证是否为真实浏览器。

  3. Cookie挑战
    强制客户端执行Cookie验证流程,自动化攻击工具通常无法正确处理动态Cookie。

  4. IP信誉库联动
    结合实时IP黑名单或第三方威胁情报库,拦截已知恶意IP。

三、HTTP洪水防护的LUA代码实现

以下是一个基于‌Cookie挑战‌的防护方案示例,通过动态生成随机Cookie验证客户端合法性。

1. 变量定义与初始化
local uri = ngx.var.uri -- 当前请求路径
local ip_addr = ngx.var.remote_addr -- 客户端IP
local cookie_val = ngx.var.cookie_waf_challenge or "" -- 获取客户端Cookie
local threshold = 100 -- 单位时间(如60秒)内允许的最大请求数
local challenge_expire = 300 -- Cookie有效期(秒)
2. 请求频率统计与拦截逻辑
-- 初始化共享内存(记录IP请求次数) local http_flood = ngx.shared.http_flood -- 统计IP请求频率 local key = "req_count:" .. ip_addr local current_count, err = http_flood:incr(key, 1) if current_count == nil then http_flood:set(key, 1, 60) -- 首次计数,设置60秒过期 elseif current_count >= threshold then -- 触发防护:生成Cookie挑战 local challenge_key = "challenge:" .. ip_addr local challenge_code = http_flood:get(challenge_key) if challenge_code == nil then -- 生成随机Cookie值 local random_str = string.gsub(ngx.md5(ngx.now() .. ip_addr), "%d", "") challenge_code = string.sub(random_str, 1, 12) http_flood:set(challenge_key, challenge_code, challenge_expire) end -- 验证客户端是否携带正确Cookie if cookie_val ~= challenge_code then -- 返回挑战页面 return ngx.exit(ngx.HTTP_FORBIDDEN) else -- 验证通过,重置计数 http_flood:delete(key) http_flood:delete(challenge_key) end end -- 初始化共享内存(记录IP请求次数)
3. 挑战页面(HTML/JS)

当请求频率超限时,返回包含JavaScript的页面,强制客户端完成Cookie验证:

if ngx.status == ngx.HTTP_FORBIDDEN then
ngx.header.content_type = "text/html"
ngx.print([[
<!DOCTYPE html>
<html>
<head>
<title>安全验证</title>
<script>
// 动态设置Cookie并重试
function setChallengeCookie() {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/waf/challenge', true);
xhr.onload = function() {
if (xhr.status == 200) {
document.cookie = "waf_challenge=" + xhr.responseText + "; path=/";
location.reload(); // 重载页面以携带Cookie
}
};
xhr.send();
}
window.onload = setChallengeCookie;
</script>
</head>
<body>
<h1>正在执行安全验证,请稍候...</h1>
</body>
</html>
]])
ngx.exit(ngx.HTTP_OK)
end

4. 挑战接口(后端生成Cookie)

添加一个内部接口用于生成动态Cookie值:

location /waf/challenge {
internal;
content_by_lua_block {
local ip_addr = ngx.var.remote_addr
local challenge_key = "challenge:" .. ip_addr
local challenge_code = ngx.shared.http_flood:get(challenge_key)
ngx.print(challenge_code)
}
}

四、防护逻辑说明

  1. 请求计数
    每个IP在60秒内超过100次请求时触发挑战。

  2. 动态Cookie生成
    使用MD5哈希和时间戳生成唯一Cookie值,确保不可预测性。

  3. 客户端验证
    通过JavaScript强制客户端请求挑战接口并设置Cookie,自动化工具通常无法执行此流程。

  4. 自动重置
    验证成功后清除计数和挑战状态,避免误拦截正常用户。

五、优化方向

  • 精细化统计
    结合URI路径、User-Agent等维度统计请求频率,提升准确性。

  • 浏览器指纹增强
    集成JavaScript计算Canvas指纹,拦截无头浏览器(Headless Browser)。

  • IP信誉库
    对接威胁情报API,实时拦截高风险IP。

  • 滑动窗口算法
    使用更灵活的滑动窗口替代固定时间窗口,避免阈值突破瞬间的漏判。

六、总结

通过动态Cookie挑战和请求频率限制,该方案可有效缓解HTTP洪水攻击,迫使攻击者付出更高成本(需执行JavaScript并维持Cookie状态)。实际部署时需结合业务特点调整阈值,并通过日志监控持续优化防护策略。


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

不是哥们,北大被”RCE”了?
打靶日记——prime1
Fenjing 作者的 Jinja SSTI 完全进阶教程
“剪贴板劫持”攻击:黑客利用虚假验证码通过入侵网站窃取数据
护网还没开始,电脑先中毒了,那就实战
【THM】offensive-Steel Mountain

发布评论