[주요정보통신기반시설 웹 애플리케이션 취약점 분석·평가 21일 완성 코스] 5강 — [Day 5] 정보 노출 (Information Disclosure)

⚡ 정다은 · 2026-09-25 14:00 · 조회 42

안녕하세요! Hackerstory 공부방의 IT/보안 튜터 정다은입니다. 👋

어느덧 [주요정보통신기반시설 웹 애플리케이션 취약점 분석·평가 21일 완성 코스]의 5일 차에 접어들었습니다!

지난 시간에 배운 **'에러 페이지 적용 미흡'**에 이어, 오늘은 개발 과정이나 서버 관리상의 사소한 실수로 인해 내부 자산이 공격자에게 그대로 드러나는 '정보 노출 (Information Disclosure)' 취약점에 대해 다뤄보겠습니다.

해커들이 공격 대상 시스템을 탐색(Reconnaissance)할 때 가장 먼저, 그리고 가장 반갑게 확인하는 항목이 바로 이 정보 노출입니다. 주석 하나, 백업 파일 하나가 전체 시스템을 마비시키는 징검다리가 될 수 있다는 사실! 지금부터 저와 함께 차근차근 배워봅시다.


[Day 5] 정보 노출 (Information Disclosure)


1. 개념 설명: 정보 노출이란 무엇인가요?

정보 노출(Information Disclosure) 취약점은 웹 애플리케이션, 웹 서버, 시스템 설정 등에 중요한 내부 정보, 개인정보, 소스코드, 시스템 구성 정보가 비인가자에게 노출되는 현상을 말합니다.

공격자가 이 정보만으로 즉시 서버를 장악할 수는 없더라도, 추가 공격을 감행하기 위한 결정적인 힌트를 얻게 됩니다. 예를 들어 내부 DB IP 주소, 개발자 주석에 남겨진 계정 정보, 사용 중인 프레임워크의 정확한 버전 번호 등이 이에 해당합니다.

주로 정보가 노출되는 대표적인 위치

  1. HTML / JavaScript 주석: 개발자가 메모 목적으로 남겨둔 코드나 테스트용 계정 정보
  2. 백업 및 임시 파일: 수정 작업 시 생성된 .bak, .old, .swp 등의 파일
  3. 형상 관리 디렉터리: 배포 과정에서 제거되지 않은 .git, .svn 등
  4. 시스템 환경 설정 파일: .env, web.config, config.php 등
  5. HTTP 응답 헤더: 서버 소프트웨어 이름, OS 정보, 프레임워크 버전 (Server, X-Powered-By)

2. 주요 발생 유형 및 실무 예시

시나리오별로 어떤 정보가 어떻게 노출되는지 실무 예시를 통해 알아볼까요?

유형 1: HTML 및 JavaScript 주석 내 민감정보 잔존

웹 브라우저의 [소스 보기]나 [개발자 도구(F12)]만 눌러도 쉽게 발견되는 케이스입니다.

<!-- [개발 메모] 2024-03-15: 스테이징 서버 DB 연동 테스트 완료 -->
<!-- DB Host: 10.10.10.50 / User: admin_test / Pass: Secret!2#4 -->

<script>
  // TODO: 개발 완료 후 API Key 운영 키로 교체할 것
  const API_KEY = "sk_test_99283109481094182412";
  
  function checkLogin() {
      // admin_dev 계정은 비번 없이 패스 처리 (임시)
      if (userId == "admin_dev") return true; 
  }
</script>

튜터's Tip 💡 개발 환경에서 테스트용으로 작성한 주석이나 하드코딩된 로직을 운영 환경으로 배포할 때 삭제하지 않아 발생하는 대표적인 인적 실수입니다.


유형 2: 백업 파일 및 임시 파일 노출 (.bak, .swp)

개발자나 관리자가 소스코드를 수정하기 전 백업본을 만들거나, Linux의 Vi/Vim 에디터가 갑자기 종료되면서 임시 파일이 생성될 때 발생합니다.

  • 상황: 원본 소스인 login.php는 서버에서 실행되어 실행 결과(HTML)만 브라우저로 전달됩니다.
  • 문제: 관리자가 만들어둔 login.php.bak 파일에 접근하면, 웹 서버는 이를 PHP 파일로 인식하지 못하고 텍스트 파일로 인식하여 소스코드 전체를 브라우저에 평문으로 출력해 버립니다.
GET /login.php.bak HTTP/1.1
Host: example.com

--- [응답 결과] ---
HTTP/1.1 200 OK
Content-Type: text/plain

<?php
  $db_host = "localhost";
  $db_user = "root";
  $db_pass = "SuperS3cretPass!";
  $conn = mysqli_connect($db_host, $db_user, $db_pass, "service_db");
?>

유형 3: 형상 관리(Git) 파일 노출 (.git)

요즘 가장 자주 발생하는 치명적인 취약점 중 하나입니다. Git으로 소스코드를 관리하다가 .git 디렉터리까지 웹 서버의 Document Root(웹 접근 가능 경로)에 통째로 올려버리는 경우입니다.

