GitLabAuth

공부는 혼자하는 거·2021년 11월 20일
0

업무

목록 보기
1/15

gitlab 의 RCE 취약점으로 인해 사내 gitlab을 허용된 ip 만 등록시키는 주소로 입력하는 사이트를 만들기로 했다. 간단하게 페이지 하나만 만들면 되는 사내 프로젝트로 하루만에 급하게 만들었다. Token값은 UUID 로 만들었다.

View단은 mustache 를 이용해 만들었고 JPA를 활용했다. 이떄가 아니면 언제 JPA를 사용하겠나. 이런 간단한 사내 프로젝트는 빨리 JPA를 통해 활용하기로 했다.

버튼을 통해 AJAX 요청을 컨트롤러에게 날리면, HttpServletRequest 를 통해 client의 ip를 가져오서 DB에 insert 하고, emul 에게 rest 요청을 날려, 등록하였다는 트리거를 구현하였다.

@RequestMapping("/register")
    public @ResponseBody CMRespDto registerIp(HttpServletRequest request, String reason, String clientToken){

				String ip = CMUtills.getIp(request);

        log.info("ip 가져오기: " + ip);
        
        --- 생략-----
public static String getIp(HttpServletRequest request) {

        String ip = request.getHeader("X-Forwarded-For");

        log.info(">>>> X-FORWARDED-FOR : " + ip);

        if (ip == null) {
            ip = request.getHeader("Proxy-Client-IP");
            log.info(">>>> Proxy-Client-IP : " + ip);
        }
        if (ip == null) {
            ip = request.getHeader("WL-Proxy-Client-IP"); // 웹로직
            log.info(">>>> WL-Proxy-Client-IP : " + ip);
        }
        if (ip == null) {
            ip = request.getHeader("HTTP_CLIENT_IP");
            log.info(">>>> HTTP_CLIENT_IP : " + ip);
        }
        if (ip == null) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            log.info(">>>> HTTP_X_FORWARDED_FOR : " + ip);
        }
        if (ip == null) {
            ip = request.getRemoteAddr();
        }

        log.info(">>>> Result : IP Address : " + ip);

        return ip;

    }

Emul 은 트리거가 발생되면, DB에 접근해서 등록된 IP 정보들을 갖고와서 필드값들을 업데이트시켜주고, 그 DB에 저장된 ip 정보들을 갖고 와서, cmd 명령어를 직접 실행해서, IP를 허용시켜준다. 트리거가 없다하더라도, 스케줄링을 통해 50초간격으로 지속적으로 DB에 접근해서 등록된 IP 정보들을 갖고와서 필드값들을 업데이트시켜준다.

profile
시간대비효율

0개의 댓글