게시판 파일 하나가 DB를 열었다: 웹셸 업로드와 개인정보 유출

아프로·2026년 11월 5일

웹셸 업로드 표지

파일 하나. 게시판에 올라온 그 파일은 서버에서 실행되는 코드였습니다. 2023년 12월 13일, 개인정보보호위원회(개인정보위)는 웹셸이 업로드돼 데이터베이스(DB)까지 접근을 허용한 ㈜스피드옥션 등 두 곳에 과징금과 과태료를 의결했습니다. 1년 반 전인 2022년 6월 8일에도 같은 방식의 사고로 두 곳이 제재를 받았습니다.

사고 원인: 파일 업로드의 확장자와 실행 권한을 제한하지 않았고, DB 접근을 IP 주소로 막지 않았습니다. 잘 알려진 공격에 기본 조치가 없었습니다.

이 글은 개인정보위 의결을 다룬 보도 두 건을 바탕으로 합니다. 회사별 유출 인원과 과징금 액수는 보도에 나온 것만 적었습니다.

한눈에 보기

항목2023년 12월 의결2022년 6월 의결
회의개인정보위 제20회 전체회의(2023-12-13)개인정보위 제10회 전체회의(2022-06-08)
대상2개 사업자3개 사업자
웹셸 사고㈜스피드옥션위더스교육(원격평생교육원), 뉴지스탁(주식 데이터분석 서비스)
같은 회의의 다른 사고㈜코다스디자인: SQL 인젝션, 이용자 38,209명 유출창비(온라인 도서 사이트): SQL 주입
처분 합계과징금 2억 2,343만 원, 과태료 1,440만 원과징금 3,700만 원, 과태료 2,140만 원
위반안전조치 의무, 유출 통지·신고 의무안전조치 의무 등

웹셸(web shell)은 웹 서버에 올려 실행시키는 명령 실행 코드입니다. 한 번 실행되면 공격자가 브라우저로 서버를 원격 조종할 수 있습니다. SQL 인젝션은 입력값을 조작해 DB 질의를 바꾸는 공격입니다.

무슨 일이 있었나

  • 2022년 6월 8일: 개인정보위가 웹셸과 SQL 주입으로 개인정보가 유출된 세 사업자를 제재합니다. 세 곳은 한국인터넷진흥원(KISA)에 유출을 신고했고, 이 신고로 조사가 시작됐습니다(정보통신신문).
  • 위더스교육: 파일 업로드의 보안 취약점 점검이 미흡해 웹셸 공격을 받았고, 수강생 이름과 연락처 등이 유출됐습니다.
  • 뉴지스탁: 자유게시판의 보안 취약점을 점검하지 않아 웹셸 공격을 받았고, 이용자 연락처 등이 유출됐습니다.
  • 2023년 12월 13일: 개인정보위가 다시 두 사업자를 제재합니다(데일리시큐).
  • 스피드옥션: 공격자가 웹 보안 취약점으로 웹셸을 업로드한 뒤 DB에 접근했고, 이용자 개인정보가 유출됐습니다.

게시판 업로드에서 웹셸 실행, DB 접근, 개인정보 유출로 이어진 경로와 막을 수 있었던 네 지점

원리 수준으로 그린 경로입니다. 어떤 취약점으로 파일이 올라갔는지는 보도에 나오지 않습니다.

  1. 게시판 업로드. 게시판이나 업로드 기능으로 실행 가능한 파일이 올라갑니다.
  2. 웹에서 실행. 그 파일이 웹 서버가 실행하는 위치에 저장되고, 주소로 호출하면 서버에서 코드가 실행됩니다.
  3. DB 접근. 공격자가 DB에 접근합니다. DB 접근 권한은 IP 주소로 제한되지 않았습니다.
  4. 유출. 이용자 개인정보가 밖으로 나갔습니다.

왜 뚫렸나

업로드 확장자와 실행 권한 (개인정보위, 데일리시큐 보도)

스피드옥션은 파일 업로드 확장자와 실행 권한을 제한하는 등 웹셸 공격을 막는 조치를 하지 않았습니다. 확장자를 제한하지 않으면 실행 코드가 그대로 올라가고, 실행 권한을 막지 않으면 올라간 코드가 서버에서 동작합니다.

DB 접근 IP (개인정보위, 데일리시큐 보도)

DB 접근 권한을 IP 주소로 제한하지 않은 점도 위반으로 확인됐습니다. 업로드에서 한 번 놓친 공격을 DB 앞에서 한 번 더 막을 장치가 없었습니다.