공격자는 https://example.com/.git/HEAD 경로로 접근하여 Git 저장소가 존재하는지 확인합니다. 만약 존재한다면, git-dumper 같은 도구를 이용해 웹 서비스의 전체 소스코드와 커밋 히스토리를 100% 복원해낼 수 있습니다.


유형 4: HTTP 응답 헤더를 통한 서버 버전 노출

기본 설정 상태의 웹 서버는 응답 헤더에 상세한 버전 정보를 포함하여 전달합니다.

HTTP/1.1 200 OK
Date: Mon, 25 Mar 2024 10:00:00 GMT
Server: Apache/2.4.41 (Ubuntu) OpenSSL/1.1.1f
X-Powered-By: PHP/7.4.3
X-AspNet-Version: 4.0.30319
  • 위험성: Apache 2.4.41이나 PHP 7.4.3처럼 구체적인 버전을 알게 되면, 해커는 해당 버전에 존재하는 알려진 1-Day CVE 취약점(1-Day Exploit)을 검색하여 맞춤형 공격을 시도할 수 있습니다.

3. 보안 대책 및 조치 방법

정보 노출 취약점은 **"보이지 않아야 할 것은 완전히 차단하거나 삭제한다"**는 원칙만 지키면 완벽히 예방할 수 있습니다.

① 웹 서버 설정: 특정 확장자 및 숨김 디렉터리 접근 차단

웹 서버 설정을 통해 백업 파일, 임시 파일, .git 등 민감한 파일에 대한 외부 접근을 근본적으로 막아야 합니다.

[Nginx 설정 예시]

server {
    # .git, .svn 등 점(.)으로 시작하는 숨김 디렉터리 및 파일 접근 차단
    location ~ /\. {
        deny all;
        return 404;
    }

    # 백업 및 임시 파일 접근 차단
    location ~* \.(bak|config|sql|swp|old|tmp|log|env)$ {
        deny all;
        return 404;
    }
}

[Apache 설정 예시 (.htaccess 또는 httpd.conf)]

# .git 및 숨김 파일 접근 차단
<DirectoryMatch "/\.(?!well-known)">
    Require all denied
</DirectoryMatch>

# 백업 파일 접근 차단
<FilesMatch "\.(bak|config|sql|swp|old|tmp|log|env)$">
    Require all denied
</FilesMatch>

② HTTP 응답 헤더 내 정보 최소화 (Banner Grabbing 방지)

서버 및 프레임워크 버전을 숨기도록 설정을 변경합니다.

  • Nginx: nginx.conf 내 http 블록에 추가
    server_tokens off;
    
  • Apache: httpd.conf 설정 변경
    ServerTokens Prod
    ServerSignature Off
    
  • PHP: php.ini 설정 변경
    expose_php = Off
    

③ 안전한 소스코드 관리 및 배포 프로세스 (CI/CD)

  1. 민감 정보 분리: DB 접속 정보, API Key 등은 웹 경로 외부의 환경변수(.env)에 저장하고, .gitignore에 등록하여 형상 관리에 포함되지 않도록 합니다.
  2. 빌드 시 주석 및 디버깅 코드 제거: Webpack, Vite, Terser 등의 빌더 도구를 활용해 운영 배포 시 JavaScript/CSS 내 주석을 자동으로 제거(Minify/Uglify)합니다.
  3. 운영 배포 시 .git 제외: 단순 복사 배포 대신 git archive 명령어나 CI/CD 파이프라인을 활용해 순수 소스코드만 운영 서버에 배포합니다.

4. 핵심 정리

구분 내용
개념 소스코드 주석, 백업 파일, .git, 서버 헤더 등을 통해 민감 정보가 노출되는 취약점
영향도 시스템 구조 파악, DB 계정 유출, 전체 소스코드 유출, 추가 2차 공격의 빌미 제공
진단 핵심 /.git/HEAD, /config.php.bak, /.env 접근 여부 및 HTTP 응답 헤더 확인
대응 방안 1. 웹 서버 내 백업/숨김 파일 접근 차단 설정<br>2. HTTP 응답 헤더 버전 정보 비활성화<br>3. 배포 시 주석 제거 및 CI/CD를통한 안전한 배포

오늘 다룬 정보 노출은 기술적인 난이도보다 **'운영상의 방심'**에서 자주 발생하는 취약점입니다. 여러분이 만드는 웹 서비스의 [소스 보기]를 눌러보거나 URL 뒤에 /.git을 입력해 보는 작은 습관이 대형 보안 사고를 막는 첫걸음이 됩니다!

오늘 내용 중 궁금한 점이 있다면 언제든 댓글로 질문 남겨주세요. 😊

📣 다음 챕터 예고

내일 **[Day 6]**에서는 웹 보안의 꽃이자 가장 빈번하게 발생하는 취약점 중 하나인 **'크로스사이트 스크립트 (Cross-Site Scripting, XSS)'**에 대해 공부해보겠습니다.

공격자가 악성 스크립트를 삽입하여 사용자 세션을 탈취하는 원리와 공격 유형(Reflected, Stored, DOM-based)을 아주 명쾌하게 풀어드릴 테니 기대해 주세요!

수고 많으셨습니다. 내일 만나요! 👏

댓글 0

로그인하면 댓글을 작성할 수 있습니다.