📄 2026.01.02 (Day 47) - Python 스캐너 15개 완성 및 통합 테스트


1. 핵심 성과 정리

주요 달성 사항

# 성과 세부 내용 완성도
1 웹 페이지 완성 팀원이 DNA Lab 페이지 거의 완벽하게 구현 95%
2 Python 스캐너 개발 15개 취약점 탐지 스크립트 거의 완료 90%
3 오프라인 협업 실시간 통합 테스트 및 이슈 해결 진행 중
4 보완 사항 도출 스캐너 정확도 개선 포인트 식별 우선순위 정리
5 팀 시너지 각자 영역 완성 후 상호 검토 단계 진입 협업 가속화

오늘의 주요 활동

시간대 활동 참여자 산출물
오전 각자 개발 마무리 개별 작업 웹 페이지, 스캐너 초안
오후 초반 통합 테스트 1차 전체 버그 리스트
오후 중반 스캐너 실행 및 분석 호짱 + 백엔드 탐지 결과 리포트
오후 후반 개선 방안 토론 전체 보완 계획서
저녁 우선순위 설정 전체 내일 작업 목록

2. Python 스캐너 개발 완료

구현 완료된 스캐너 목록 (15개)

# 스캐너명 구현 상태 주요 기능 파일 크기
1 01_xss_scanner.py ✅ 완료 Stored/Reflected/DOM XSS 탐지 8KB
2 02_sqli_scanner.py ✅ 완료 MyBatis Mapper 정적 분석 + 로그인/검색 SQLi 7KB
3 03_os_command_injection_scanner.py ✅ 완료 Runtime.exec() 코드 검사 + Blind 테스트 9KB
4 04_csrf_scanner.py ✅ 완료 CSRF 토큰 검증 + SameSite 쿠키 확인 4KB
5 05_weak_password.py ✅ 완료 약한 비밀번호 허용 + Brute Force 방어 4KB
6 06_access_control_scanner.py ✅ 완료 수평/수직 권한 상승 + IDOR 10KB
7 07_password_recovery.py ✅ 완료 비밀번호 복구 토큰 검증 6KB
8 08_session_scanner.py ✅ 완료 세션 타임아웃 + Session Fixation 6KB
9 09_cookie_scanner.py ✅ 완료 쿠키 변조 권한 상승 테스트 8KB
10 10_file_transfer_scanner.py ✅ 완료 악성 파일 업로드 + Path Traversal 9KB
11 11_path_traversal_scanner.py ✅ 완료 경로 조작으로 시스템 파일 접근 6KB
12 12_error_page_scanner.py ✅ 완료 Soft-404 + 스택 트레이스 노출 4KB
13 13_formatting_scanner.py ✅ 완료 String.format() 오남용 검사 7KB
14 14_http_method_scanner.py ✅ 완료 TRACE/PUT/DELETE 메소드 허용 3KB
15 15_ssrf_scanner.py ✅ 완료 SSRF + 내부망 접근 7KB

핵심 구현 아키텍처

main.py - 통합 실행 스크립트 구조:

  • 15개 스캐너를 번호, 이름, 모듈명, 타입으로 등록
  • importlib.import_module()으로 동적 모듈 로딩
  • 스캐너 타입별 파라미터 전달 방식 구분
    • xss, access, session, cookie, format, ssrf, os_cmd 타입: scan(target_url, login_info) 형식
    • file, error, http_method 타입: scan(target_url, crawl_result) 형식
    • 나머지: scan(target_url) 형식

스캔 모드 3가지:

  1. Static Scan - Whitebox(소스코드 분석) + Basic Blackbox(기본 HTTP 테스트)
  2. Dynamic Scan - WebCrawler로 자동 탐색 + Active Scan(공격 시뮬레이션)
  3. Full Scan - Static + Dynamic 통합 실행

실행 흐름 예시:

  • [*] Running XSS scanner (1/15)... -> [!] VULNERABLE
  • [*] Running SQL Injection scanner (2/15)... -> [+] Safe
  • [*] Running OS Command Injection scanner (3/15)... -> [!] VULNERABLE

3. 주요 스캐너 구현 상세

XSS Scanner - Whitebox + Blackbox 혼합

Thymeleaf 템플릿 정적 분석 (Whitebox):

  • templates 디렉토리 내 HTML 파일 전체 탐색
  • th:utext 사용 시 XSS 취약 -> [Static] 파일명:라인번호 - th:utext 사용 리포트
  • 인라인 표현식 [[${...}]] 패턴 탐지 -> XSS 취약 판정
  • 권장 수정: th:utext -> th:text 변경 (자동 이스케이프 적용)

