利用GIXY发现错误的Nginx配置
字数 1646 2025-08-27 12:33:23
GIXY工具详解:发现并修复Nginx配置错误
一、GIXY工具概述
GIXY是一个用于分析Nginx配置文件的工具,主要目标是防止安全性错误配置并自动进行缺陷检测。
关键特性:
- 支持Python 2.7和3.5+版本
- 在GNU/Linux上经过良好测试
- 可检测多种Nginx配置安全问题
二、GIXY可检测的配置问题及解决方案
1. 多行响应头问题 (add_header_multiline)
问题描述:
- 多行响应头已被RFC 7230弃用
- 部分HTTP客户端和浏览器(如IE/Edge/Nginx)不支持
错误配置示例:
add_header Content-Security-Policy "default-src: 'none';...";
more_set_headers -t 'text/html text/plain' 'X-Foo: Bar multiline';
解决方案:
- 永远不要使用多行响应头
2. 响应头重定义问题 (add_header_redefinition)
问题原因:
- Nginx的
add_header指令继承规则:当前级别定义了add_header时,不会继承上级的add_header
错误配置示例:
server {
add_header X-Frame-Options "DENY" always;
location /new-headers {
add_header Cache-Control "no-cache...";
# X-Frame-Options将在此location中丢失
}
}
解决方案:
- 重复重要的协议头
- 将所有协议头设置在相同级别(如
server部分) - 使用
ngx_headers_more模块
3. 路径遍历问题 (alias_traversal)
问题描述:
- 错误的
alias配置可能导致目录遍历攻击
错误配置示例:
location /i {
alias /data/w3/images/;
}
# 请求/i../app/config.py可访问/data/w3/app/config.py
解决方案:
- 检查所有
alias指令 - 确保父前缀位置以目录分隔符(/)结尾
4. Host头伪造问题 (host_spoofing)
问题描述:
- 使用
$http_host而非$host可能导致Host头伪造
错误配置示例:
location @app {
proxy_set_header Host $http_host;
}
解决方案:
- 使用
server_name列出正确的服务器名 - 使用
$host而非$http_host
5. HTTP拆分攻击 (http_splitting)
问题描述:
- 攻击者通过注入CRLF字符(
\n或\r\n)实施攻击
风险指令:
rewrite,return,add_header,proxy_set_header,proxy_pass- 使用
$uri和$document_uri的指令
解决方案:
- 使用安全变量如
$request_uri代替$uri - 在正则表达式中禁止换行符
- 验证
$uri变量
6. Referer/Origin验证问题 (origins)
常见错误:
- 正则表达式错误
- 允许第三方来源
错误配置示例:
if ($http_origin ~* ((^https://www\.yandex\.ru)|(^https://ya\.ru)$)) {
add_header 'Access-Control-Allow-Origin' "$http_origin";
}
解决方案:
- 修正正则表达式
- 考虑使用
ngx_http_referer_module模块 - 使用
map指令替代复杂正则
7. 服务器端请求伪造 (SSRF)
两种风险场景:
缺乏internal指令
location ~ /proxy/(.*) {
proxy_pass $1;
}
# 攻击者可控制代理地址
不安全的内部重定向
rewrite ^/(.*)/some$ /$1/ last;
location ~* ^/internal-proxy/(?<proxy_proto>https?)/(?<proxy_host>.*)/(?<proxy_path>.*)$ {
internal;
proxy_pass $proxy_proto://$proxy_host/$proxy_path;
}
解决方案:
- 对代理位置使用
internal指令 - 尽可能禁止用户传输数据
- 保护被代理服务器地址:
- 对有限主机进行硬编码
- 使用
map选择主机 - 对地址进行签名
8. Valid_referers设置为none
问题描述:
none表示允许缺少Referer头的请求- 多种合法场景会导致Referer头缺失(HTTPS→HTTP跳转等)
解决方案:
- 避免使用
none作为有效referer
三、最佳实践总结
-
响应头处理:
- 避免多行响应头
- 注意
add_header的继承规则 - 关键安全头(X-Frame-Options等)应在所有级别重复或使用模块
-
路径安全:
- 仔细检查
alias指令配置 - 确保location以
/结尾
- 仔细检查
-
请求头安全:
- 优先使用
$host而非$http_host - 谨慎处理用户提供的头信息
- 优先使用
-
代理安全:
- 内部代理位置必须标记为
internal - 限制用户控制的代理目标
- 内部代理位置必须标记为
-
输入验证:
- 验证所有用户提供的输入
- 使用安全变量替代潜在危险的变量
-
正则表达式:
- 确保Referer/Origin验证的正则严格准确
- 考虑使用
map替代复杂正则
通过GIXY工具定期检查Nginx配置,结合上述最佳实践,可显著提高Nginx服务器的安全性。