我一直在搞乱这个心脏病(主要是cloudflare challenge)并且创建一个无效的心跳很容易,我发送如下:
### 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 ###
答案 0 :(得分:2)
除了有效负载之外,合法的心跳消息还有三个字节的元数据 - 消息类型和有效负载长度 - 以及最少16个字节的填充。结果,消息长度必须超过有效载荷长度至少19个字节,而不是仅仅等于它。有关更多详细信息,请参阅RFC 6520。
答案 1 :(得分:0)
在我看来,只有在建立tls会话后才允许有效的心跳请求。我已经测试了(您可以使用s_client或您自己的工具测试,可能使用BouncyCastle)在建立TLS会话后发送有效的心跳请求。 我建立了一个有效的tls会话并发送了一个加密的心跳,并能够使用java和bouncycastle引发心跳响应。 我还没有清除代码,一旦我发布它就会发布。 因此,根据经验,似乎即使在OpenSSL版本中,也不允许在ServerHelloDone之后立即发出有效的心跳请求。这就是上面例子中没有心跳响应的原因。