동적 XSS 테스트 (Blackbox):

  • 테스트 페이로드: <script>alert('XSS')</script>, <img src=x onerror=alert('XSS')>
  • /board/write 엔드포인트에 POST 요청으로 페이로드 삽입
  • 응답에서 페이로드가 이스케이프 없이 렌더링되는지 확인
  • 판정 기준: payload in response.text AND < 문자 존재

SQL Injection Scanner - MyBatis Mapper 분석

MyBatis XML 파일 정적 분석 (Whitebox):

  • xml.etree.ElementTree로 Mapper 파일 파싱
  • select/insert/update/delete 쿼리에서 ${변수명} 패턴 탐지
  • ${} 발견 시 취약 판정 -> #{}으로 변경 권고
  • 정규표현식: re.findall(r'\$\{([^}]+)\}', query_text)

로그인 우회 테스트 (Blackbox):

  • 페이로드 1: username=admin'#, password=anything (주석 처리)
  • 페이로드 2: username=admin' OR '1'='1, password=anything (항상 참)
  • 성공 지표: 응답에 ’logout’, ‘mypage’, ‘admin’ 키워드 포함 여부

OS Command Injection Scanner - 시간 지연 테스트

Blind Command Injection 방식:

  • Windows 페이로드: 127.0.0.1 & timeout 5
  • Linux 페이로드: 127.0.0.1; sleep 5
  • /admin/system/ping 엔드포인트에 POST 요청
  • timeout=15 설정으로 무한 대기 방지
  • 판정 기준: 응답 시간 4초 이상이면 명령어 실행된 것으로 판단

Access Control Scanner - 쿠키 변조 권한 상승

실제 공격 시뮬레이션:

  1. 일반 계정으로 로그인 -> 기본 쿠키 획득
  2. role 쿠키 변조: ‘admin’, ‘administrator’, ‘ADMIN’ 시도
  3. 관리자 페이지 (/admin/system, /admin/dna/applications) 접근 시도
  4. 판정 기준:
    • HTTP 200 응답
    • 응답 본문 500자 이상
    • ‘access denied’, ‘forbidden’ 키워드 미포함

주요 개선 포인트: 단순 HTTP 상태 코드만으로 판정하면 오탐 발생 -> 응답 본문 내용도 함께 확인


File Transfer Scanner - OS별 페이로드

악성 파일 업로드 테스트:

  • Windows 위험 파일: malware.exe(MZ 헤더 시그니처 포함), script.ps1
  • Linux 위험 파일: shell.sh, webshell.jsp(JSP 기본 문법)
  • platform.system()으로 현재 OS 확인 후 적절한 테스트 파일 선택
  • 업로드 후 응답에 ‘success’, ‘uploaded’ 키워드 포함 시 취약 판정

Error Page Scanner - Soft-404 탐지

잘못된 에러 처리 탐지:

  • 존재하지 않을 법한 경로 테스트: /this_should_404_zzzz, /%ZZ, /error_test_1234
  • Soft-404 탐지: 없는 페이지인데 200 OK 반환하고 메인 페이지로 리다이렉트
  • 스택 트레이스 노출 탐지: exception, stack trace, whitelabel error page, org.springframework, apache tomcat 키워드 확인

4. 동적 스캐너 구현

WebCrawler - BFS 기반 자동 페이지 탐색

크롤링 전략:

  1. 로그인 시도 (login_info 제공 시)
  2. 시작 URL과 공통 경로(/board/list, /board/write, /employee/search, /support/ticket, /user/mypage, /admin/system)를 초기 큐에 추가
  3. BFS(너비 우선 탐색)로 최대 100페이지 탐색

페이지 파싱:

  • BeautifulSoup으로 HTML 파싱
  • <a href> 태그에서 링크 추출 -> 유효한 링크만 큐에 추가
  • <form> 태그에서 action, method, 입력 필드(input, textarea) 추출
  • 추출된 폼 정보를 DynamicScanner에 전달

DynamicScanner - 크롤링 데이터 기반 공격

폼 기반 XSS 테스트:

  • 크롤링으로 수집한 모든 폼에 XSS 페이로드 삽입
  • 페이로드: <script>alert('XSS')</script>, <img src=x onerror=alert('XSS')>
  • submit/hidden 타입 제외한 모든 입력 필드에 페이로드 적용
  • POST 폼은 session.post(), GET 폼은 session.get() 사용
  • 판정 기준: 응답에 페이로드 포함 AND HTML 태그 비이스케이프 확인

