📄 2026.01.13 (Day 54) - 웹 취약점 진단 실습
1. 핵심 개념 정리
웹 취약점 진단 방법론
| # | 핵심 개념 | 설명 | 실무/보안 관점 |
|---|---|---|---|
| 1 | 정보 수집 | 대상 시스템의 URL, 파라미터, 기능 파악 | 공격 표면 분석의 시작점 |
| 2 | 취약점 점검 항목 | 주요정보통신기반시설 기술적 취약점 가이드 28개 항목 | ISMS-P 인증 시 참조하는 표준 체크리스트 |
| 3 | 모의해킹 시나리오 | 발견된 기능에 대한 공격 시나리오 도출 | 단순 스캔이 아닌 실제 공격 경로 분석 |
| 4 | 점검 도구 활용 | Burp Suite, DirBuster 등 전문 도구 사용 | 수동 점검과 자동화 도구 병행 |
| 5 | 결과 보고서 작성 | 취약점 상세 내역 및 개선방안 문서화 | 컨설팅 산출물의 핵심 |
SQL Injection 취약점
| # | 핵심 개념 | 설명 | 실무/보안 관점 |
|---|---|---|---|
| 6 | 동적 쿼리 위험 | 사용자 입력값을 직접 쿼리에 결합하여 실행 | 쿼리 변조 위험 존재 |
| 7 | Blind SQL Injection | TRUE/FALSE 응답 차이로 정보 추출 | 에러 메시지 없이도 공격 가능 |
| 8 | Prepared Statement | 쿼리와 데이터를 분리하여 처리 | 근본적인 방어 대책 |
| 9 | 입력값 검증 | 특수문자 필터링 및 화이트리스트 검증 | 추가적인 방어 레이어 |
| 10 | DB 권한 최소화 | 애플리케이션 계정의 DB 권한 제한 | 공격 성공 시 피해 최소화 |
파일 다운로드 취약점
| # | 핵심 개념 | 설명 | 실무/보안 관점 |
|---|---|---|---|
| 11 | 경로 조작 (Path Traversal) | ../를 이용한 상위 디렉토리 접근 | 서버 내부 파일 노출 위험 |
| 12 | 화이트리스트 검증 | 허용된 파일만 다운로드 가능하도록 제한 | 파일명 검증 필수 |
| 13 | 절대 경로 사용 | 사용자 입력값을 경로에 직접 사용 금지 | 안전한 파일 접근 방식 |
| 14 | 민감 파일 노출 | 설정 파일, 소스코드 등 유출 가능 | 2차 공격의 발판 |
| 15 | 접근 권한 검증 | 파일 다운로드 전 권한 확인 | 인가된 사용자만 접근 |
Vim Swap File 취약점
| # | 핵심 개념 | 설명 | 실무/보안 관점 |
|---|---|---|---|
| 16 | .swp 파일 노출 | Vim 에디터의 임시 파일이 웹 루트에 남음 | 소스코드 전체 유출 가능 |
| 17 | 백업 파일 노출 | .bak, .old, .tmp 등 임시 파일 | 개발 과정의 민감 정보 포함 |
| 18 | .git 디렉토리 노출 | Git 저장소가 배포 환경에 포함됨 | 전체 소스코드 이력 유출 |
| 19 | 배포 전 정리 | 임시 파일 및 개발 도구 파일 제거 | CI/CD 파이프라인에 점검 추가 |
| 20 | 디렉토리 인덱싱 차단 | 웹 서버 설정에서 인덱싱 비활성화 | 파일 목록 노출 방지 |
2. 실습 내용 정리
실습 1: SQL Injection 취약점 진단
목표: Blind SQL Injection을 통한 데이터베이스 정보 추출
실습 환경:
- 대상: /challenges/sql200/index.php
- 도구: Burp Suite, Python 스크립트
- 취약 파라미터: no (메모 번호)
SQL Injection 가능 여부 확인:
TRUE 쿼리 요청: ?no=1 and 1=1 -> 정상 메모 내용 출력
FALSE 쿼리 요청: ?no=1 and 1=2 -> 메모 내용 미출력 (다른 응답)
결과: TRUE/FALSE에 따라 응답이 달라짐 -> Blind SQL Injection 가능
Blind SQL Injection 자동화 스크립트 구조:
- requests 라이브러리를 사용하여 Python 스크립트 작성
- 1단계:
length(flag)=N페이로드로 플래그 문자열 길이 확인 (1~50 순차 탐색) - 2단계:
substr(flag,position,1)='c'페이로드로 문자 하나씩 추출- 알파벳 소문자 a-z, 숫자 0-9, 특수문자
_{}순서로 비교
- 알파벳 소문자 a-z, 숫자 0-9, 특수문자
- 3단계: TRUE 응답 패턴 확인 시 해당 문자를 플래그에 누적
- 최종 플래그:
this_is_flag
분석 포인트:
- 파라미터에 SQL 구문 삽입 시 응답 변화 확인
- TRUE/FALSE 조건에 따른 응답 차이 식별
- 에러 메시지 노출 여부 확인
- Blind 방식으로 데이터 추출 가능성 검증
보안 인사이트:
- 동적 쿼리 방식은 쿼리 변조 위험 존재
- 에러 메시지가 없어도 Blind 방식으로 정보 추출 가능
- 단순 필터링이 아닌 Prepared Statement 사용 필수
- DB 계정의 권한을 최소화하여 피해 범위 제한
안전한 코드 (Prepared Statement):
- 취약한 코드:
$query = "SELECT * FROM memos WHERE no = $no"(동적 쿼리 직접 결합) - 안전한 코드:
$stmt = $pdo->prepare("SELECT * FROM memos WHERE no = ?")후$stmt->execute([$no])
실습 2: 파일 다운로드 취약점 진단
목표: 경로 조작을 통한 서버 내부 파일 다운로드
실습 환경:
- 대상: /challenges/down1/
- 취약 기능: 파일 다운로드 (down.cgi)
- 취약 파라미터: file
실습 단계:
-
정상 요청 확인:
/challenges/down1/?file=document.txt-> document.txt 다운로드 성공 -
경로 조작 시도:
/challenges/down1/?file=../down-> down.cgi 파일 다운로드 성공- 파일 내용: Perl CGI 스크립트, conf1g.cgi를 require하는 구조 확인
-
설정 파일 다운로드:
/challenges/down1/?file=../conf1g-> conf1g.cgi 다운로드 성공- 내용 확인:
$db_password = "admin1234!@#$",$api_key = "sk-1234567890abcdef"등 민감 정보
- 내용 확인:
-
추가 파일 탐색:
/challenges/down1/?file=../../etc/passwd-> 시스템 파일 접근 가능성 확인
발견된 취약점:
-
경로 조작 문자열 필터링 미흡
- ../ 구문이 제한 없이 처리됨
- 상위 디렉토리로 이동 가능
-
파일명 화이트리스트 미적용
- 허용된 파일 목록이 정의되지 않음
- 임의의 파일 요청 가능
-
민감 정보 하드코딩
- 설정 파일에 DB 패스워드, API 키 등 평문 저장
- 소스코드 유출 시 2차 피해 발생
탐지 패턴 및 방어 방법:
탐지 패턴:
- ../ 를 포함한 파일 요청
- 설정 파일(.conf, .config, .cgi) 접근 시도
- 시스템 파일(/etc/passwd 등) 다운로드 시도
방어 방법:
- 파일명 화이트리스트 적용
- 절대 경로 사용 및 경로 정규화 (realpath 함수 사용)
- 사용자 입력값을 경로에 직접 사용 금지
- 민감 정보는 환경 변수 또는 별도 관리
안전한 파일 다운로드 구현:
- 화이트리스트로 허용 파일 목록 정의 후 in_array() 로 검증
- base_dir를 realpath()로 절대 경로화 후 요청 경로와 비교
- strpos($file_path, $base_dir) !== 0 이면 Path traversal로 거부
실습 3: Vim Swap File 취약점 진단
목표: .swp 파일을 통한 소스코드 복원 및 정보 추출
실습 환경:
- 힌트: vim, black out (read_me 문제의 주석에서 발견)
- 대상 파일: .index.php.swp
실습 단계:
-
힌트 분석: read_me 문제 풀이 시 발견한 주석
<!-- vim editor used --><!-- black out... -->- 추론: Vim 에디터로 작업 중 비정상 종료되어 .swp 파일이 남았을 가능성
-
.swp 파일 경로 유추: Vim swap 파일 명명 규칙 =
.{원본파일명}.swp- 대상 파일이 index.php라면:
.index.php.swp
- 대상 파일이 index.php라면:
-
.swp 파일 다운로드:
http://target/.index.php.swp-> 파일 다운로드 성공 -
.swp 파일 분석
- 방법 1: strings 명령어로 내용 확인 (flag, password, key 키워드 grep)
- 방법 2:
vim -r .index.php.swp로 복구 모드 사용 -> 원본 소스코드 복원
-
복원된 index.php 내용:
- PHP 코드에
$flag = "this_is_secret_flag"하드코딩 - password 파라미터로 비교하는 인증 로직 발견
- -> 플래그 획득 또는 password 파라미터로 인증 우회
- PHP 코드에
.swp 파일 상세 분석:
보안 위험:
- 소스코드 전체 노출: 개발 중인 코드의 로직 및 알고리즘 유출, 주석에 남긴 TODO/디버그 정보 포함
- 하드코딩된 민감 정보: 데이터베이스 접속 정보, API 키/비밀 키, 테스트용 계정 정보
- 개발 환경 정보 노출: 사용한 에디터, 프레임워크, 파일 경로 및 디렉토리 구조
개선 방안:
배포 전 체크리스트:
- .swp, .bak 파일 재귀 탐색 후 삭제
- .git 디렉토리 웹 루트에서 제거
웹 서버 설정으로 접근 차단:
- Apache:
<FilesMatch "^\.|~$"> Require all denied </FilesMatch> - Nginx:
location ~ /\. { deny all; }
CI/CD 파이프라인에 임시 파일 존재 여부 점검 스크립트 추가
실습 4: CTF 추가 문제 풀이
Guessing II (100 Point):
- 페이지 소스 분석 -> Sources 탭에서 JavaScript 파일 내 정답 확인
- 정답 직접 입력 또는 Console에서 검증 함수 우회 -> 플래그 획득
Proxy (100 Point):
- Burp Suite Proxy > Intercept 활성화
- 요청 가로채기 후 원본 파라미터 또는 헤더 변조
- 변조된 요청 전송 후 플래그 확인
3. 웹 취약점 진단 vs 모의해킹 비교
점검 방식별 특징
| 항목 | 취약점 진단 | 모의해킹 | 실무 적용 | SOC 관점 |
|---|---|---|---|---|
| 목적 | 체크리스트 기반 취약점 발견 | 실제 공격 시나리오 수행 | ISMS-P는 진단 중심, PCI-DSS는 모의해킹 포함 | 진단 결과는 탐지 룰 작성 기반 |
| 범위 | 28개 표준 점검 항목 | 제한 없는 공격 경로 탐색 | 진단은 전수 조사, 모의해킹은 샘플링 | 진단 항목은 로그 모니터링 대상 |
| 도구 | Burp Suite, DirBuster | Metasploit, 커스텀 익스플로잇 | 도구 + 수동 점검 병행 | 도구 시그니처 기반 탐지 가능 |
| 결과 | 취약점 목록 및 개선방안 | 공격 성공 여부 및 침투 경로 | 컴플라이언스는 진단 중심 | 공격 시나리오는 SIEM 룰셋 생성 |
4. 실무/보안 적용
SOC 분석가 관점 - 웹 공격 탐지 포인트
| 단계/유형 | 탐지 포인트 | 로그 예시 | 대응 방안 |
|---|---|---|---|
| SQL Injection | SQL 구문 포함 파라미터, 반복적인 TRUE/FALSE 패턴 | GET /board?no=1 and 1=1 | WAF 룰 적용, 비정상 쿼리 패턴 탐지, DB 접근 로그 분석 |
| Path Traversal | ../ 포함 파일 요청, /etc/passwd 등 시스템 파일 | GET /download?file=../../../etc/passwd | 경로 조작 문자열 차단, 파일 접근 로그 모니터링 |
| 정보 노출 | .swp, .bak 파일 요청, .git 디렉토리 접근 | GET /.index.php.swp | 임시 파일 접근 차단, 민감 파일 패턴 알림 |
5. 배운 점 및 인사이트
새로 알게 된 점
- Blind SQL Injection 원리: 에러 메시지 없이도 TRUE/FALSE 응답 차이로 데이터 추출 가능
- .swp 파일의 위험성: Vim 에디터의 임시 파일이 전체 소스코드를 포함하고 있음
- 경로 조작 공격: ../를 이용해 서버 내부 파일에 접근 가능하며 민감 정보 유출 위험
- 취약점 진단 방법론: 단순 도구 스캔이 아닌 기능 분석 -> 시나리오 도출 -> 수동 점검 프로세스
- CTF와 실무의 연결: CTF 문제가 실제 취약점을 단순화한 형태이며 동일한 원리 적용
이전 학습과의 연결고리
- ISMS 컨설팅 (Day 51)과 연계: 취약점 진단 결과가 ISMS-P 인증의 보호대책 이행으로 연결
- DNA Lab 프로젝트: 자동화 취약점 스캐너가 오늘 실습한 항목들을 점검하는 것
- Burp Suite 실습 확장: 이론으로 배운 도구를 실제 취약점 발견에 활용
실무 적용 아이디어
SOC 분석가 관점:
- SQL Injection 탐지 룰 작성: 파라미터에 SQL 구문 포함 여부 확인
- Path Traversal 패턴 모니터링: ../를 포함한 파일 요청 로그 분석
- .swp, .bak 파일 접근 알림: 임시 파일 다운로드 시도 즉시 탐지
보안 컨설턴트 준비:
- 취약점 진단 보고서 작성 연습: 오늘 실습 내용을 보고서 형식으로 정리
- 개선방안 도출 능력: 단순 지적이 아닌 구체적인 코드 레벨 개선안 제시
6. Quick Reference
웹 취약점 진단 Top 5 점검 항목
-
SQL Injection
- 동적 쿼리 사용 여부, Prepared Statement 적용 여부
-
파일 다운로드
- 경로 조작 문자열 필터링, 화이트리스트 검증
-
임시 파일 노출
- .swp, .bak, .git 파일 존재 여부, 디렉토리 인덱싱 활성화 여부
-
XSS (Cross-Site Scripting)
- 사용자 입력값 출력 시 인코딩, Content-Security-Policy 헤더
-
CSRF (Cross-Site Request Forgery)
- CSRF 토큰 검증, SameSite 쿠키 속성
Burp Suite 주요 기능
- Proxy 탭: 요청/응답 가로채기 및 수정 (Intercept on/off)
- Repeater 탭: 동일 요청 반복 전송, 파라미터 변조 테스트
- Intruder 탭: 자동화 공격 (Fuzzing), Payload 리스트 설정
- Scanner 탭 (Pro 버전): 자동 취약점 스캔, 수동 점검 보조
취약점 진단 보고서 구조
- 개요: 점검 목적, 점검 대상, 점검 기간
- 점검 방법론: 점검 기준 (28개 항목), 점검 도구, 수행 절차
- 점검 결과 요약: 취약점 개수 (상/중/하), 주요 발견 사항
- 취약점 상세 내역: 취약점명, 위험도, 현황 (스크린샷), 개선방안 (코드 예시)
- 결론 및 권고사항
7. 트러블슈팅
| 문제 | 원인 | 해결 방법 |
|---|---|---|
| Blind SQL Injection 스크립트가 너무 느림 | 문자 하나씩 확인하는 방식 | 이진 탐색으로 최적화, 멀티스레딩 적용, 응답 시간 기반 방식 고려 |
| .swp 파일을 Vim으로 복구할 수 없음 | 파일 손상 또는 버전 불일치 | strings 명령어로 내용 확인, hexdump로 바이너리 분석 |
| 경로 조작이 필터링됨 | ../ 문자열 차단 | URL 인코딩 시도 (%2e%2e%2f), 이중 인코딩, 절대 경로 사용 |
| Burp Suite가 HTTPS 트래픽을 가로채지 못함 | 인증서 신뢰 문제 | Burp CA 인증서를 브라우저에 설치, Proxy 설정 확인 (127.0.0.1:8080) |
Today’s Insight:
오늘은 웹 취약점 진단 실습을 통해 공격자 시점에서 웹 애플리케이션을 분석하는 방법을 체득했다. SQL Injection은 Blind 방식으로 TRUE/FALSE 응답 차이를 이용해 데이터를 추출하는 원리를 직접 스크립트로 구현하면서 이해했다. 파일 다운로드 취약점에서는 ../를 이용한 경로 조작으로 설정 파일(conf1g.cgi)에서 DB 패스워드와 API 키를 획득했다. 특히 .swp 파일 취약점은 read_me 문제의 vim, black out 힌트에서 시작해 실제 소스코드 전체를 복원하는 과정이 인상적이었다. 개발자가 남긴 작은 흔적이 어떻게 심각한 정보 유출로 이어지는지 직접 경험했다.