웹 취약점 2026.09.26 · 조회 8

backup.sql 한 파일로 고객 DB가 통째로 빠져나간다: 웹루트 백업 파일 점검법 [2026]

배포하다 만든 backup.sql, 급할 때 복사해둔 db.sqlite3, 확인용으로 올린 users.csv. 공격 기법은 필요 없다. 주소를 아는 사람이 그냥 받아가면 끝이다. 웹루트에 남은 백업·덤프 파일의 노출 경로와 제거·차단 설정, 유출 시 72시간 신고 기준을 정리했다.

S
보안 전문 기업 SENTRIX 레드팀
해킹대회 수상 · 보안 실무 10년 · 실전 진단 경험을 바탕으로 작성합니다.
읽기만 하지 말고 내 사이트 상태부터 확인해보세요. URL 하나로 30초 무료 점검.

웹루트 백업 파일 노출은 DB 덤프·압축 백업·고객 목록처럼 배포나 이전 작업 중에 만든 사본이 웹 루트에 남아, 주소만 알면 누구나 그대로 다운로드할 수 있는 상태를 말한다.
취약점을 파고드는 공격이 아니라 내가 올려둔 파일을 가져가는 일이다. 요청 한 번에 테이블 전체가 넘어가고, 흔적은 접근 로그의 200 응답 한 줄뿐이다.
이 글은 자주 발생하는 실수 패턴, 표준 구현 코드, 30초 자가진단, 24시간 패치 순서를 정리했다.

한눈에 보는 핵심

Q. 아무 데도 링크하지 않은 파일을 어떻게 찾나요? A. 자동화 도구가 /backup.sql, /db.sqlite3, /users.csv 같은 고정 파일명 목록을 그대로 요청합니다. 파일명이 도구 기본값이거나 관행이라 추측할 필요가 없습니다. CWE-530도 확장자만 바꿔 남긴 사본이 자주 회수된다고 기술합니다. Q. 로그인이 필요한 사이트인데도 위험한가요? A. 백업 파일은 애플리케이션을 거치지 않습니다. 웹서버가 정적 파일로 바로 내려주므로 세션·권한 검사와 무관하게 다운로드됩니다. 파일 존재 여부와 웹서버 설정이 유일한 방어선입니다. Q. 삭제하면 끝나나요? A. 삭제는 출혈을 멈추는 조치일 뿐입니다. 이미 받아갔다고 가정하고 덤프에 있던 DB 비밀번호·API 키·토큰을 전량 교체해야 하며, 개인정보가 포함되면 개인정보보호법의 72시간 통지·신고 판단이 따라옵니다.

자주 발생하는 실수 패턴

#패턴위험도
1배포·마이그레이션 중 만든 backup.sql·dump.sql을 웹루트에 방치치명
2SQLite 파일(db.sqlite3·database.db)이 웹 공개 경로에 위치 — 자가진단으로 직접 확인치명
3편집 전 사본(wp-config.php.bak·config.json.bak) — 소스 평문 노출치명
4확인용 명단(users.csv·customers.xlsx)을 업로드 폴더 방치 — 자가진단으로 직접 확인치명
5/uploads/·/backup/ 리스팅 활성 — 파일명 몰라도 목록 열람높음
6배포 산출물에 .git 동봉 — 커밋 이력째로 소스·시크릿 복원치명

표준 구현 코드

# nginx — 웹루트 백업 잔여물 차단.
# 아래는 완전한 설정이 아니라 기존 server 블록에 추가하는 발췌다.
# listen·root·location / 등 기본 지시자는 원래 블록의 값을 그대로 둔다.
# 사본을 웹루트에서 없애는 것이 1순위이고, 이 규칙은 사본이 남았을 때를 위한 2차 방어다.
server {
    server_name example.com;
    # (listen / root / location / ... 기존 설정 유지)

    # 1) 백업·덤프·DB 확장자 직접 접근 차단
    #    주의: .gz/.zip을 정적으로 서비스하는 사이트(app.js.gz 사전압축, 배포용 zip 다운로드)는
    #    해당 확장자를 목록에서 빼거나 location ^~ /backup/ 처럼 경로로 한정하라.
    location ~* \.(sql|sqlite|sqlite3|db|bak|old|save|orig|swp|dump|tar|gz|tgz|zip|7z|rar)$ {
        return 404;
    }

    # 2) 편집기가 남기는 물결표 파일 (config.php~)
    location ~ ~$ { return 404; }

    # 3) .git 노출은 소스 전체 복원으로 이어진다
    location ~ /\.(git|svn|hg|env) { return 404; }

    # 4) 목록 노출 금지 (nginx 기본값 off, Apache는 -Indexes)
    autoindex off;
}
# 근본 대책은 배포 산출물에 사본을 만들지 않는 것이고, 웹서버 차단 규칙은 보조 수단이다.

핵심은 "동작하는 코드"와 "안전한 코드"가 다르다는 점이다.
AI 코딩 도구는 기능 충족 코드를 우선 출력하므로 보안 분기는 별도로 강제해야 한다.
미들웨어·정책·CI 게이트로 모든 경로에 일괄 적용하는 것이 표준이다.

지금 1분만 — CodeScan 무료 스캔으로 내 서비스의 노출 패턴을 자동 점검하세요.

30초 자가진단

# [범위] 무료 스캔이 자동으로 보는 것은 대표 백업/덤프 고정 파일명(.sql·.zip·.tar.gz·.bak 계열),
# 디렉토리 리스팅, .git 노출까지다. SQLite DB 파일(db.sqlite3·database.db)과
# CSV/XLSX 명단, config.json.bak은 자동 점검 범위가 아니므로 아래 명령으로 직접 확인해야 한다.
H=https://example.com

# 1) 흔한 백업·DB·명단 파일이 200으로 내려오는가 (-r 0-0 = 첫 바이트만 요청, 대용량 전송 방지)
for p in backup.sql dump.sql db.sql db.sqlite3 database.db \
         backup.zip backup.tar.gz backup.bak users.csv \
         wp-config.php.bak config.json.bak .env.bak; do
  c=$(curl -s -o /dev/null -r 0-0 --max-time 15 -w '%{http_code}' "$H/$p")
  case "$c" in 200|206) echo "HIT -> /$p ($c)";; esac
done

# 2) 진짜 파일인지 확인 (soft 404는 <html, SQLite는 'SQLite format 3')
curl -s --max-time 15 -r 0-159 "$H/backup.sql" | head -c 160

# 3) 디렉토리 목록이 열려 있는가
for d in uploads files backup backups data db; do
  curl -s --max-time 15 "$H/$d/" | grep -qi 'index of' && echo "LISTING -> /$d/"
done

# 4) .git 노출 ('ref:'로 시작하면 저장소 전체 복원 가능)
curl -s --max-time 15 "$H/.git/HEAD" | head -c 40

위 시그널이 발견되면 결함이다. MITRE CWE-530 — 백업 파일의 무단 노출를 함께 참조하라.

24시간 패치 절차

순위조치
1200이 확인된 파일을 웹루트에서 삭제 — 백업은 웹에서 닿지 않는 경로로 이동
2백업·DB 확장자와 /.git·/.env 경로를 웹서버에서 404로 닫고 autoindex off 적용 (정적 .gz/.zip 제공 사이트는 경로 한정)
3덤프·설정 백업에 있던 DB 비밀번호·API 키·토큰 전량 교체 — 이미 수집됐다고 가정
4접근 로그에서 해당 경로의 200 응답과 요청 IP를 추출해 시점 확인
5개인정보 포함 파일이 내려갔으면 개인정보보호법 제34조에 따라 72시간 내 통지·신고 판단
6배포 스크립트가 사본을 웹루트에 만들지 않게 산출물 목록을 고정 — 재발 차단의 본선

지금 해야 할 것

실무자: CodeScan 무료 스캔으로 30초 점검 후 우선순위대로 패치.
CISO·임원: 조직 전체 점검·규제 대응은 SENTRIX 30분 1:1 상담으로.
결함은 발견 즉시, 늦어도 24시간 안에 패치하는 것이 표준이다.

관련 글

{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"아무 데도 링크하지 않은 파일을 어떻게 찾나요?","acceptedAnswer":{"@type":"Answer","text":"자동화 도구가 /backup.sql, /db.sqlite3, /users.csv 같은 고정 파일명 목록을 그대로 요청합니다. 파일명이 도구 기본값이거나 관행이라 추측할 필요가 없습니다. CWE-530도 확장자만 바꿔 남긴 사본이 자주 회수된다고 기술합니다."}},{"@type":"Question","name":"로그인이 필요한 사이트인데도 위험한가요?","acceptedAnswer":{"@type":"Answer","text":"백업 파일은 애플리케이션을 거치지 않습니다. 웹서버가 정적 파일로 바로 내려주므로 세션·권한 검사와 무관하게 다운로드됩니다. 파일 존재 여부와 웹서버 설정이 유일한 방어선입니다."}},{"@type":"Question","name":"삭제하면 끝나나요?","acceptedAnswer":{"@type":"Answer","text":"삭제는 출혈을 멈추는 조치일 뿐입니다. 이미 받아갔다고 가정하고 덤프에 있던 DB 비밀번호·API 키·토큰을 전량 교체해야 하며, 개인정보가 포함되면 개인정보보호법의 72시간 통지·신고 판단이 따라옵니다."}}]}

내 사이트도 점검해보세요

URL 입력, 결과 링크는 메일로 받는 무료 점검. 회원가입·카드 불필요.

추천 상품
웹서비스 런칭 전 보안 세팅
런칭 전에 반드시 해야 하는 보안 설정을 원격으로 직접 해드립니다. HTTPS, 환경변수 분리, 보안 헤더…
220,000원 150,000원

AI 코딩 보안 체크리스트 받기

AI 코딩 보안 체크리스트(PDF)를 무료로 받아보세요.

한 번 점검으로 끝내지 않으려면: 웹 모니터링(월 29,900원)이 매일 자동 점검하고 등급이 떨어지면 알려드립니다.
이런 글을 계속 받아보려면 뉴스레터 구독 · RSS 피드