관리자 백오피스 수동 보안 진단 결과보고서
목차 8개 단원
서론
"온데 관리자 백오피스(admin.onde.click) 서버 인프라를 대상으로 SK쉴더스 가이드라인 기준의 첫 수동 취약점 진단을 마쳤습니다. 이번 단계에서는 회원가입 인자, 권한 변경 배열, 쿼리 스트링 등 관리자 기능 전반의 많은 파라미터를 추적하느라 시간과 시행착오가 있었습니다. 읽기 쉽게 중복된 화면 증적 안내는 빼고, 1-1부터 8-1까지의 28개 전체 항목 중 '양호' 항목은 간단히 적고 '취약'으로 판단한 핵심 결함과 조치 방안을 요약합니다."
온데 관리자 백오피스를 대상으로 SK쉴더스 가이드라인 28개 항목의 최초 수동 취약점 진단을 완료했습니다. 취약 판정 항목과 조치 방안을 요약합니다.
1. 입/출력 값 검증 부재 (1-1 ~ 1-6)
- 1-1. XSS / CSRF 공격 가능성 (중요 - 취약): 사용자가 프로필이나 댓글을 등록할 때 심어둔 악성 스크립트가 백엔드 검증 부재로 DB에 저장된 후, 관리자가 회원 조회 API(
GET /admin-api/api/v1/members) 및 게시글/댓글 검토 API를 호출할 때 서버 측의 출력값 정제 로직 누락으로 인해 응답 데이터(JSON)에 날것의 HTML 태그가 그대로 반환되는 Stored XSS 취약점이 존재합니다.- 조치: 입출력 값에 대해 대소문자 구분 없이 필터링을 설정하고, 특수문자(
<,>,(,),#,&,',")를 표준 HTML 엔티티 문자로 변환 처리해야 합니다.
- 조치: 입출력 값에 대해 대소문자 구분 없이 필터링을 설정하고, 특수문자(
- 1-2. 삽입 (Injection) 공격 가능성 (중요 - 양호): 관리자 API 호출 시 페이징 파라미터(
size) 뒤에 SQL Injection 구문을 주입하더라도 백엔드 서버(Java/Spring)가 정수(int) 타입 캐스팅 단계에서 에러(500)를 내며 실행을 중단하므로 안전합니다. - 1-3. 파라미터 값 및 히든(hidden) 필드 조작 가능성 (중요 - 양호): 일반 어드민(
USER_ADMIN)과 정산 어드민(SELLER_ADMIN)의 역할 인가가 백엔드 시큐리티 및 게이트웨이 레벨에서 상호 격리되어 있어, 타 부서 식별자 조작 시 즉각 403 Forbidden 반려 처리되므로 안전합니다. - 1-4. SSRF / File Inclusion 공격 가능성 (중요 - 양호): 관리자 모듈 내에 외부 파일 리드 기능이나 외부 HTTP API 연동 호출부가 존재하지 않으며, 클라이언트가 목적지 경로를 직접 지정할 수 있는 변수 구조 자체가 없어 안전합니다.
- 1-5. 검증되지 않은 리다이렉트와 포워드 (일반 - 취약): 백엔드 전역 설정으로 선언된 CORS 허용 규칙에 임시 개발용 로컬 호스트 대역(
http://localhost:5173)이 승인된 채 배포되어 있습니다. 공격자가 Origin 헤더를 조작할 시 동일출처정책(SOP)을 우회하여 기밀 데이터를 취득할 위협이 있습니다.- 조치: 통합 설정부에서
http://localhost:5173허용 규칙을 모두 제거하고, 승인된 공식 운영 도메인만 허용하도록 통제해야 합니다.
- 조치: 통합 설정부에서
- 1-6. 입력 값 크기 및 정확성 검증오류 (중요 - 취약): 승인/반려 의사결정 상태값(
decision), 회원 계정 상태값(status), 블랙리스트 사유(reason), 관리자 권한 등급(roles), 정산 승인 의견(comment) 등 백엔드 DTO 내의 입력 필드들에 대해 문자열 최대 길이 및 수치 범위 검증 로직이 누락되어 있습니다. 규격을 초과하는 대용량 데이터나 비정상 인코딩 값이 주입될 때 최상위 예외(500 에러)를 유발하며 내부 스택트레이스를 노출합니다.- 조치: 요청 DTO 필드 전체에 데이터베이스 규격에 맞춘 최대 제한 길이 어노테이션(
@Size,@Min,@Positive)을 명시하여 컨트롤러 진입 단계에서 400 Bad Request로 차단해야 합니다.
- 조치: 요청 DTO 필드 전체에 데이터베이스 규격에 맞춘 최대 제한 길이 어노테이션(
2. 취약한 파일 처리 (2-1 ~ 2-2)
- 2-1. 악성코드파일 업로드 (중요 - 양호): 관리자용 모듈 전반에는 클라이언트로부터 직접 이미지를 전송받아 서버에 저장하는 파일 업로드 비즈니스 로직(
Multipart/FormData처리부)이 설계상 존재하지 않아 안전합니다. - 2-2. 중요 정보 파일 다운로드 가능성 (중요 - 양호): 서버 디렉터리 내부의 임의 파일을 리드하여 스트리밍 다운로드해 주는 파일 다운로드 API 서비스가 설계상 존재하지 않으며, 오직 안전한 JSON 응답만을 제공하므로 안전합니다.
3. 취약한 접근 통제 관리 (3-1 ~ 3-6)
- 3-1. 패스워드 정책 유무 및 반영 여부 (일반 - 취약): 보안 규정에 부합하는 관리자 비밀번호 변경 기능(웹 UI 및 관련 API)이 아예 구현되어 있지 않습니다. 이로 인해 관리자가 주기적으로 패스워드를 안전하게 변경할 수 있는 기술적 수단이 없고 강력한 패스워드 복잡도를 검증할 장치가 부재합니다.
- 조치: 안전한 비밀번호 재설정 API를 새로 만들고, 변경 시 영문 대/소문자, 숫자, 특수문자 중 3종 이상 조합 및 9자리 이상의 최소 길이 제한을 정규표현식으로 필수 필터링해야 합니다.
- 3-2. 인증 실패 횟수 제한 (일반 - 취약): 어드민 로그인 API 호출 시 인증 실패 횟수를 누적하여 제어하는 임계치 기반 계정 잠금 정책이 설정되어 있지 않아 무제한 브루트 포스(Brute Force) 공격에 노출되어 있습니다.
- 조치: 연속 5회 이상 인증 실패 시 해당 관리자 계정 잠금 플래그(
isLocked = true)를 활성화하여 최소 30분간 로그인을 차단하고, 캡차(CAPTCHA) 입력을 요구해야 합니다.
- 조치: 연속 5회 이상 인증 실패 시 해당 관리자 계정 잠금 플래그(
- 3-3. 계정 정보 파악 가능성 (일반 - 취약): 회원 관리 API(
GET /admin-api/api/v1/admin/members) 호출 시 가입자의 고유 식별자(memberId), 이메일 주소, 성명이 마스킹 없이 평문 유출되며, 정산 신청 내역 검토 시에도 파트너사 계좌번호의 마스킹이 미흡하고 정산 ID가 평문 노출됩니다.- 조치: 이메일 아이디 뒷자리 별표 치환, 실명 가림 필터 및 금융 계좌번호 마스킹을 일괄 적용하고, 내부 시퀀스 번호는 난독화하거나 일회성 토큰값으로 변환하여 반환해야 합니다.
- 3-4. 관리자 페이지 분리 여부 (일반 - 보완 필요): 일반 서비스 도메인과 물리적으로 분리되어 있으나, 관리자 접속 도메인과 경로 이름이 누구나 짐작하기 쉬운
admin(https://admin.onde.click/admin) 구조라 표적이 되기 쉽습니다.- 조치: 직관적인 admin 서브 도메인을 폐기하고 사내 내부용 예측 불가능한 임의 서브 도메인 명칭(
sys-portal등)으로 변경하며, 진입 경로 역시 난독화된 고유 주소로 우회 적용해야 합니다.
- 조치: 직관적인 admin 서브 도메인을 폐기하고 사내 내부용 예측 불가능한 임의 서브 도메인 명칭(
- 3-5. 검색엔진 정보 노출 가능성 (일반 - 취약): 웹 표준 크롤링 제어 파일인
robots.txt가 시스템 루트 경로에 존재하지 않으며, 어드민 로그인 페이지 소스 내에도 로봇 검색 인덱싱을 거부하는 차단 메타 태그가 결여되어 구글 도킹 위협에 노출되어 있습니다.- 조치: 루트 경로에 전체 차단 지시자(
Disallow: /)가 포함된robots.txt를 배치하고, 비공개 영역 HTML 소스 헤더 내에<meta name="robots" content="noindex, nofollow">태그를 반영해야 합니다.
- 조치: 루트 경로에 전체 차단 지시자(
- 3-6. 백업 파일 및 테스트 파일 존재 여부 (일반 - 양호): 60종의 백업/테스트 추측 파일명 목록을 Intruder로 스캔한 결과, 모든 경로에서 400 및 404 에러 코드로 요청을 거부해 안전합니다.
4. 취약한 인증 및 세션 관리 (4-1 ~ 4-5)
- 4-1. Cookie 및 웹 스토리지 조작 가능성 (일반 - 취약): 로그인 성공 시 동일 토큰 정보가 응답 JSON 바디(
data.accessToken)에 평문 중복 배출되고 있습니다. 프론트엔드가 이를 일반 쿠키로 저장하여 자바스크립트 접근을 허용하므로 XSS 노출 시HttpOnly장벽이 우회됩니다.- 조치: 로그인 성공 응답 DTO에서 토큰 반환 필드를 제거하고, Axios에
withCredentials: true설정을 부여하여 HttpOnly 보안 쿠키 단일 통제 체계로 패치해야 합니다.
- 조치: 로그인 성공 응답 DTO에서 토큰 반환 필드를 제거하고, Axios에
- 4-2. 인증(세션 및 토큰) 값 안전성 설정 여부 (일반 - 취약): 로그인 응답 시
memberId평문 유출, JWT 페이로드 내 이메일 정보 평문 기재 결함이 존재합니다. 또한 로그아웃 시 서버 캐시에서 세션 토큰을 무효화(Blacklist) 처리하지 않아 세션 재사용이 성립하며, 다중 IP 대역에서의 중복 동시 로그인 접속 제한 장치가 유실되어 있습니다.- 조치: 로그아웃 API 추가 시 수신 즉시 Redis 캐시에 해당 토큰을 Blacklist 키로 등록 무효화하고, JWT sub 필드는 암호화된 UUID 식별자로 치환하며, 신규 로그인 시 기존 활성 세션을 폐기(
Session Killing)해야 합니다.
- 조치: 로그아웃 API 추가 시 수신 즉시 Redis 캐시에 해당 토큰을 Blacklist 키로 등록 무효화하고, JWT sub 필드는 암호화된 UUID 식별자로 치환하며, 신규 로그인 시 기존 활성 세션을 폐기(
- 4-3. 접근제어 우회 가능성 확인 (일반 - 양호): 프론트엔드 라우터에서 인증 가드를 적용하고 백엔드도 스프링 시큐리티의 JWT 필터와 URL 패턴 인가 규칙을 함께 적용해 접근 제어를 유지하고 있습니다.
- 4-4. 비인증 상태로 중요 페이지 접근 가능성 (일반 - 양호): 세션이 없는 비인증 주소 다이렉트 타이핑 진입 시 즉각 비인증 예외 페이지로 가드 차단되며 백엔드 역시 401 코드를 반환하므로 안전합니다.
- 4-5. 일반계정 권한 상승 가능성 (일반 - 취약): 회원가입 처리 API 단에서 DTO 입력값 권한 필터링이 결여되어, 가입 패킷 바디 내부에 권한 등급 파라미터를 임의로
"SUPER_ADMIN"혹은"SELLER_ADMIN"으로 조작 전송하면 최고 권한 관리자 계정으로 즉시 승인 및 가입 처리되는 심각한 결함이 실증되었습니다.- 조치: 회원가입 API 수신 DTO 객체에서 권한 등급을 임의 할당하지 못하도록 배제하고 오직 일반 가입 등급(
USER,SELLER)만 Whitelist 통과 처리해야 합니다.
- 조치: 회원가입 API 수신 DTO 객체에서 권한 등급을 임의 할당하지 못하도록 배제하고 오직 일반 가입 등급(
5. 중요 정보 저장/전송 처리 미흡 & 부적절한 오류 처리 (5-1 ~ 6-2)
- 5-1. 소스코드 내 주요정보 노출 여부 (일반 - 취약): 백엔드 핵심 보안 컴포넌트인
AdminJwtTokenProvider.java와AesUtil.java안에 시스템 비밀키 설정이 없을 때 쓰는 기본 서명키와 AES 대칭키 문자열 상수가 평문으로 하드코딩되어 있습니다.- 조치: @Value 어노테이션에서 콜론(:) 뒤에 하드코딩한 기본 키 상수를 삭제하고, 변수 주입에 실패하면 컨테이너 시작 단계에서 프로세스가 실행되지 않도록 Fail-Fast 방식으로 바꿔야 합니다.
- 5-2. 요청 및 응답 값 내 주요정보 포함여부 확인 (중요 - 양호): 다른 항목의 취약점과 연계된 부분 외에는 암호화 가이드를 준수하여 단독 도출된 보안 취약점 없이 안전하게 관리되고 있습니다.
- 6-1. 오류페이지를 통한 정보 노출 여부 (일반 - 취약): 아웃풋 파라미터 변수에 의도적으로 타입 불일치를 유도하는 비정상 인자를 인젝션했을 때, 전역 예외 처리기 미흡으로 인해 백엔드 프레임워크가 배출하는 원시 런타임 예외 클래스 스트링(
HttpMessageNotReadableException) 및 시스템 상세 스택 트레이스 정보가 응답 바디에 날것 그대로 유출됩니다.- 조치: 글로벌 에러 핸들러(
@RestControllerAdvice)에서 최상위 예외 발생 시 외부 출력 객체에 시스템 예외 문장을 바인딩하는 행위를 금지하고, 외부에는 정형화된 안전한 범용 안내 메시지만 리턴하도록 개선해야 합니다.
- 조치: 글로벌 에러 핸들러(
- 6-2. 일괄적인 오류 처리 페이지 존재 여부 (일반 - 양호): 미등록 계정이든 비밀번호 불일치든 상관없이 로그인 실패 시 일관된
HTTP 401 Unauthorized상태 코드와 동일한 메시지를 반환하여 계정 유추 가능성을 차단하고 있습니다.
6. 취약한 컴포넌트 구성요소 & 기타 인프라 보안 (7-1 ~ 8-1)
- 7-1. Client Request Method (일반 - 양호): 크로스 사이트 트래킹에 악용되는 비인가 메소드인 TRACE 방식 패킷 전송 시 앞단 로드밸런서 및 Nginx 단에서 요청을 드롭하고
HTTP 405 Not Allowed를 정확히 반환합니다. - 7-2. 파일 목록화 가능성 (일반 - 양호): 정적 리소스 자산 폴더 접근 시 Nginx 글로벌 구성의
autoindex off;정책이 정상 기동되어 파일 리스팅을 거부하고HTTP 403 Forbidden상태 코드를 배출하므로 안전합니다. - 7-3. 서버 헤더정보 노출 (일반 - 취약): 통신 응답 패킷 헤더 구조 조사 결과, 앞단 웹 서버 및 에러 발생 시의 로드밸런서 계층에서 상세 빌드 버전 명세(
nginx/1.31.2,awselb/2.0) 정보가 외부로 평문 노출되고 있어 CVE 취약점 타깃 공격 단서가 됩니다.- 조치: Nginx 스펙 파일 내에
server_tokens off;지시어를 즉시 선언해 버전을 숨기고, 응답 헤더 재작성 규칙을 적용해 Server 지표를 가상 텍스트로 치환 마스킹해야 합니다.
- 조치: Nginx 스펙 파일 내에
- 7-4. 취약한 보안설정 (일반 - 취약): 교차 출처 리소스 공유(CORS) 정책 관리 모듈인
WebConfig.java내에 모든 오리진 출처 접근을 제한 없이 수용하는 전역 와일드카드 구문인.allowedOriginPatterns("*")설정이 잔재해 있어 잠재적 위협이 됩니다.- 조치: WebConfig 내부의 CORS 전역 와일드카드 소스코드를 즉각 영구 삭제하고, 연동이 승인된 공식 서브 도메인 대역만 정적으로 화이트리스트 명시 선언해야 합니다.
- 8-1. 취약점 진단 항목에 정의되지 않은 취약점 (일반 - 취약): 내부 가상 네트워크망 캐시 서버인 Redis 접속 구성 상 패스워드 비밀번호 검증 장치(
requirepass)가 누락되어 무인증(No Auth) 디폴트 연결이 정리되어 있습니다. 또한 상태 모니터링 컴포넌트인 Spring Boot Actuator 주요 기능들이 비활성화되지 않아 내부 스키마 명세 및 구동 환경 변수가 노출될 리스크가 상존합니다.- 조치:
redis.conf내에requirepass지시어를 의무 적용해 무인증 접근을 막고,application.yml내에management.endpoints.web.exposure.exclude=*속성을 추가해 비비즈니스 모니터링 자산 디렉터리를 구동 엔진 수준에서 삭제 조치해야 합니다.
- 조치:
7. 결론 및 다음 단계: 전체 취약점 보완을 위한 이행 점검(Re-inspection) 시작
일반 사용자, 판매자, 관리자 백오피스까지 온데(Onde) 플랫폼 전체 영역의 첫 수동 취약점 진단을 마쳤습니다. 이번 진단에서 확인한 영역별 취약점을 보완하고 다시 확인하는 이행 점검(Re-inspection)이 다음 단계입니다.
- Next 마일스톤 계획:
- 진단 결과 기반의 취약점 보완 조치: 일반 사용자, 판매자, 관리자 서비스 전체에서 확인한 입력값 검증 부재, 권한 우회 및 상승, 시스템 에러 정보 노출 등의 취약점을 바탕으로 소스코드 보안 패치와 인프라 보안 설정을 보완합니다.
- 이행 점검(Re-inspection)을 통한 최종 재검증: 보안 결함을 보완한 뒤 기존 취약점이 고쳐지고 막혔는지 다시 자세히 점검해 플랫폼 전체의 안전성을 확인합니다.
수동 진단 · 이행 점검단계 3 · Day 15–28 · 11 / 14일지 전체 →
- Day 15아르고스(Argus) 명칭·A/B/C 분담, 5개 설계 산출물 및 7월 개발 일정 수립
- Day 16WEB/API 취약점 진단 및 모의침투(Penetration Testing) 기록
- Day 17온데 실서버 배포와 2차 멘토링용 질문 정리
- Day 18두번째 멘토링
- Day 19온데(Onde) 멘토링 피드백 반영 및 아르고스(Argus) 모듈 별 1인 개발 파이프라인 개발
- Day 20아르고스 3주 일정 확정과 온데 DAST 가능성 평가
- Day 21웹/API 보안 취약점 진단 상세 결과 및 초보 진단자의 시행착오
- Day 22웹/API 최초 취약점 진단 결과보고서 — 파라미터 검증과 파일 처리
- Day 23중간 발표 PPT 작성
- Day 24실전 모의침투 보안 진단 보고서 — 3-2 ~ 8-1 항목
- Day 25관리자 백오피스 수동 보안 진단 결과보고서
- Day 26전 영역 보안 보완 이행 점검 결과 (상편: 1-1 ~ 3-6)
- Day 27전 영역 보안 보완 이행 점검 결과 (하편: 4-1 ~ 8-1)
- Day 28관리자 백오피스 이행 점검 완료 및 Argus 착수