Nginx access.log异常GET带完整外部URL请求构造及复现咨询
异常HTTP请求问题解答
1. 请求构造原理
HTTP协议标准中定义的请求行原生支持4种请求URI格式,其中的absolute-form格式就是完整的URL路径,原本设计用于正向代理场景,要求代理服务端请求对应URL后返回结果。攻击者没有使用浏览器、普通curl调用这类默认走origin-form(相对路径/xxx格式)的客户端,而是直接通过TCP连接拼接原始请求报文,或者使用Go语言HTTP客户端的底层接口自定义请求行,就可以构造出日志里的这类请求。日志中的UAGo-http-client/1.1也印证了攻击者大概率使用Go语言编写的扫描工具发起请求。
2. Nginx返回200的原因
Nginx默认没有限制absolute-form格式的请求,匹配逻辑如下:
- 提取请求行中完整URL的Host字段,和已配置的所有
server_name做匹配 - 如果没有匹配到对应站点配置,请求会落到Nginx的默认server块处理
你日志中1400字节的响应,就是默认安装Nginx时自带的欢迎页的标准大小,说明这类请求没有匹配到你绑定的站点abc-xyz-1234.com,被默认server处理返回了欢迎页,所以状态码为200。
3. 模拟请求的方法
不要使用curl的默认调用逻辑,两种可行的模拟方式:
- 使用nc直接发送原始HTTP报文
nc abc-xyz-1234.com 80 << EOF GET http://xxxxxxxxx.com/ HTTP/1.1 Host: abc-xyz-1234.com Connection: close EOF
- 7.55及以上版本的curl可以通过
--request-target参数自定义请求行
curl --request-target http://xxxxxxxxx.com/ http://abc-xyz-1234.com
修复建议
可以通过Nginx配置直接拦截这类异常请求,避免被扫描利用:
- 配置默认server块直接返回444状态码,断开所有未匹配到绑定域名的请求
- 增加规则直接拦截以http/https开头的请求URI:
if ($request_uri ~ ^https?://) { return 444; }
内容的提问来源于stack exchange,提问作者GLK
相关产品推荐
相关产品推荐

