最近遇到了安全部门派发的actuator泄漏漏洞,领导希望不暴露到外网上,对于内网需要认证才可以访问。
要想不暴露到外网上,就需要在网络层面做拦截,比如nginx和apisix上做代理配置。
URI字符绕过的风险背景知识:
URI字符绕过是一种安全漏洞,它发生在应用程序没有正确地处理或编码通用资源标识符(URI)中的某些特殊字符时。这些特殊字符可能被用于执行非预期的操作或利用安全漏洞。
跨目录拼接绕过是一种常见的URI字符绕过技术,主要用于绕过某些安全策略。比如https://xxx.com/actuator;/…/
实际上要访问的是https://xxx.com/
Tomcat 服务器处理请求时,如果请求的 URI 包含分号(;),Tomcat 会忽略分号及其后的内容。这是因为分号在 URI 中用于分隔同一资源的不同片段,而在大多数情况下,服务器不会处理这部分内容。
例如,如果有一个请求的 URI 是这样的:http://www.example.com/index.html;parameters
在这个例子中,分号后的 “parameters” 部分不会被 Tomcat 处理。它可能会被客户端浏览器解析,或者是某些特定于服务器的扩展,但是作为一个通用的 Web 服务器,Tomcat 会忽略它, 而只对http://www.example.com/index.html 做处理
%2F是URL编码,用于将某些特殊字符转换为可以在URL中传输的格式。在URL中,某些特殊字符,如空格、斜杠(/)等,不能直接传输,需要通过编码转换为"%加字符的ASCII码"格式。具体到"%2F",这是斜杠"/"的URL编码形式
举例说明URI字符串绕过代理服务器配置的actuator拦截的原理: https://xxx.com/actuator;%2f…/
被APISIX代理服务器认为是要访问https://xxx.com/, 因而没有走/actuator*的路由,直接分发给了应用服务器。
应用服务器(Tomcat)拿到https://xxx.com/actuator;%2f…/ 的路径,去掉分号后边的内容,
从而按照https://xxx.com/actuator 进行了处理。 由于应用服务器没有对actuator的请求做防护,从而暴露了端点信息
一般的情况都可以应对,就是对于http://xxx/actuator;%2f…/字符绕过这种情况,需要特殊处理。
放开actuator端点的访问
使用springBoot的1.5.8RELEASE版本编写了一个简单的web项目,支持actuator的端点访问
server:
port: 9090
management:
endpoints:
web:
exposure:
include: health,info,beans
context-path: /actuator
然后部署到了测试服务器上,带着9090端口可以正常访问/actuator端点
字符绕过也可以访问/actuator端点
actuator的访问被nginx拦截
nginx上的配置:
server {
listen 80;
server_name 192.168.1.1;
location ~*actuator.*{
# 你可以根据需要修改这里的返回码和响应体
return 403 "Actuator endpoints are not accessible directly through this server.";
}
location / {
if ($request_uri ~* 'actuator'){
return 403 "not allowed actuator";
}
proxy_pass http://192.168.1.1:9090; # 代理到本地9090端口的服务
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
用80端口访问(即走Nginx代理),被nginx拦截: