创建有效的心跳请求

1 投票
2 回答
2731 浏览
提问于 2025-04-18 02:53

我最近在研究心脏出血漏洞(主要是 cloudflare挑战),创建一个无效的心跳包很简单,我是这样发送的:

### HEATBEAT ###

0x18,       # Content Type (Heartbeat)
0x03, 0x01,  # TLS version
0x00, 0x03,  # Length
# Payload
0x01,       # Type (Request)
0xff, 0xff  # Payload length
            # NO PAYLOAD

### END HEARBEAT ###

不过,当我尝试发送这个有效的心跳包时,服务器没有回应。

### HEATBEAT ###

0x18,       # Content Type (Heartbeat)
0x03, 0x01,  # TLS version
0x00, 0x03,  # Length
# Payload
0x01,       # Type (Request)
0x00, 0x03  # Payload length
0x68, 0x61, 0x74, # Payload: hat

### END HEARBEAT ###

我试着调整负载长度,无论是加1还是减1都不行。即使长度远远超过实际长度也不行。有人知道我哪里出错了吗?

这是我的 完整代码,有兴趣的可以看看(这个是基于 这个

编辑:回应 @warren-dew,这个也不行:

### HEATBEAT ###

0x18,       # Content Type (Heartbeat)
0x03, 0x01,  # TLS version
0x00, 0x03,  # Length
# Payload
0x01,       # Type (Request)
0x00, 0x03  # Payload length
0x68, 0x61, 0x74, # Payload: hat
0x34, 0x90, 0xf0, 0xf3, # PADDING
0xe3, 0xb4, 0x5c, 0x9c, # PADDING
0x80, 0xff, 0x95, 0x74, # PADDING
0x9d, 0x81, 0xfa, 0xa0  # PADDING
### END HEARBEAT ###

编辑:回应 @warren-dew,再次调整了,但还是不行:

### HEATBEAT ###

0x18,       # Content Type (Heartbeat)
0x03, 0x01,  # TLS version
0x00, 0x16,  # Length <- Changed
# Payload
0x01,       # Type (Request)
0x00, 0x03  # Payload length
0x68, 0x61, 0x74, # Payload: hat
0x34, 0x90, 0xf0, 0xf3, # PADDING
0xe3, 0xb4, 0x5c, 0x9c, # PADDING
0x80, 0xff, 0x95, 0x74, # PADDING
0x9d, 0x81, 0xfa, 0xa0  # PADDING
### END HEARBEAT ###

2 个回答

0

我觉得,只有在建立了TLS会话之后,才允许发送有效的心跳请求。我测试过(你也可以用s_client或者自己用BouncyCastle工具测试)在建立TLS会话后发送有效的心跳请求。 我成功建立了一个有效的TLS会话,并发送了一个加密的心跳请求,使用Java和BouncyCastle成功收到了心跳响应。 我还没有整理好代码,整理好后会分享出来。 所以根据我的观察,即使在一些有问题的OpenSSL版本中,在ServerHelloDone之后发送有效的心跳请求也是不被允许的。这就是为什么在上面的例子中,没有收到心跳响应的原因。

2

一个合法的心跳消息除了包含主要内容(也就是负载)之外,还需要有三个字节的元数据,这些元数据包括消息类型和负载长度。此外,消息还必须至少有16个字节的填充数据。因此,消息的总长度必须比负载的长度多出至少19个字节,而不仅仅是和负载长度相等。想了解更多细节,可以查看RFC 6520。

撰写回答