📄 2025.12.30 (Day 45) - 웹 취약점 자동 진단 도구 개발과 DNA Lab 프로젝트 기획
1. 프로젝트 개요
진단 도구 개발
| # | 핵심 요소 | 내용 | 비고 |
|---|---|---|---|
| 1 | 프로젝트명 | 웹 취약점 자동 진단 스크립트 | 12개 취약점 탐지 |
| 2 | 개발 언어 | Python 3.x | requests, beautifulsoup4 사용 |
| 3 | 구조 | 모듈화된 독립 스캐너 | API 방식 통일 인터페이스 |
| 4 | 타겟 | Java Spring Boot 웹앱 | Thymeleaf 템플릿 사용 |
| 5 | 결과물 | 텍스트 리포트 자동 생성 | 취약점별 대응방안 포함 |
진단 항목 (12개)
| # | 취약점 | 비고 |
|---|---|---|
| 1 | XSS (Cross-Site Scripting) | Stored, Reflected |
| 2 | SQL Injection | 로그인, 검색, URL 파라미터 |
| 3 | 코드 인젝션 | Thymeleaf ${} 패턴 스캔 |
| 4 | CSRF | 토큰 미검증 확인 |
| 5 | 약한 비밀번호 정책 | 복잡도, Brute Force 방어 |
| 6 | 불충분한 인증 | SQL Injection 우회 |
| 7 | 취약한 비밀번호 복구 | 보안 질문, 토큰 검증 |
| 8 | 불충분한 세션 관리 | 로그아웃 후 세션, 쿠키 플래그 |
| 9 | 쿠키 변조 | 서명 없는 쿠키, 평문 정보 |
| 10 | 파일 업로드 취약점 | 악성 확장자, MIME 검증 |
| 11 | 권한 검증 미흡 | 수평/수직 권한 상승, IDOR |
| 12 | 경로 조작 (Path Traversal) | 파일 다운로드 경로 검증 |
2. 개발 과정 및 트러블슈팅
트러블슈팅 1: XSS 탐지 실패
문제:
- 스캐너 실행 시 XSS 취약점을 탐지하지 못함
- 브라우저에서는 alert 창이 뜸 (취약함)
원인 분석:
- 작은따옴표(
') 포함 페이로드가 SQL 에러 발생 - 글 작성 실패로 DB에 저장 안됨
- 응답에 페이로드 없어서 “안전” 판정
해결 과정:
- 기존 페이로드 (실패):
<script>alert('XSS')</script>- SQL 에러 발생 - 수정 페이로드 (성공):
<img src=x onerror=alert(1)>- 작은따옴표 제거
추가 발견:
- 제목은 이스케이프됨 (
<변환) - 내용은 취약 (태그 그대로 렌더링)
- 게시글 작성 후 목록/상세 페이지 모두 확인 필요
배운 점:
- 실제 웹앱 구조 파악 중요 (어디서 실행되는지)
- 다양한 페이로드 준비 필요
- 다단계 검증 (작성 -> 조회) 구현
트러블슈팅 2: 폴더 다운로드 불가
문제: Claude가 생성한 폴더를 다운로드할 수 없음
해결 방법:
- ZIP 파일로 압축 후 다운로드 가능
zip -r vulnerability_scanner.zip vulnerability_scanner/- 이후 모든 결과물을 ZIP으로 제공 -> 파일 하나씩 복사하는 시간 절약
트러블슈팅 3: 백신 오탐 (False Positive)
문제: 다운로드한 ZIP이 “바이러스 발견"으로 차단됨
원인: file_upload_scanner.py 내부에 PHP 웹셸 문자열 패턴이 백신에 의해 실제 악성코드로 인식됨
해결: 실제 공격 페이로드 대신 테스트용 문자열(malicious_test_content)로 변경
배운 점:
- 보안 도구 개발 시 페이로드 처리 주의
- Base64 인코딩 등 우회 방법 고려
- 실제 배포 시 문서화 필요
3. 팀 프로젝트 기획 과정
고민 1: 주제 선정 (인트라넷 -> DNA 검사)
초기 계획:
- 사내 인트라넷 시스템
- 게시판, 임직원 검색 등
변경 이유: 3명 주제 겹침, 차별화 필요
후보 주제 검토:
| 주제 | 최신 이슈 | 구현 난이도 | 차별성 | 결정 |
|---|---|---|---|---|
| 온라인 헬스케어 | ⭐⭐⭐ (서울아산병원 유출) | 중 | 보통 | ❌ 겹침 |
| AI 챗봇 서비스 | ⭐⭐⭐ (Prompt Injection) | 중 | 높음 | 고려 |
| 암호화폐 지갑 | ⭐⭐ (거래소 해킹) | 중 | 높음 | 고려 |
| DNA 검사 서비스 | ⭐⭐⭐ (23andMe 유출) | 중 | 매우 높음 | ✅ 선택 |
최종 선택: DNA 검사 서비스
- 2023년 23andMe 690만 명 유출 사건 연계 (초대형 이슈)
- 유전정보 = 절대 변경 불가 (비밀번호보다 심각)
- 독특하고 다른 팀과 겹치지 않음
고민 2: 기존 페이지 구조 재활용
문제: 프론트엔드 전부 새로 만들면 시간 부족
해결 전략 - 기존 구조 -> DNA 검사 서비스 매핑:
- board/write -> DNA 검사 신청
- “제목” -> “신청자 이름”
- “내용” -> “검사 목적”
- “첨부파일” -> “신분증 사본”
- board/list -> 검사 신청 내역
- board/view -> 신청 상세 및 진행 상황
- libs/ -> 검사 결과 다운로드 (PDF 리포트)
- employee/search -> DNA 매칭 (가족 찾기)
- user/mypage -> 개인정보 및 가족 관계 관리
핵심 포인트: URL 경로 유지 -> 스캐너 수정 불필요, HTML 내용만 변경 (라벨, 플레이스홀더), 백엔드 로직 그대로 사용 가능
예시: name="title" 속성은 유지하고 화면 라벨만 “제목” -> “신청자 이름"으로 변경 -> 백엔드/스캐너 안 망가짐
4. 핵심 설계 결정사항
스캐너 구조 설계
통일된 인터페이스:
- 함수명:
scan(target_url, login_info=None) - 반환값 구조:
- name: 취약점명
- vulnerable: True 또는 False
- details: 구체적 내용 리스트
- recommendation: 대응방안 문자열
장점:
- 독립적 실행 가능 (Standalone)
- 쉬운 확장 (새 스캐너 추가)
- 일관된 리포트 생성
디렉토리 구조:
vulnerability_scanner/
├── main.py # 12개 스캐너 순차 실행
├── config.json # 타겟 URL, 로그인 정보
├── scanners/
│ ├── xss_scanner.py
│ ├── sqli_scanner.py
│ └── ... (총 12개)
└── reports/ # 결과 텍스트 파일
범용성 vs 정확성 트레이드오프
범용적 설계 선택 - 하드코딩된 일반적 경로 사용:
- 테스트 엔드포인트: /board/write, /employee/search, /admin/system 등
장점:
- 다양한 사이트에 적용 가능
- 최소 수정으로 사용
단점:
- 특정 사이트 맞춤형보다 정확도 낮음
- 커스텀 URL은 탐지 못함
보완 방법: config.json에 경로 리스트 추가 가능, 팀원이 실제 URL 알려주면 수정
5. 주요 기술 결정
Black Box vs White Box 테스팅
| 구분 | Black Box | White Box |
|---|---|---|
| 방식 | HTTP 요청/응답으로 외부 테스트 | 소스코드 정적 분석 |
| 장점 | 실제 해커 관점, 프레임워크 무관 | 정확한 취약점 위치 파악 |
| 단점 | 오탐/미탐 가능성 | 소스코드 접근 필요 |
| 적용 | XSS, SQLi, CSRF 등 11개 | 코드 인젝션 1개 (Thymeleaf) |
혼합 전략: 대부분 Black Box (범용성), 코드 스캔만 White Box (정확성)
페이로드 선정 기준
SQL Injection 페이로드:
admin'#- 주석 처리admin' OR '1'='1- 항상 참admin'--- 주석
XSS 페이로드:
<img src=x onerror=alert(1)>- 작은따옴표 없음 (권장)<svg onload=alert(1)><iframe src=javascript:alert(1)>
선정 이유:
- 실제 공격에서 자주 사용
- 간단하면서 효과적
- SQL 에러 회피 (작은따옴표 최소화)
6. 배운 점 및 인사이트
기술적 배움
- requests.Session()의 중요성: 로그인 상태 유지하며 여러 요청 가능
- 응답 분석 노하우: HTTP 코드만으로 부족, HTML 내용 직접 확인 필수
- Thymeleaf 보안:
${}vs#{}차이, 자동 이스케이프 동작 이해 - 파일 시스템 탐색:
os.walk()로 재귀적 파일 검색 - 정규표현식 활용: 코드 패턴 매칭으로 정적 분석
프로젝트 관리 배움
- 주제 선정의 중요성: 차별화 + 최신 이슈 = 고득점 전략
- 기존 코드 재활용: 완전히 새로 만들기보다 리팩토링이 효율적
- 인터페이스 통일: 협업 시 일관된 구조가 핵심
- 문서화 자동화: 수동 리포트 작성은 비효율, 자동 생성 필수
보안 관점 인사이트
- 입력 vs 출력 검증: 입력 필터링만으론 부족, 출력 시 이스케이프 필수
- 다층 방어: 한 가지 방어책만으론 부족, 여러 레이어 필요
- 실제 사고 사례 중요성: 23andMe 같은 사건이 프로젝트 가치 상승
- 취약점 연쇄: SQL Injection -> 인증 우회 -> 권한 상승 연결
7. 남은 작업 및 계획
즉시 필요한 작업
- 팀원에게 실제 페이지 URL 목록 받기
- 각 스캐너의 엔드포인트 리스트 업데이트
- 코드 스캔 경로 설정
- 프론트엔드 HTML 수정 (인트라넷 -> DNA 검사)
- 실제 사이트에서 스캐너 테스트 실행
추가 개선 사항
- 로그인 실패 시 재시도 로직
- 타임아웃 설정 조정
- HTML 리포트 추가 (현재 텍스트만)
- 오탐 줄이기 위한 검증 로직 강화
- 페이로드 추가 (더 다양한 공격 패턴)
발표 준비
- 23andMe 사건 자료 정리 (690만 명 유출, 2023.10)
- 실제 진단 결과 스크린샷
- Before/After 비교 (취약 -> 안전)
- 대응방안 구체화
- 데모 시나리오 작성
8. Quick Reference
스캐너 실행 명령어
- 기본 실행:
cd vulnerability_scanner && python main.py - 필수 라이브러리 설치:
pip install requests beautifulsoup4 - 설정 파일 수정:
vi config.json - 결과 확인:
cat reports/scan_report_YYYYMMDD_HHMMSS.txt
트러블슈팅 체크리스트
스캐너가 안 돌아갈 때:
- 타겟 웹앱이 실행 중인가? (localhost:8080)
- config.json의 URL이 맞는가?
- 로그인 정보가 정확한가?
- 방화벽/백신이 차단하는가?
취약점이 안 잡힐 때:
- 실제로 취약한가? (브라우저에서 수동 확인)
- 로그인이 필요한 페이지인가?
- URL 경로가 정확한가?
- 페이로드가 적절한가? (작은따옴표 문제 등)
Today’s Insight:
웹 취약점 자동 진단 도구를 처음부터 끝까지 설계하면서, 단순히 “공격을 시도하고 결과를 본다"는 것 이상의 복잡함을 경험했다. XSS 탐지 실패 트러블슈팅 과정에서 배웠듯이, 웹앱의 구조를 이해하고 다단계 검증을 구현해야 정확한 진단이 가능하다. 또한 프로젝트 주제 선정 과정에서 “차별화"와 “최신 이슈"의 중요성을 깨달았다. 23andMe 사건처럼 실제 대형 보안 사고와 연결하면 프로젝트의 임팩트가 극대화된다. 기술적으로는 모듈화와 통일된 인터페이스 설계가 확장성과 유지보수성을 크게 높인다는 것을 실감했다. 내일은 팀원과 협업하여 실제 웹앱에 스캐너를 적용하고, DNA 검사 서비스로의 전환 작업을 시작할 예정이다.