1

我一直在处理 heartbleed 错误(主要是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 ###
4

2 回答 2

2

除了有效负载之外,合法的心跳消息还具有三个字节的元数据——消息类型和有效负载长度——以及至少 16 个字节的填充。因此,消息长度必须超过有效负载长度至少 19 个字节,而不仅仅是等于它。有关详细信息,请参阅 RFC 6520。

于 2014-04-16T03:26:15.077 回答
0

在我看来,只有在建立 tls 会话之后才允许有效的心跳请求。我已经测试过(您可以使用 s_client 或您自己的工具进行测试,也许使用 BouncyCastle)在建立 TLS 会话后发送有效的心跳请求。我建立了一个有效的 tls 会话并发送了一个加密的心跳,并且能够使用 java 和 bouncycastle 引发心跳响应。我还没有清理代码,一旦我将其发布。因此,根据经验,似乎即使在损坏的 OpenSSL 版本中,在 ServerHelloDone 之后的有效心跳请求也是不允许的。这就是在上面的示例中,没有出现心跳响应的原因。

于 2014-05-25T19:44:56.120 回答