URL 파라미터 SQLi 테스트:

  • 크롤링으로 수집한 URL에서 쿼리 파라미터 추출
  • 각 파라미터에 ' 페이로드 삽입 후 요청
  • 응답에 ‘sql’, ‘syntax’, ‘mysql’ 키워드 포함 시 취약 판정

5. 통합 테스트 및 발견 이슈

실시간 협업 테스트 프로세스

테스트 환경 구성:

  • 팀원 PC: DNA Lab 웹앱 실행 (http://localhost:8080)
  • 호짱 PC: 스캐너 실행 (python main.py -t http://192.168.1.100:8080)
  • 실시간으로 발견된 이슈를 함께 화면 보며 분석 및 수정

발견된 주요 이슈

# 이슈 증상 원인 분석 해결 방법
1 XSS 미탐지 브라우저에선 alert 뜨는데 스캐너는 안전 판정 작은따옴표 포함 페이로드가 SQL 에러로 DB 저장 실패 <img src=x onerror=alert(1)> 페이로드 사용
2 SQL Injection 오탐 정상 기능도 취약으로 판정 SQL 에러 메시지만으로 판단 응답 코드 + 인증 우회 성공 여부 동시 확인
3 Command Injection 타임아웃 스캐너가 무한 대기 sleep 명령어 실행 시 timeout 부족 timeout=15 설정 + elapsed_time 측정
4 Cookie 변조 미탐지 실제로 권한 상승되는데 안전 판정 단순 status_code만 확인 응답 길이 + 실패 키워드 부재 확인
5 File Upload 백신 오탐 다운로드한 스캐너가 바이러스로 차단 실제 악성 바이트 시그니처 포함 OS별 무해한 테스트 파일로 변경
6 Path Traversal 경로 이슈 Linux에서 Windows 경로 테스트 OS 구분 없이 모든 페이로드 시도 platform.system()으로 OS 확인 후 적절한 페이로드 사용
7 Error Page Soft-404 404 페이지가 200으로 반환 메인 페이지로 리다이렉트 최종 URL 경로 확인 로직 추가
8 Dynamic Scanner 세션 끊김 크롤링 중 인증 풀림 Session 객체 미공유 self.session 공유 구조로 변경

6. 팀원 간 토론 내용

토론 1: 스캐너 정확도 개선

문제 제기:

  • 프론트엔드: “스캐너가 너무 공격적이지 않나요? 정상 기능도 취약점으로 잡는 것 같은데요.”
  • 호짱: “맞아요. XSS 스캐너가 이스케이프된 것도 취약으로 잡네요.”
  • 백엔드: “발표 때 오탐 지적받으면 곤란할 것 같은데…”

해결 방안 - 2단계 검증 추가:

  • 기존(단순): 페이로드가 응답에 포함되면 취약
  • 개선: 페이로드 포함 AND HTML 이스케이프(&lt;) 미포함 AND <script> 태그 직접 존재 -> 고신뢰도(high) 취약
  • 이스케이프 처리된 경우 -> 저신뢰도(low)로 분류 -> 안전 판정

토론 2: 12개 -> 15개로 확장

확장 결정 과정:

  • 호짱: “OWASP Top 10 기준으로 12개 만들었는데 충분할까요?”
  • 백엔드: “OS Command Injection은 어때요? Log4Shell 같은 사건도 있었고…”
  • 프론트엔드: “SSRF도 클라우드 환경에서 중요하다고 들었어요.”
  • 문서화: “HTTP Method 검증도 REST API 보안의 기본이죠.”

추가된 3개:

  1. 03_os_command_injection_scanner.py (9KB) - Runtime.exec() 코드 검사, Blind Command Injection (시간 지연 기반)
  2. 15_ssrf_scanner.py (7KB) - 내부망 접근 테스트, URL 요청 코드 검증
  3. 14_http_method_scanner.py (3KB) - TRACE/PUT/DELETE 허용 확인, XST 취약점 탐지

토론 3: Whitebox vs Blackbox 비율

현재 비율:

  • Whitebox (정적 분석): 40% - Thymeleaf 템플릿, MyBatis XML, Java 소스 코드
  • Blackbox (동적 테스트): 60% - HTTP 요청/응답 기반 실제 공격 시뮬레이션

장단점:

  • Whitebox 장점: 정확한 취약점 위치 파악 / 단점: 소스 코드 접근 필요
  • Blackbox 장점: 실제 공격 가능성 검증 / 단점: 오탐/미탐 가능성

최종 전략:

  • 중요 취약점(XSS, SQLi, Access Control): Whitebox + Blackbox 병행
  • 설정 관련(CSRF, Session, Cookie): Whitebox 위주
  • 파일/네트워크 관련(File Transfer, SSRF): Blackbox 위주

7. 오프라인 협업의 효과

실시간 피드백 루프

속도 비교:

  • 온라인 협업 (예상): 문제 발견 -> Slack 메시지 -> 답변 대기 (10분~1시간) -> 수정 커밋 -> Pull 받기 -> 재테스트 = 한 이슈당 평균 2시간
  • 오프라인 협업 (실제): 문제 발견 -> 바로 말하기 (5초) -> 함께 화면 보며 수정 (10분) -> 즉시 재테스트 = 한 이슈당 평균 15분
  • 효율성: 8배 향상

즉석 문제 해결 사례

Case 1: XSS 페이로드 협업 개발 (5분 해결)

  • 호짱: “<script>alert('XSS')</script> 이 페이로드는 왜 안 잡히죠?”
  • 백엔드: “작은따옴표 때문에 SQL 에러 나서 DB에 안 들어가네요.”
  • 프론트엔드: “작은따옴표 없는 페이로드 쓰면 되겠네요!”
  • 호짱: “<img src=x onerror=alert(1)> 로 바꿔볼게요… 잡혔습니다!”

Case 2: Cookie 변조 로직 개선 (10분 완성)

  • 호짱: “쿠키 role=admin으로 바꿔도 안전으로 나와요.”
  • 백엔드: “200 OK 떴는데요?”
  • 호짱: “근데 본문에 ‘Access Denied’ 있어요.”
  • 프론트엔드: “상태 코드만 보지 말고 본문 내용도 확인해야겠네요.”
  • 해결: res.status_code == 200 AND len(res.text) > 500 AND 'access denied' not in res.text.lower()

8. 리포트 생성 시스템

3가지 형식 자동 생성

TXT 리포트 구조:

[ DNA Lab Security Scan Report ]
Time: 2025-01-02 15:30:45
Target: http://localhost:8080
============================================================

[Summary]
Total Scans: 15
Vulnerable Scans: 9
Safe Scans: 6
Total Findings: 23
============================================================

1. XSS (Cross-Site Scripting) [!]
   [Details]
   - [Static] board/view.html:15 - th:utext 사용
   - [Dynamic] Stored XSS 취약 (/board/write)
   [Fix] th:utext를 th:text로 변경 | 입력값 HTML 이스케이프 처리
------------------------------------------------------------

HTML 리포트: 시각화된 대시보드 형식, 카드 형태로 Vulnerable(9)/Safe(6)/Total Findings(23) 표시, 취약점별 VULNERABLE/SAFE 배지와 상세 내용 포함

PDF 리포트 (선택): WeasyPrint 라이브러리 설치 시 HTML -> PDF 자동 변환, 미설치 시 “WeasyPrint not installed” 메시지 출력


9. 배운 점 및 인사이트

기술적 성장

Whitebox 분석 기술:

  • XML 파싱: xml.etree.ElementTree로 MyBatis Mapper 분석
  • 정규표현식: re.findall(r'\$\{([^}]+)\}', text) 패턴 매칭
  • 파일 시스템 탐색: os.walk()로 재귀적 파일 검색
  • 소스 코드 패턴 분석: 취약한 코딩 패턴 자동 탐지

Blackbox 테스팅 기술:

  • requests.Session(): 로그인 상태 유지하며 여러 요청
  • 시간 기반 Blind 공격: time.time() 측정으로 명령어 실행 확인
  • 쿠키 조작: session.cookies.set()으로 권한 변조
  • 응답 분석: HTTP 코드 + HTML 내용 + 응답 시간 종합 판단

자동화 스크립트 설계:

  • 모듈화: 각 스캐너 독립 실행 가능
  • 통일된 인터페이스: scan() 함수, 표준 result 딕셔너리
  • 에러 핸들링: try-except로 한 스캐너 실패해도 전체 중단 안 됨
  • 확장성: 새 스캐너 추가 시 main.py에 한 줄만 추가

협업 프로세스 개선

오프라인의 힘:

  • 물리적 근접성: 같은 화면 보며 즉시 이해
  • 컨텍스트 공유: 문제 인식부터 해결까지 같은 맥락
  • 집단 지성: 한 명이 막히면 다른 사람이 아이디어 제공
  • 즉각 검증: 수정 -> 테스트 사이클이 분 단위

효율적 역할 분담:

  • 호짱: 스캐너 로직 구현 + 테스트 실행
  • 백엔드: 취약점 삽입 + URL/파라미터 정보 제공
  • 프론트엔드: HTML 구조 설명 + 템플릿 엔진 동작 설명
  • 문서화: 발견 사항 기록 + 개선 방안 정리

보안 테스팅 인사이트

오탐/미탐 트레이드오프:

  • 공격적 탐지 (민감도 높음): 오탐 높지만 미탐 낮음
  • 보수적 탐지 (민감도 낮음): 오탐 낮지만 미탐 높음
  • 균형점: 2단계 검증 (1차: 빠른 탐지, 2차: 정밀 검증)

실전 공격 vs 테스트:

  • 실제 해커: 시간 무제한, 창의적 우회 기법 사용
  • 자동화 스캐너: 알려진 패턴 탐지, 시간 제약
  • 보완 방법: 수동 침투 테스트 병행, 정기적 업데이트

취약점 우선순위:

  1. Critical: 인증 우회 (SQLi), 권한 상승 (Cookie 변조)
  2. High: 코드 실행 (OS Command Injection), 데이터 유출 (Path Traversal)
  3. Medium: XSS, CSRF, 세션 관리
  4. Low: 정보 노출 (Error Page), HTTP Method

10. 남은 작업 및 내일 계획

스캐너 마무리 작업

우선순위 1 (필수 - 내일 오전):

  • 모든 스캐너 2차 검증 로직 추가
  • 오탐 사례 재테스트 및 수정
  • config.json 최종 엔드포인트 매칭
  • 에러 로깅 체계화

우선순위 2 (권장 - 내일 오후):

  • 페이로드 다양화 (현재 3-5개 -> 10개)
  • 실행 시간 최적화
  • 리포트 가독성 개선

문서화 작업

  • 취약점별 상세 설명 작성 (각 1페이지)
  • 대응 방안 가이드 (Before/After 코드)
  • 23andMe 사건 타임라인 정리
  • 발표 자료 초안 (30슬라이드 목표)

11. Quick Reference

스캐너 실행 명령어

  • 기본 실행 (대화형 모드): python main.py
  • 타겟 URL 지정: python main.py -t http://192.168.1.100:8080
  • 스캔 모드: 1(Static), 2(Dynamic), 3(Full) 선택
  • 결과 확인: cat reports/scan_report_20250102_*.txt 또는 HTML 파일 브라우저 열기

주요 파일 구조

vulnerability_scanner/
├── main.py                   # 통합 실행 스크립트
├── config.json              # 타겟 URL, 로그인 정보
├── dynamic_scanner.py       # 동적 스캐너
├── crawler.py               # 웹 크롤러
├── 01_xss_scanner.py        # XSS 탐지
├── 02_sqli_scanner.py       # SQL Injection 탐지
├── ...                      # (15개 스캐너)
└── reports/                 # 결과 리포트
    ├── scan_report_*.txt
    ├── scan_report_*.html
    └── scan_report_*.pdf

트러블슈팅 체크리스트

스캐너가 안 돌아갈 때:

  • 타겟 웹앱 실행 중? (http://localhost:8080 접속 확인)
  • config.json URL 정확? (target_url 확인)
  • Python 라이브러리 설치? (pip install requests beautifulsoup4)
  • 방화벽/백신 차단? (일시 비활성화 테스트)

취약점이 안 잡힐 때:

  • 실제로 취약? (브라우저에서 수동 확인)
  • 로그인 필요? (config.json의 login 정보 확인)
  • URL 경로 정확? (엔드포인트 오타 확인)
  • 페이로드 적절? (작은따옴표 SQL 에러 등)

Today’s Insight:

오프라인 협업의 위력을 체감한 하루였다. Python 스캐너 15개를 거의 완성하고, 팀원이 완성도 높은 DNA Lab 웹 페이지를 가져온 덕분에 본격적인 통합 테스트에 돌입했다. 실시간으로 이슈를 발견하고 함께 화면을 보며 해결하는 과정에서 온라인 협업 대비 8배의 효율성을 경험했다. 특히 XSS 페이로드에서 작은따옴표가 SQL 에러를 일으켜 DB 저장에 실패하는 문제를 5분 만에 발견하고 해결한 것은 물리적 근접성의 힘이었다.

Whitebox와 Blackbox를 혼합한 15개 스캐너는 정적 코드 분석으로 정확한 취약점 위치를 파악하고, 동적 테스트로 실제 공격 가능성을 검증하는 이중 구조를 갖췄다. 웹 크롤러와 연동된 동적 스캐너는 자동으로 폼과 URL을 수집해 공격을 시뮬레이션하며, 최대 50개 페이지를 탐색한다.

내일은 오탐을 줄이기 위한 2차 검증 로직 추가와 보안 강화 버전 개발을 시작하며, 취약한 상태와 안전한 상태의 명확한 대비를 준비할 것이다.