점검과 탐지 (개인정보위, 정보통신신문 보도)

  • 위더스교육은 침입탐지·차단 시스템 운영을 소홀히 했습니다.
  • 위더스교육은 탈퇴 회원의 개인정보를 즉시 파기하지 않았고, 1년 이상 이용하지 않은 회원의 정보를 분리 보관하지 않았습니다. 지울 정보가 남아 있으면 유출될 정보도 많아집니다.
  • 뉴지스탁은 자유게시판의 보안 취약점을 점검하지 않았습니다.

정보통신신문 기사는 이 기업들이 적절한 사이버보안 조치를 했다면 피해를 막을 수 있었다고 전했습니다. 기사 제목도 "언제적 해킹 기법인데"였습니다.

개발자 시점: 내 서비스였다면

사고 회사의 코드가 아니라 같은 실수를 보여 주는 일반 예시입니다. Spring Boot 모양의 Java 코드이고 값은 모두 가짜입니다.

위험한 모양

// 게시판 첨부 업로드 (일반 예시)
@PostMapping("/board/upload")
public String upload(@RequestParam MultipartFile f)
        throws IOException {
    String name = f.getOriginalFilename(); // 이름 그대로
    Path dst = Path.of("webapp/upload", name); // 웹 루트 안
    f.transferTo(dst);
    return "/upload/" + name;  // 주소로 바로 열림
}
// 확장자 검사 없음, 실행 권한 그대로
// DB: 어느 서버에서든 접속 가능

사용자가 정한 이름과 확장자 그대로, 웹 서버가 내려주고 실행하는 폴더에 저장합니다. 실행 코드가 올라오면 그 주소를 여는 순간 서버에서 실행됩니다.

고친 모양

private static final Set<String> ALLOWED =
    Set.of("jpg", "png", "pdf");             // 허용 목록
private static final Path STORE =
    Path.of("/srv/app-files");               // 웹 루트 밖

@PostMapping("/board/upload")
public FileRef upload(@RequestParam MultipartFile f)
        throws IOException {
    String ext = extOf(f.getOriginalFilename());
    if (!ALLOWED.contains(ext) || !magic.matches(f, ext))
        throw new BadRequestException("허용하지 않는 파일");
    String id = UUID.randomUUID().toString(); // 무작위 이름
    Path dst = STORE.resolve(id + "." + ext);
    f.transferTo(dst);
    Files.setPosixFilePermissions(dst,
        PosixFilePermissions.fromString("rw-r-----")); // 실행 권한 없음
    return files.save(id, ext, f.getOriginalFilename());
}

@GetMapping("/files/{id}")   // 내려받기만, 실행하지 않음
public ResponseEntity<Resource> download(@PathVariable UUID id) {
    FileRef r = files.find(id);
    return ResponseEntity.ok()
        .header("Content-Disposition", "attachment")
        .header("X-Content-Type-Options", "nosniff")
        .body(new FileSystemResource(STORE.resolve(r.stored())));
}
  • 확장자 허용 목록. 받을 확장자만 정해 두고 나머지는 거부합니다. 막을 확장자를 나열하는 방식은 빠뜨린 확장자가 생깁니다. 파일 앞부분의 형식 표시(매직 바이트)도 확장자와 맞는지 확인합니다.
  • 웹 루트 밖에 저장. 웹 서버가 주소로 바로 내려주거나 실행하는 폴더가 아닌 곳(/srv/app-files)에 둡니다. 파일은 컨트롤러를 거쳐 내려받기로만 나갑니다.
  • 무작위 이름. 저장 이름은 UUID로 만들고, 원래 이름은 DB에만 기록합니다. 공격자는 올린 파일의 주소를 짐작할 수 없습니다.
  • 실행 권한 없음. 저장한 파일에 실행 권한을 주지 않고, 저장 폴더는 웹 서버 설정에서도 스크립트 실행을 끕니다.

DB 쪽은 접속을 허용하는 출발지를 애플리케이션 서버 주소(예: 192.0.2.10)로만 좁힙니다. 웹셸이 실행된 서버가 다른 곳이라면 DB에 닿지 않습니다. 같은 서버라면 그 서버의 DB 계정 권한을 필요한 테이블로 줄여 둡니다.

막을 수 있었던 네 지점

  1. 업로드 확장자를 허용 목록으로 제한했다면 실행 코드는 처음부터 올라가지 못했습니다.
  2. 웹 루트 밖에 실행 권한 없이 저장했다면 파일이 올라가도 주소로 실행되지 않았습니다.
  3. DB 접근 IP를 제한했다면 웹셸이 실행된 서버에서 DB까지 가는 경로가 좁아졌습니다.
  4. 침입탐지와 정기 점검을 운영했다면 웹 디렉터리에 생긴 낯선 파일을 유출 전에 찾을 수 있었습니다. 탈퇴 회원 정보를 제때 파기했다면 유출 범위도 줄었습니다.

