发布于20小时前20小时 背景在网站建设、服务器部署和加速器接入场景中,常见架构是“CDN/加速节点—Nginx 反向代理—应用服务—内网管理接口”。这类链路的问题通常不在单个漏洞,而在代理信任边界配置不一致:公网入口错误信任客户端提交的请求头,或将仅供内网访问的管理路径转发到公网。以下内容以授权渗透测试和自建靶场为前提,目标是验证访问控制、代理配置和日志留痕是否有效,不涉及未授权目标。具体场景测试对象为 CDN,加速回源到 Nginx。应用的管理接口位于 Nginx 配置同时存在两个问题:直接使用客户端提交的 X-Forwarded-For 判断来源地址。将 /admin/ 反向代理到应用服务,但未在边界层再次限制来源。这会形成一条典型的权限边界失效链路:公网请求进入加速层,代理头被错误信任,随后访问原本只应由内网使用的管理面。若管理接口还存在弱口令、过度授权或文件上传功能,风险会进一步扩大。问题定位方法1. 先确认实际入口和回源关系不要只扫描应用端口。先记录 DNS、证书、响应头和跳转链,确认请求是否经过 CDN 或其他加速节点:dig +short portal.example.test curl -skI /> curl -skIL --max-redirs 5 /> openssl s_client -connect portal.example.test:443 -servername portal.example.test </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates重点观察 Server、Via、X-Cache、X-Request-ID 等头部。若存在多个入口,应在授权范围内分别验证 CDN 域名、源站域名和内部测试入口,避免把缓存节点行为误判为源站行为。2. 验证管理路径是否被公网转发使用低风险的 GET 请求,仅检查状态码、响应长度和页面标题,不尝试登录或上传:for path in /admin/ /admin/login /manage/ /actuator/health; do printf '%-24s' \"$path\" curl -sk -o /tmp/resp -w 'status=%{http_code} bytes=%{size_download} type=%{content_type}\\n' \" /> done如果公网返回管理登录页,至少说明路径暴露;如果返回 401 或 403,还需要确认这是应用层认证,还是 Nginx、WAF、CDN 的边界拦截。测试记录应包含时间、请求 ID、状态码和响应摘要,不要保存真实用户 Cookie 或密码。3. 检查代理头信任是否可被客户端影响在授权环境中,对同一只读页面分别发送不同的来源头,比较响应状态和应用日志。这里只验证访问控制是否依赖可伪造头部,不进行权限操作:url=' /> for ip in 198.51.100.20 10.10.20.15 127.0.0.1; do echo \"=== X-Forwarded-For: $ip ===\" curl -sk -D - -o /tmp/admin-body \ -H \"X-Forwarded-For: $ip\" \ -H 'X-Real-IP: 203.0.113.10' \ \"$url\" | sed -n '1,12p' done如果只有修改 X-Forwarded-For 就改变了 403、401 或 200 结果,应立即核对 Nginx 的 set_real_ip_from、real_ip_header、real_ip_recursive,以及应用实际读取的是哪个请求头。客户端可以任意提交 X-Forwarded-For,除非该头由可信代理清洗并由边界设备重新生成。技术分析:权限边界如何被破坏错误配置通常类似下面的形式:location /admin/ { proxy_pass /> if ($http_x_forwarded_for ~* '^10\\.') { set $allow_admin 1; } proxy_set_header X-Forwarded-For $http_x_forwarded_for; }这里有两个问题:一是把客户端可控的请求头直接作为来源依据;二是应用和代理对真实客户端地址的理解可能不同。即使 CDN 会添加正确的来源地址,只要源站允许客户端覆盖同名头部,后端仍可能得到伪造值。另一个常见问题是只在应用层做“内网判断”,而公网 Nginx 仍然把管理接口完整暴露出来。安全边界应尽量前置到源站入口,并在应用层保留认证和授权,形成多层控制,而不是依赖单一请求头。推荐修复配置如果架构确实使用可信 CDN,应只信任 CDN 回源网段,并由 Nginx 重建来源头。下面是示例配置,实际网段必须替换为服务商公布且经过核验的回源地址:# http 级别 set_real_ip_from 192.0.2.0/24; set_real_ip_from 2001:db8:100::/48; real_ip_header X-Forwarded-For; real_ip_recursive on; server { listen 443 ssl; server_name portal.example.test; # 管理面只允许办公网和堡垒机网段 location ^~ /admin/ { allow 10.20.0.0/16; allow 10.30.40.0/24; deny all; proxy_pass /> proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass /> proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }变更后先执行语法检查和灰度 reload:nginx -t nginx -T > /tmp/nginx-effective.conf systemctl reload nginx curl -sk -o /dev/null -w '%{http_code}\\n' CDN 直接回源,必须在源站安全组限制只允许 CDN 回源网段访问 443,不能仅依靠域名隐藏源站。若管理面没有公网业务需求,更稳妥的方式是绑定内网监听地址,或通过 VPN、堡垒机和独立管理域名访问。日志留痕与关联分析修复不能只改配置,还要确认能够回溯异常请求。Nginx 建议记录请求 ID、真实来源地址、转发头摘要、状态码和上游响应时间,但不要把 Cookie、Authorization 等敏感值写入日志:log_format audit '$request_id $remote_addr $request_time ' '\"$request\" $status $body_bytes_sent ' 'upstream=$upstream_addr upstream_status=$upstream_status ' 'upstream_time=$upstream_response_time ' 'xff=\"$http_x_forwarded_for\" host=\"$host\"'; access_log /var/log/nginx/access_audit.log audit;排查窗口内可重点筛选管理路径、异常来源头和大量 401/403:awk '$7 ~ /^\\/admin/ {print}' /var/log/nginx/access_audit.log | tail -n 100 grep -E '(/admin|401|403|5[0-9][0-9])' /var/log/nginx/access_audit.log | tail -n 200 journalctl -u nginx --since '2025-01-01 10:00:00' --until '2025-01-01 12:00:00'应用日志与 Nginx 日志应通过 request_id 关联。对于已确认存在边界绕过的环境,应检查管理账号登录、配置修改、文件上传、Token 签发和异常出站连接等审计事件;如无法确认影响范围,应按凭据泄露和会话失效事件处理,轮换相关密钥并使已有会话失效。风险与修复检查清单源站安全组是否只允许可信 CDN、VPN 或办公网段访问。X-Forwarded-For、X-Real-IP 是否由可信代理重建,应用是否读取了正确字段。管理路径是否在 Nginx、WAF 和应用三层均有访问控制。反向代理是否限制了不必要的 HTTP 方法,并关闭目录索引和调试端点。管理账号是否启用多因素认证,服务账号是否遵循最小权限。日志是否包含请求 ID、来源、状态码和上游信息,并已发送到集中日志系统。修复后是否从公网、办公网、VPN 和堡垒机分别验证,避免只测试单一网络位置。总结网站、服务器和加速器组成的代理链路中,最容易被忽略的是“谁有权定义真实客户端地址”。授权测试应从入口识别、管理路径暴露、代理头信任、源站隔离和日志关联几个环节逐层验证。修复时不要只增加一条 WAF 规则,而应同时收紧源站网络面、规范代理头处理、在管理路径设置明确的网段策略,并用可检索的日志确认变更确实生效。 网络请求、日志与边界流量分析示意 服务器、云资产与权限边界梳理示意
18小时前18小时 这类问题现场最容易漏掉的不是代理规则本身,而是“代理监听范围”和“管理面自身的信任边界”没有对齐。建议按下面顺序排查,先确认暴露路径,再做修复,避免只改一处后被其他入口绕过。 1. 先从外部确认实际暴露面 # 从授权测试机执行,分别测试域名、IP、IPv6 和常见管理路径 nmap -Pn -sV -p 80,443,8080,8443,9000,9090 target.example curl -k -I curl -k -I curl -k -I 同时在反向代理和后端主机上核对监听地址,重点看是否存在直接监听公网地址的管理服务: ss -lntp sudo lsof -nP -iTCP -sTCP:LISTEN 如果管理端口显示为 0.0.0.0:8080 或 [::]:8080,即使 Nginx 已经配置了访问控制,也可能被绕过。优先改成仅监听回环或管理网卡,例如: # 应用配置示例 server.address=127.0.0.1 server.port=8080 容器场景不要直接发布到所有接口: # 不建议:-p 8080:8080 # 建议仅绑定宿主机回环 docker run -p 127.0.0.1:8080:8080 app-image 2. 代理层不要只依赖 URL 隐藏 如果管理面确实需要通过代理访问,建议使用独立域名或独立监听器,并在网络层和代理层各做一次限制。Nginx 示例: server { listen 443 ssl; server_name admin.example.com; # 仅允许管理网段,其他请求直接拒绝 allow 10.20.0.0/16; allow 192.168.50.0/24; deny all; location / { proxy_pass proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 如果前面还有 CDN、WAF 或其他代理,不能直接把 X-Forwarded-For 当成可信客户端 IP。应只信任明确的上游代理地址,并在应用框架中正确配置 trusted proxy,否则攻击者可能伪造来源 IP,绕过管理面白名单。 3. 检查 location 匹配和静态文件泄露 常见误配是把整个站点代理到内网服务,只在某个 location 里限制,或者使用了正则 location 导致优先级覆盖。修改后至少执行: nginx -T > /tmp/nginx.full.conf nginx -t systemctl reload nginx 重点搜索是否有类似以下高风险配置: proxy_pass proxy_pass location / { ... } location ~* \.(json|yml|env|bak|sql)$ { ... } 对管理接口建议显式列出路径,不要用宽泛的 location / 暴露整个后端;同时确认不存在备份文件、调试端点、健康检查端点返回环境变量或连接信息。 4. 用主机防火墙做最后一道边界 # 仅允许管理网段访问管理端口 sudo ufw deny 8080/tcp sudo ufw allow from 10.20.0.0/16 to any port 8080 proto tcp # 或使用 nftables sudo nft add rule inet filter input tcp dport 8080 ip saddr != 10.20.0.0/16 drop 规则落地后要从“允许网段”和“非允许网段”各测一次,并检查 IPv6 防火墙规则是否同步,否则可能出现 IPv4 已封、IPv6 仍暴露的情况。 最后建议把代理访问日志、应用登录日志和防火墙日志按时间线对齐,确认修复前是否已经有异常访问;修复不应只停留在返回 403,还要保证后端端口无法直连、管理账号启用 MFA、调试接口关闭,并将这几项纳入后续配置基线检查。
创建帐户或登录后发表意见