Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

의미없는 블로그

임베디드 톰캣에서 OPTIONS, TRACE 메소드 조치방안 본문

# 나/pentest (WEB)

임베디드 톰캣에서 OPTIONS, TRACE 메소드 조치방안

SaltLee 2022. 1. 5. 13:50

이클립스에서 스프링 프로젝트 만들고 로컬에 다운받은 톰캣으로 구동시키는 경우 있고

내장된 임베디드 톰캣으로 구동시키는 경우 있다

 

내장된 임베디드 톰캣 쓰면 conf/web.xml, con/server.xml 등 없기 때문에 (임베디드 톰캣은 걍 jar 파일로 되어있는듯)

메소드 조치할 때 java 코드로 설정해줘야 함 

 

1. 이클립스에서 스프링부트 플젝 만들기

https://jung-max.github.io/2020/06/24/Web-2_SpringBoot%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%83%9D%EC%84%B1/

> 요기보고 똑같이 따라함

> Spring Starter Project 로 만들면 됨

> Hello World 까지는 안띄워도 됨

> 난 Spring Boot 2.6.2, 내장 톰캣 9.0.56 이었는데 걍 스프링부트2, 톰캣 8~9 정도는 다 비슷하지 않을까

 

일단 서버 띄우면 디폴트로 1) OPTIONS, TRACE 활성화 되어있고 2) TRACE 전송시에도 응답값에 Allow 메소드 리스트 뜬다

1) OPTIONS 활성화 되어있어 Allow 메소드 리스트 노출됨

2) TRACE 활성화 되어있고, TRACE 전송시에도 Allow 메소드 리스트 노출됨

 

얘를 조치하려면 일단 1) OPTIONS, TRACE, PUT, DELETE 등 불필요 메소드는 다 차단시키고 2) setAllowTrace 값을 true로 설정해서 TRACE 전송시에 Allow 메소드 리스트 안뜨게 하면 됨

 

무튼 이거 다 web.xml 이나 server.xml 에서 하는건데 임베디드 톰캣은 얘네 없으니까..

 

2. setAllowTrace = true 로 설정 (TRACE 전송시 Allow 메소드 리스트 안뜨게)

Webconfig.java 하나 만들고 아래와 같이 작성


import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfig {

	@Bean
	public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
	    return customizer -> customizer.addConnectorCustomizers(connector -> {connector.setAllowTrace(true);}); 
	}
	
}

서버 재실행 하면 이제 TRACE 날려도 Allow 메소드 리스트 안뜸

https://stackoverflow.com/questions/64810320/customize-spring-boot-http-trace-disabled-error-response

> 요거 보고했는데 

 

3. OPTIONS, TRACE, PUT, DELETE 등 나머지 메소드들 제한

MethodFilter.java 만들고 아래와 같이 작성


import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.stereotype.Component;     
import org.springframework.web.filter.OncePerRequestFilter; 

@Component
public class MethodFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
                    throws ServletException, IOException { 
        if (request.getMethod().equals("OPTIONS") || request.getMethod().equals("TRACE") || request.getMethod().equals("PUT") || request.getMethod().equals("DELETE")){
            response.getWriter().println("method not allowed");
        } else { 
            filterChain.doFilter(request, response); 
        } 
    }
}

OPTIONS, TRACE 등 날려도 이제 안뜸

https://www.ostack.cn/?qa=1004866/

> 이거 참고했는데 찔끔 고쳤음

 

#참고

스프링부트에서 EmbeddedServletContainerCustomizer 이거 써서 메소드 제한하는 블로그 많은데 이거는 spring 1.3~1.5 에 해당하는거라 함 그래서 최근꺼 스프링 쓰면 쟤 안나옴

https://stackoverflow.com/questions/35133942/spring-boot-disable-http-methods

 

 

 

 

 

 

 

 

 

 

Comments