如何构造发送null的HTTP请求以复现Tomcat记录的GET null 400错误
异常HTTP请求复现方案
标准HTTP客户端(包括Postman、浏览器、默认参数的curl)都会自动对请求路径做规范化处理:所有相对路径会自动补全前缀
/,因此直接请求http://targethost.com/null会被自动转为GET /null HTTP/1.1,和目标请求格式不符,自然无法复现400响应。
你可以通过直接构造原始TCP请求的方式绕过客户端自动规范化逻辑,以下是3种可直接落地的实现方式:
方法1:使用netcat(nc)手动构造请求(最直观)
- 首先执行命令连接目标服务,替换为你的实际目标主机和端口:
nc targethost.com 80
- 连接建立成功后,逐行输入以下内容,输入完最后一行后连续按2次回车触发请求:
GET null HTTP/1.1 Host: targethost.com Connection: close
操作完成后即可收到Tomcat返回的400响应,对应日志记录和你捕获的原始请求完全一致。
方法2:Python Socket 脚本自动复现
运行以下Python代码即可一键发起请求,替换代码中的目标主机、端口参数即可:
import socket # 替换为实际目标配置 TARGET_HOST = "targethost.com" TARGET_PORT = 80 # 构造原始HTTP请求,请求行路径直接填写null无需前缀/ raw_request = b"GET null HTTP/1.1\r\nHost: targethost.com\r\nConnection: close\r\n\r\n" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((TARGET_HOST, TARGET_PORT)) s.sendall(raw_request) resp = s.recv(4096) print("响应内容:\n", resp.decode())
方法3:curl 特殊参数实现
curl 7.55及以上版本支持--request-target参数直接指定原始请求路径,无需手动构造TCP包:
curl --request-target null -H "Host: targethost.com" http://targethost.com
内容的提问来源于stack exchange,提问作者suomi
相关产品推荐
相关产品推荐