2023년 의결을 전한 보도는 SQL 인젝션과 웹셸 공격이 잘 알려진 기법이지만 피해가 매우 크다고 전했습니다(데일리시큐). 같은 회의에서 SQL 인젝션 사고를 함께 다룬 것도 같은 맥락입니다. 입력을 믿지 않는 것은 글자 입력이든 파일 입력이든 같습니다.

같은 사고를 막는 점검 5줄

  • 업로드는 확장자 허용 목록과 파일 형식 확인을 함께 거친다.
  • 업로드 파일은 웹 루트 밖에 무작위 이름으로 저장하고, 실행 권한을 주지 않는다.
  • 첨부는 컨트롤러로 내려받기만 하고, 저장 폴더의 스크립트 실행은 웹 서버 설정에서도 끈다.
  • DB 접근은 애플리케이션 서버 IP로만 허용하고, DB 계정 권한은 필요한 만큼만 준다.
  • 게시판·업로드 기능을 주기적으로 점검하고, 웹 디렉터리의 새 실행 파일에 경보를 건다.

제재와 비용

의결과징금 합계과태료 합계위반 사항
2023-12-13(2개 사업자)2억 2,343만 원1,440만 원안전조치 의무, 유출 통지·신고 의무
2022-06-08(3개 사업자)3,700만 원2,140만 원안전조치 의무, 접속기록 미보관, 미이용자 정보 미파기·미분리 등

두 보도 모두 사업자별 과징금 액수는 밝히지 않았습니다. 개인정보위는 2022년 의결 때 비대면 활동이 늘면서 해킹으로 인한 유출이 계속되고 있다며, 보안 취약점을 주기적으로 확인하고 안전조치 의무를 상시 점검하라고 당부했습니다. 정보보호산업계는 웹방화벽(WAF) 운영, 서버와 웹사이트의 정기 취약점 점검, 소스코드 단계의 시큐어 코딩을 권고했습니다(정보통신신문).

이 글은 법률 자문이 아닙니다.

정리

  • 개인정보위는 2022년 6월과 2023년 12월에 웹셸로 개인정보가 유출된 사업자를 제재했습니다.
  • 스피드옥션은 업로드 확장자와 실행 권한을 제한하지 않았고, DB 접근도 IP로 막지 않았습니다.
  • 허용 목록, 웹 루트 밖 저장, 무작위 이름, 실행 권한 없음, DB 접근 제한이 같은 경로를 닫습니다.

더 깊게

  • 인프런 「백엔드 개발자를 위한 서버 보안 실무」
    • 0-4 공격자처럼 생각하기: 위협 모델링과 공격 표면 지도
    • 6-1 취약점 점검 도구 운영
    • 6-2 탐지하고 자동으로 막기: 서버와 애플리케이션 이상 징후
    • 5-4 개인정보보호법 관점의 개발: 최소 수집, 마스킹, 접속 기록
  • 중소기업편: 침해 신고 8,565건, 10건 중 8건은 중소기업: 두 번 이상 신고한 782곳(12편)

보안을 더 알고 싶다면

오늘 본 사고의 원인은 대부분 서버와 코드의 기본기에서 막을 수 있는 것들이었습니다. 직접 손으로 막아 보고 싶다면 이런 강의도 있습니다.

백엔드 개발자를 위한 서버 보안 실무: 해킹 방어부터 정보유출 방지까지

  • 서버를 공격하는 흐름을 로그로 보고, 내 서버와 Spring·Express 코드에서 직접 막아 봅니다.
  • SSH 하드닝, 인젝션, 인증·인가, 시크릿과 개인정보 보호, 침해사고 첫 한 시간까지 8개 섹션 54개 수업입니다.
  • 이 글과 이어지는 수업: 0-4 공격자처럼 생각하기: 위협 모델링과 공격 표면 지도, 6-1 취약점 점검 도구 운영, 6-2 탐지하고 자동으로 막기: 서버와 애플리케이션 이상 징후

출처와 확인 날짜

수치는 개인정보위 의결(2022년 6월 8일, 2023년 12월 13일)을 다룬 보도 기준입니다. 이 글은 법률 자문이 아닙니다.


이전 글 침해 신고 8,565건, 10건 중 8건은 중소기업: 두 번 이상 신고한 782곳
다음 글 지우지 않은 관리자 계정 하나: 발란 162만 건 유출
시리즈 전체 목록 해킹 사고 해부 전체 목록

profile
고인물 개발자(OG)

0개의 댓글