XSS, CSRF, 파일 업로드 취약점
웹보안에서 SQL Injection만큼 자주 나오는 XSS, CSRF, 파일 업로드 취약점을 정리합니다.
웹보안에서 SQL Injection만큼 자주 나오는 XSS, CSRF, 파일 업로드 취약점을 정리합니다.
SQL Injection = 입력값에 SQL 구문을 삽입하여 DB를 공격하는 기법
핵심 대응 = Prepared Statement, 입력값 검증, DB 권한 최소화, 오류 메시지 제한XSS
CSRF
파일 업로드 취약점이 세 가지는 필기와 실기 모두에서 매우 중요합니다. 특히 실기에서는 다음 형태로 자주 출제될 수 있습니다.
XSS의 개념과 대응 방안을 설명하시오.
Stored XSS와 Reflected XSS의 차이를 설명하시오.
CSRF의 개념과 대응 방안을 설명하시오.
파일 업로드 취약점의 위험과 대응 방안을 설명하시오.
웹셸 업로드를 방지하기 위한 대책을 설명하시오.학습 목표
이번 절가 끝나면 다음 질문에 답할 수 있어야 합니다.
| 질문 | 목표 |
|---|---|
| XSS란 무엇인가? | 웹페이지에 악성 스크립트를 삽입해 사용자 브라우저에서 실행시키는 공격이라고 설명 |
| XSS의 주요 피해는? | 쿠키 탈취, 세션 탈취, 피싱, 화면 변조 등을 설명 |
| Stored XSS란? | 악성 스크립트가 서버에 저장된 뒤 여러 사용자에게 실행되는 방식이라고 설명 |
| Reflected XSS란? | 요청값이 응답에 반사되어 스크립트가 실행되는 방식이라고 설명 |
| DOM-based XSS란? | 브라우저 측 스크립트가 DOM을 안전하지 않게 처리해 발생한다고 설명 |
| XSS 대응책은? | 출력값 인코딩, 입력값 검증, CSP, HttpOnly 쿠키 등을 설명 |
| CSRF란 무엇인가? | 로그인된 사용자의 인증 상태를 악용해 원치 않는 요청을 보내게 하는 공격이라고 설명 |
| CSRF 대응책은? | CSRF Token, SameSite 쿠키, Origin/Referer 검증, 재인증 등을 설명 |
| 파일 업로드 취약점이란? | 악성 파일 업로드로 서버 실행, 정보 유출, 서비스 장악이 발생할 수 있는 취약점이라고 설명 |
| 웹셸이란? | 서버에서 명령 실행이나 파일 조작을 가능하게 하는 악성 스크립트 파일이라고 설명 |
| 파일 업로드 대응책은? | 확장자·MIME·매직넘버 검증, 저장 경로 분리, 실행 권한 제거, 파일명 변경 등을 설명 |
취약점 전체 지도
| 취약점 | 핵심 공격 대상 | 핵심 위험 | 핵심 대응 |
|---|---|---|---|
| XSS | 사용자 브라우저 | 쿠키 탈취, 피싱, 화면 변조 | 출력값 인코딩, CSP, HttpOnly |
| CSRF | 사용자의 인증 상태 | 원치 않는 요청 수행 | CSRF Token, SameSite, 재인증 |
| 파일 업로드 취약점 | 서버 | 웹셸 업로드, 서버 장악 | 파일 검증, 저장 분리, 실행 차단 |
쉽게 구분하면 다음입니다.
SQL Injection = DB 공격
XSS = 사용자 브라우저 공격
CSRF = 사용자의 로그인 상태 악용
파일 업로드 취약점 = 서버에 악성 파일 업로드XSS
XSS란?
XSS는 Cross-Site Scripting의 약자입니다.
시험식 정의는 다음입니다.
XSS는 웹 애플리케이션이 사용자 입력값을 적절히 검증하거나 출력 시 인코딩하지 않아 악성 스크립트가 사용자 브라우저에서 실행되는 공격이다.핵심 의미는 다음과 같다.
XSS = 웹페이지에 악성 스크립트를 넣어 다른 사용자 브라우저에서 실행시키는 공격중요한 점은 공격 대상입니다.
SQL Injection의 직접 대상 = DB
XSS의 직접 대상 = 사용자 브라우저XSS가 발생하는 원리
XSS는 보통 다음 흐름으로 발생합니다.
1. 공격자가 입력 가능한 곳에 악성 스크립트 형태의 값을 넣는다.
2. 서버가 그 값을 안전하게 처리하지 않고 저장하거나 응답에 포함한다.
3. 다른 사용자의 브라우저가 해당 페이지를 열 때 스크립트가 실행된다.
4. 쿠키 탈취, 피싱, 화면 변조 등이 발생할 수 있다.취약한 위치는 다음과 같습니다.
| 위치 | 예시 |
|---|---|
| 게시판 | 제목, 내용, 댓글 |
| 검색창 | 검색어가 결과 페이지에 다시 출력되는 경우 |
| 프로필 | 닉네임, 자기소개 |
| 관리자 페이지 | 사용자 입력값을 관리자 화면에 표시 |
| URL 파라미터 | 요청값이 응답에 그대로 포함 |
| 오류 메시지 | 입력값이 오류 화면에 출력 |
| API 응답 | 사용자 입력값이 JSON, HTML에 반영 |
핵심 원인은 다음입니다.
사용자 입력값을 출력할 때 문맥에 맞게 인코딩하지 않기 때문XSS의 주요 피해
XSS는 사용자의 브라우저에서 실행되기 때문에 다음 피해가 발생할 수 있습니다.
| 피해 | 설명 |
|---|---|
| 쿠키 탈취 | 세션 쿠키 탈취로 로그인 상태 악용 |
| 세션 하이재킹 | 탈취한 세션으로 사용자 권한 사용 |
| 피싱 | 가짜 로그인 창을 띄워 계정 정보 수집 |
| 화면 변조 | 웹페이지 내용 변경 |
| 악성 사이트 유도 | 사용자를 공격자 사이트로 이동 |
| 사용자 행위 대리 수행 | 사용자 권한으로 요청 수행 |
| 키 입력 탈취 | 입력값을 몰래 수집 |
| 관리자 계정 공격 | 관리자가 취약 페이지를 볼 경우 피해 확대 |
특히 실기 답안에서는 다음 문장을 활용한다.
XSS는 사용자의 브라우저에서 악성 스크립트를 실행시켜 쿠키 탈취, 세션 탈취, 피싱, 화면 변조 등을 유발할 수 있다.XSS의 종류
정보보안기사 수준에서 반드시 알아야 할 XSS 유형은 세 가지입니다.
Stored XSS
Reflected XSS
DOM-based XSSStored XSS
Stored XSS란?
Stored XSS는 악성 스크립트가 서버에 저장된 뒤, 해당 데이터를 조회하는 사용자에게 실행되는 방식입니다.
시험식 정의는 다음입니다.
Stored XSS는 공격자가 게시글, 댓글, 프로필 등 서버에 저장되는 입력값에 악성 스크립트를 삽입하고, 이를 조회하는 사용자의 브라우저에서 스크립트가 실행되는 공격이다.Stored XSS = 서버에 저장되는 XSSStored XSS 예시 상황
예를 들어 게시판 댓글 기능이 있다고 합시다.
1. 공격자가 댓글에 악성 스크립트 형태의 값을 입력한다.
2. 서버가 해당 값을 DB에 저장한다.
3. 다른 사용자가 게시글을 조회한다.
4. 저장된 악성 스크립트가 사용자 브라우저에서 실행된다.Stored XSS는 피해 범위가 클 수 있습니다.
왜냐하면 한 번 저장되면 여러 사용자가 계속 피해를 볼 수 있기 때문입니다.
| 특징 | 설명 |
|---|---|
| 저장 위치 | 서버 DB, 게시판, 댓글, 프로필 등 |
| 피해 범위 | 다수 사용자에게 반복 피해 가능 |
| 위험도 | 일반적으로 높음 |
| 탐지 위치 | 저장 데이터, 응답 페이지, WAF 로그 |
Reflected XSS
Reflected XSS란?
Reflected XSS는 사용자의 요청값이 서버 응답에 그대로 반사되어 브라우저에서 실행되는 방식입니다.
시험식 정의는 다음입니다.
Reflected XSS는 공격자가 조작한 요청 파라미터가 서버 응답 페이지에 그대로 포함되어 사용자의 브라우저에서 악성 스크립트가 실행되는 공격이다.Reflected XSS = 요청값이 응답에 반사되는 XSSReflected XSS 예시 상황
예를 들어 검색 기능이 있다고 합시다.
/search?keyword=입력값서버가 검색 결과 페이지에 다음처럼 출력합니다.
입력값에 대한 검색 결과입니다.이때 입력값을 안전하게 인코딩하지 않으면 공격자가 조작한 링크를 피해자에게 보내고, 피해자가 그 링크를 클릭했을 때 스크립트가 실행될 수 있습니다.
| 특징 | 설명 |
|---|---|
| 저장 여부 | 서버에 저장되지 않음 |
| 공격 방식 | 조작된 URL, 피싱 링크 |
| 실행 시점 | 피해자가 링크 클릭 시 |
| 주요 위험 | 쿠키 탈취, 피싱, 악성 사이트 유도 |
Stored XSS와 비교하면 다음입니다.
| 구분 | Stored XSS | Reflected XSS |
|---|---|---|
| 저장 여부 | 서버에 저장됨 | 서버에 저장되지 않음 |
| 피해 방식 | 페이지 조회자에게 반복 실행 | 조작된 링크 클릭 시 실행 |
| 주 위치 | 게시판, 댓글, 프로필 | 검색, 오류 페이지, URL 파라미터 |
| 위험 | 다수 사용자 피해 가능 | 피싱과 결합되기 쉬움 |
DOM-based XSS
DOM이란?
DOM은 Document Object Model입니다.
DOM은 브라우저가 HTML 문서를 객체 구조로 표현한 것이다.
웹페이지에서 JavaScript는 DOM을 조작해 화면 내용을 바꿉니다.
DOM-based XSS란?
DOM-based XSS는 서버 응답이 아니라 브라우저 측 JavaScript가 사용자 입력값을 안전하지 않게 처리하여 발생하는 XSS입니다.
시험식 정의는 다음입니다.
DOM-based XSS는 클라이언트 측 스크립트가 URL, 해시, 입력값 등 외부 데이터를 안전하게 처리하지 않고 DOM에 삽입하여 브라우저에서 악성 스크립트가 실행되는 공격이다.DOM-based XSS = 브라우저의 JavaScript 처리 과정에서 발생하는 XSSStored, Reflected XSS가 서버 응답과 관련이 깊다면, DOM-based XSS는 클라이언트 측 코드와 관련이 깊습니다.
| 구분 | 핵심 원인 |
|---|---|
| Stored XSS | 악성 입력값이 서버에 저장됨 |
| Reflected XSS | 요청값이 서버 응답에 반사됨 |
| DOM-based XSS | 브라우저 JavaScript가 DOM에 위험하게 삽입 |
XSS 대응책 전체 지도
XSS 대응에서 가장 중요한 것은 출력값 인코딩입니다.
많은 사람이 입력값 검증만 떠올리지만, XSS의 핵심 방어는 다음입니다.
사용자 입력값을 화면에 출력할 때 문맥에 맞게 안전하게 인코딩한다.주요 대응책은 다음입니다.
| 대응책 | 설명 |
|---|---|
| 출력값 인코딩 | HTML, JavaScript, URL 등 문맥에 맞게 인코딩 |
| 입력값 검증 | 허용된 형식, 길이, 문자만 입력 허용 |
| CSP 적용 | 허용된 스크립트만 실행되도록 제한 |
| HttpOnly 쿠키 | JavaScript의 쿠키 접근 제한 |
| Secure 쿠키 | HTTPS에서만 쿠키 전송 |
| SameSite 쿠키 | CSRF와 일부 세션 악용 완화 |
| 위험한 HTML 태그 제한 | 게시판 등에서 스크립트 실행 요소 제한 |
| 보안 라이브러리 사용 | 검증된 템플릿 엔진과 인코딩 기능 사용 |
| WAF 적용 | XSS 패턴 탐지·차단 |
| 관리자 페이지 보호 | 관리자 화면에서 사용자 입력 출력 시 특히 주의 |
출력값 인코딩
출력값 인코딩이란?
출력값 인코딩은 사용자 입력값을 웹페이지에 출력할 때 브라우저가 코드로 해석하지 않고 문자로만 표시하도록 변환하는 것입니다.
시험식 정의는 다음입니다.
출력값 인코딩은 사용자 입력값이 HTML, JavaScript, URL 등 출력 위치에서 실행 가능한 코드로 해석되지 않도록 특수문자를 안전한 표현으로 변환하는 보안 조치이다.출력값 인코딩 = 입력값을 코드가 아니라 글자로 보이게 만드는 것문맥별 인코딩
XSS에서 중요한 것은 출력 위치에 따라 인코딩 방식이 달라진다는 점입니다.
| 출력 위치 | 필요한 처리 |
|---|---|
| HTML 본문 | HTML 인코딩 |
| HTML 속성 | 속성 문맥 인코딩 |
| JavaScript 내부 | JavaScript 문맥 인코딩 |
| URL | URL 인코딩 |
| CSS | CSS 문맥 주의 |
시험에서는 너무 깊은 구현보다 다음 문장을 기억하면 됩니다.
XSS 방어를 위해 사용자 입력값은 출력되는 문맥에 맞게 인코딩해야 한다.CSP
CSP란?
CSP는 Content Security Policy입니다.
시험식 정의는 다음입니다.
CSP는 브라우저가 허용된 출처의 스크립트, 스타일, 이미지 등만 실행하거나 로드하도록 제한하는 보안 정책이다.CSP = 브라우저에게 어떤 스크립트를 허용할지 알려주는 보안 정책CSP는 XSS 피해를 줄이는 데 도움이 됩니다.
| 효과 | 설명 |
|---|---|
| 외부 악성 스크립트 차단 | 허용된 출처만 로드 |
| 인라인 스크립트 제한 | 페이지 내 삽입 스크립트 실행 제한 |
| XSS 피해 완화 | 스크립트 실행 가능성 감소 |
| 정책 위반 보고 | 공격 시도 탐지에 활용 가능 |
중요한 점은 다음입니다.
CSP는 XSS 완화 대책이지, 출력값 인코딩을 대체하는 근본 대책은 아니다.HttpOnly와 XSS
HttpOnly 쿠키는 JavaScript에서 쿠키에 접근하지 못하게 합니다.
XSS 공격이 발생해도 세션 쿠키 탈취 위험을 줄일 수 있습니다.
HttpOnly = JavaScript 쿠키 접근 제한하지만 HttpOnly만으로 XSS가 해결되는 것은 아닙니다.
왜냐하면 XSS는 쿠키 탈취 외에도 피싱, 화면 변조, 사용자 행위 대리 수행 등을 할 수 있기 때문입니다.
HttpOnly 쿠키는 XSS로 인한 세션 쿠키 탈취를 완화할 수 있지만, XSS 자체를 제거하는 것은 아니므로 출력값 인코딩, 입력값 검증, CSP 적용이 함께 필요하다.XSS 실기 답안
문제: XSS의 개념과 대응 방안을 설명하시오.
좋은 답안은 다음과 같습니다.
XSS는 웹 애플리케이션이 사용자 입력값을 적절히 처리하지 않아 악성 스크립트가 다른 사용자의 브라우저에서 실행되는 공격이다. 이를 통해 쿠키 탈취, 세션 하이재킹, 피싱, 화면 변조 등이 발생할 수 있으며, 대응 방안으로는 출력값 인코딩, 입력값 검증, CSP 적용, HttpOnly·Secure 쿠키 설정, WAF 적용 등이 있다.채점 포인트는 다음입니다.
| 요소 | 포함 여부 |
|---|---|
| 악성 스크립트 | 필수 |
| 사용자 브라우저에서 실행 | 필수 |
| 쿠키·세션 탈취 | 중요 |
| 출력값 인코딩 | 매우 중요 |
| CSP, HttpOnly | 좋음 |
CSRF
CSRF란?
CSRF는 Cross-Site Request Forgery입니다.
한국어로는 사이트 간 요청 위조입니다.
시험식 정의는 다음입니다.
CSRF는 사용자가 특정 웹사이트에 로그인된 상태를 악용하여, 사용자가 의도하지 않은 요청을 해당 사이트로 전송하게 만드는 공격이다.CSRF = 로그인 상태를 악용해 원치 않는 요청을 보내게 하는 공격핵심은 다음입니다.
공격자가 사용자의 인증 상태를 이용한다.CSRF 발생 원리
CSRF는 보통 다음 흐름으로 발생합니다.
1. 사용자가 정상 사이트에 로그인한다.
2. 브라우저에는 해당 사이트의 세션 쿠키가 저장되어 있다.
3. 사용자가 공격자가 만든 페이지나 링크에 접근한다.
4. 공격자가 만든 요청이 정상 사이트로 전송된다.
5. 브라우저는 저장된 쿠키를 자동으로 함께 보낸다.
6. 서버가 요청의 진짜 의도를 검증하지 않으면 요청이 처리된다.예를 들어 다음 기능이 있다고 생각해봅시다.
비밀번호 변경
이메일 변경
게시글 작성
송금 요청
상품 주문
관리자 설정 변경이런 상태 변경 요청이 CSRF에 취약하면 사용자가 원하지 않는 행위가 수행될 수 있습니다.
CSRF의 주요 피해
| 피해 | 설명 |
|---|---|
| 비밀번호 변경 | 사용자가 원치 않는 계정 설정 변경 |
| 이메일 변경 | 계정 복구 수단 탈취 가능 |
| 게시글 작성 | 사용자 명의의 글 작성 |
| 송금 요청 | 금융 거래 조작 |
| 상품 주문 | 원치 않는 결제·주문 |
| 관리자 설정 변경 | 관리자가 로그인된 상태라면 피해 확대 |
| 권한 변경 | 계정 권한 변경 가능 |
실기에서 중요한 문장은 다음입니다.
CSRF는 사용자의 로그인 세션을 악용하여 사용자가 의도하지 않은 상태 변경 요청을 서버에 전송하게 만드는 공격이다.XSS와 CSRF 비교
XSS와 CSRF는 자주 헷갈립니다.
| 구분 | XSS | CSRF |
|---|---|---|
| 핵심 | 악성 스크립트 실행 | 요청 위조 |
| 공격 대상 | 사용자 브라우저 | 사용자의 인증 상태 |
| 피해 | 쿠키 탈취, 피싱, 화면 변조 | 비밀번호 변경, 송금, 게시글 작성 |
| 필요 조건 | 입력값이 페이지에서 스크립트로 실행 | 사용자가 로그인된 상태 |
| 주요 대응 | 출력값 인코딩, CSP, HttpOnly | CSRF Token, SameSite, 재인증 |
| 한 줄 암기 | 스크립트 실행 | 원치 않는 요청 |
XSS는 브라우저에서 악성 스크립트를 실행시키는 공격이고, CSRF는 사용자의 로그인 상태를 악용해 원치 않는 요청을 보내게 하는 공격이다.CSRF 대응책
CSRF 대응책은 다음이 중요합니다.
CSRF Token
SameSite Cookie
Origin/Referer 검증
중요 기능 재인증
GET으로 상태 변경 금지CSRF Token
CSRF Token은 CSRF 방어의 핵심입니다.
시험식 정의는 다음입니다.
CSRF Token은 서버가 사용자 세션에 대해 예측 불가능한 토큰을 생성하고, 상태 변경 요청 시 해당 토큰을 함께 제출하도록 하여 요청의 정당성을 검증하는 값이다.CSRF Token = 정상 페이지에서 온 요청인지 확인하는 비밀값동작 흐름은 다음입니다.
1. 서버가 사용자 세션에 CSRF Token을 생성한다.
2. 정상 페이지의 폼이나 요청에 토큰을 포함한다.
3. 사용자가 요청을 보낼 때 토큰이 함께 전송된다.
4. 서버는 세션의 토큰과 요청 토큰을 비교한다.
5. 일치하면 처리하고, 없거나 틀리면 거부한다.중요한 조건은 다음입니다.
| 조건 | 설명 |
|---|---|
| 예측 불가능해야 함 | 공격자가 추측할 수 없어야 함 |
| 서버에서 검증해야 함 | 클라이언트에만 맡기면 안 됨 |
| 세션과 연결되어야 함 | 사용자별로 구분되어야 함 |
| 상태 변경 요청에 적용 | POST, PUT, DELETE 등 |
| 토큰 재사용 관리 | 중요한 요청은 일회성 또는 짧은 유효기간 고려 |
SameSite 쿠키
SameSite는 쿠키가 다른 사이트에서 발생한 요청에 자동으로 포함되는 것을 제한합니다.
SameSite = 다른 사이트 요청에서 쿠키 전송 제한CSRF 위험 완화주요 값은 다음과 같습니다.
| 값 | 의미 |
|---|---|
| Strict | 같은 사이트 요청에서만 쿠키 전송 |
| Lax | 일부 안전한 교차 사이트 이동은 허용 |
| None | 모든 교차 사이트 요청에 전송 가능, Secure 필요 |
시험에서는 깊은 값보다 다음을 기억하면 됩니다.
SameSite 쿠키 속성은 다른 사이트에서 발생한 요청에 쿠키가 자동 전송되는 것을 제한하여 CSRF 위험을 줄인다.Origin / Referer 검증
Origin 또는 Referer 헤더를 확인하여 요청이 신뢰할 수 있는 출처에서 왔는지 검증할 수 있습니다.
| 헤더 | 의미 |
|---|---|
| Origin | 요청이 시작된 출처 |
| Referer | 이전 페이지 주소 |
하지만 이 헤더만 단독으로 의존하는 것은 부족할 수 있습니다.
Origin/Referer 검증은 CSRF 대응에 도움이 되지만, 헤더 누락이나 환경 차이가 있을 수 있으므로 CSRF Token과 함께 사용하는 것이 바람직하다.중요 기능 재인증
비밀번호 변경, 송금, 관리자 설정 변경 같은 중요 기능은 재인증이 필요합니다.
비밀번호 재입력
OTP 확인
MFA 확인CSRF 요청만으로 중요 기능이 처리되는 위험 감소GET으로 상태 변경 금지
GET은 조회에 사용해야 합니다.
상태를 변경하는 기능은 GET으로 처리하면 안 됩니다.
GET 요청으로 비밀번호 변경
GET 요청으로 게시글 삭제
GET 요청으로 관리자 설정 변경왜 위험할까요?
GET 요청은 이미지, 링크, 리다이렉션 등으로 쉽게 유도될 수 있기 때문입니다.
상태를 변경하는 기능은 GET 방식으로 처리하지 말고 POST, PUT, DELETE 등 적절한 메서드를 사용하며, CSRF Token과 권한 검증을 적용해야 한다.CSRF 실기 답안
문제: CSRF의 개념과 대응 방안을 설명하시오.
좋은 답안은 다음과 같습니다.
CSRF는 사용자가 웹사이트에 로그인된 상태를 악용하여 사용자가 의도하지 않은 요청을 서버에 전송하게 만드는 공격이다. 대응 방안으로는 예측 불가능한 CSRF Token을 생성해 서버에서 검증하고, SameSite 쿠키 설정, Origin/Referer 검증, 중요 기능 재인증, GET 방식의 상태 변경 금지 등을 적용해야 한다.채점 포인트는 다음입니다.
| 요소 | 포함 여부 |
|---|---|
| 로그인 상태 악용 | 필수 |
| 원치 않는 요청 | 필수 |
| CSRF Token | 매우 중요 |
| SameSite | 중요 |
| Origin/Referer | 좋음 |
| 재인증 | 좋음 |
파일 업로드 취약점
파일 업로드 취약점이란?
파일 업로드 취약점은 사용자가 업로드한 파일을 서버가 안전하게 검증하지 않아 악성 파일이 저장되거나 실행될 수 있는 취약점입니다.
시험식 정의는 다음입니다.
파일 업로드 취약점은 업로드 파일의 확장자, 내용, 크기, 저장 위치, 실행 권한 등을 적절히 검증하지 않아 악성 파일 업로드, 웹셸 실행, 정보 유출, 서버 장악 등이 발생할 수 있는 취약점이다.파일 업로드 취약점 = 서버에 위험한 파일을 올려 실행하거나 악용하는 취약점파일 업로드가 위험한 이유
파일 업로드 기능은 정상적으로는 필요합니다.
프로필 사진 업로드
게시판 첨부파일 업로드
문서 업로드
상품 이미지 업로드
증빙자료 업로드하지만 검증이 부실하면 공격자가 악성 파일을 업로드할 수 있습니다.
| 위험 | 설명 |
|---|---|
| 웹셸 업로드 | 서버 명령 실행 가능성 |
| 악성코드 유포 | 다른 사용자가 다운로드해 감염 |
| 서버 저장공간 고갈 | 대용량 파일 업로드 |
| 파일 덮어쓰기 | 기존 파일 변조 |
| 경로 조작 | 의도하지 않은 위치에 저장 |
| 개인정보 유출 | 업로드 파일 접근통제 미흡 |
| 스크립트 실행 | 업로드 파일이 웹 서버에서 실행 |
| 콘텐츠 타입 우회 | 이미지처럼 위장한 악성 파일 |
웹셸
웹셸이란?
웹셸은 웹 서버에서 실행되어 공격자가 서버 명령 실행, 파일 조작, DB 접근 등을 수행할 수 있게 하는 악성 스크립트입니다.
시험식 정의는 다음입니다.
웹셸은 웹 서버에서 실행 가능한 악성 스크립트 파일로, 공격자가 웹을 통해 서버 명령 실행, 파일 업로드·다운로드, 내부 정보 조회 등을 수행할 수 있게 하는 악성 도구이다.웹셸 = 웹으로 조종하는 서버 악성 스크립트웹셸이 업로드되어 실행되면 피해가 매우 큽니다.
| 피해 | 설명 |
|---|---|
| 서버 명령 실행 | 시스템 명령 수행 가능 |
| 파일 조작 | 파일 조회, 수정, 삭제 |
| 추가 악성코드 설치 | 백도어, 루트킷 설치 가능 |
| 내부망 이동 | 내부 시스템 공격 거점 |
| DB 정보 탈취 | DB 접속 정보 유출 |
| 홈페이지 변조 | 웹페이지 내용 변경 |
| 로그 삭제 시도 | 침입 흔적 은폐 |
파일 업로드 취약점 발생 원인
파일 업로드 취약점은 다음 원인으로 발생합니다.
| 원인 | 설명 |
|---|---|
| 확장자 검증 미흡 | 실행 가능한 확장자 업로드 허용 |
| MIME Type만 신뢰 | 클라이언트가 보낸 Content-Type을 그대로 신뢰 |
| 파일 내용 검증 미흡 | 실제 파일 내용 확인 없음 |
| 파일 크기 제한 없음 | 대용량 업로드로 저장공간 고갈 |
| 저장 경로 부적절 | 웹에서 직접 실행 가능한 경로에 저장 |
| 실행 권한 허용 | 업로드 파일이 서버에서 실행됨 |
| 파일명 미검증 | 경로 조작, 덮어쓰기 가능 |
| 접근통제 미흡 | 업로드 파일을 누구나 열람 |
| 악성코드 검사 없음 | 악성 파일 저장·배포 가능 |
핵심은 다음입니다.
업로드 파일은 신뢰할 수 없는 입력값이다.파일 업로드 대응책
파일 업로드 취약점 대응은 여러 단계로 해야 합니다.
| 대응책 | 설명 |
|---|---|
| 허용 확장자 방식 | 이미지라면 jpg, png 등 필요한 확장자만 허용 |
| 위험 확장자 차단 | 서버 실행 가능 확장자 차단 |
| MIME Type 검증 | Content-Type 확인, 단독 신뢰 금지 |
| 파일 시그니처 검증 | 실제 파일 내용, 매직넘버 확인 |
| 파일 크기 제한 | 대용량 업로드 제한 |
| 파일명 변경 | 난수화된 파일명으로 저장 |
| 저장 경로 분리 | 웹 루트 밖 또는 별도 저장소에 저장 |
| 실행 권한 제거 | 업로드 디렉터리에서 스크립트 실행 금지 |
| 접근통제 적용 | 권한 있는 사용자만 다운로드 가능 |
| 악성코드 검사 | 백신, 샌드박스 검사 |
| 이미지 재처리 | 이미지 파일은 리사이징·재인코딩 |
| 다운로드 강제 | 실행이 아니라 다운로드되도록 처리 |
| 로그 모니터링 | 비정상 업로드, 반복 시도 탐지 |
허용 확장자 방식
확장자 검증은 차단목록보다 허용목록 방식이 바람직합니다.
허용목록 = 허용된 확장자만 업로드 가능예를 들어 프로필 이미지는 다음만 허용합니다.
jpg
jpeg
png
gif그 외는 모두 거부합니다.
파일 업로드 검증은 위험 확장자만 차단하는 방식보다 업무에 필요한 확장자만 허용하는 허용목록 방식을 적용하는 것이 바람직하다.MIME Type만 신뢰하면 안 되는 이유
MIME Type은 클라이언트가 보낼 수 있는 값입니다.
예를 들어 브라우저나 요청에서 파일의 Content-Type이 이미지라고 표시되어도, 실제 내용이 이미지라고 보장되지는 않습니다.
따라서 MIME Type만 믿으면 안 됩니다.
MIME Type + 확장자 + 파일 시그니처를 함께 검증해야 한다.파일 시그니처, 매직넘버 검증
파일 시그니처는 파일 내용의 시작 부분에 있는 고유한 식별값입니다.
이를 통해 실제 파일 형식을 확인할 수 있습니다.
시험에서는 구현보다 개념만 기억하면 됩니다.
확장자나 MIME Type은 조작될 수 있으므로 실제 파일 내용인 파일 시그니처를 함께 확인해야 한다.저장 경로 분리
업로드 파일은 웹에서 직접 실행 가능한 경로에 저장하면 위험합니다.
웹 루트 하위에 업로드 파일 저장
업로드 파일이 URL로 직접 접근되어 실행 가능웹 루트 외부 저장
별도 파일 서버 또는 객체 저장소 사용
다운로드 컨트롤러를 통해 권한 검증 후 제공업로드 파일은 웹 루트 밖의 별도 경로에 저장하고, 다운로드 시 서버가 접근권한을 검증한 후 제공해야 한다.실행 권한 제거
업로드 디렉터리에서는 스크립트 실행을 금지해야 합니다.
업로드 파일은 저장만 가능
서버에서 실행은 불가예를 들어 업로드 디렉터리에서 스크립트, CGI, 서버사이드 코드가 실행되지 않도록 설정해야 합니다.
업로드 디렉터리에는 실행 권한을 제거하여 업로드된 파일이 웹 서버에서 스크립트로 실행되지 않도록 해야 한다.파일명 변경
공격자는 파일명에 경로 조작 문자열이나 특수문자를 넣을 수 있습니다.
따라서 원본 파일명을 그대로 저장하지 않는다.
서버에서 난수 기반 파일명 생성
확장자는 검증 후 부여
파일명 길이 제한
특수문자 제거
중복 파일명 처리업로드 파일명은 원본 이름을 그대로 사용하지 말고 서버에서 난수화된 이름으로 변경하여 경로 조작, 덮어쓰기, 특수문자 악용을 방지해야 한다.파일 업로드 실기 답안
문제: 파일 업로드 취약점의 위험과 대응 방안을 설명하시오.
좋은 답안은 다음과 같습니다.
파일 업로드 취약점은 업로드 파일의 확장자, 내용, 크기, 저장 위치, 실행 권한 등을 검증하지 않아 웹셸이나 악성 파일이 서버에 업로드·실행될 수 있는 취약점이다. 대응 방안으로는 허용 확장자 방식 적용, MIME Type과 파일 시그니처 검증, 파일 크기 제한, 파일명 난수화, 웹 루트 외부 저장, 업로드 디렉터리 실행 권한 제거, 접근통제, 악성코드 검사 등을 적용해야 한다.채점 포인트는 다음입니다.
| 요소 | 포함 여부 |
|---|---|
| 파일 검증 미흡 | 필수 |
| 웹셸·악성 파일 | 필수 |
| 허용 확장자 | 중요 |
| 파일 시그니처 검증 | 좋음 |
| 저장 경로 분리 | 중요 |
| 실행 권한 제거 | 매우 중요 |
| 접근통제·악성코드 검사 | 좋음 |
XSS, CSRF, 파일 업로드 비교
| 구분 | XSS | CSRF | 파일 업로드 취약점 |
|---|---|---|---|
| 핵심 | 악성 스크립트 실행 | 원치 않는 요청 전송 | 악성 파일 업로드 |
| 주요 대상 | 사용자 브라우저 | 사용자의 인증 상태 | 서버 |
| 주요 피해 | 쿠키 탈취, 피싱, 화면 변조 | 비밀번호 변경, 송금, 게시글 작성 | 웹셸 실행, 서버 장악 |
| 주요 원인 | 출력값 인코딩 미흡 | 요청 정당성 검증 미흡 | 파일 검증·저장·실행 통제 미흡 |
| 핵심 대응 | 출력값 인코딩, CSP | CSRF Token, SameSite | 허용 확장자, 저장 분리, 실행 차단 |
| 보조 대응 | HttpOnly 쿠키, WAF | Referer 검증, 재인증 | 악성코드 검사, 파일명 변경 |
XSS = 브라우저에서 스크립트 실행
CSRF = 로그인 상태로 원치 않는 요청
파일 업로드 = 서버에 악성 파일 업로드로그에서 보는 공격 징후
XSS 의심 로그
| 징후 | 의미 |
|---|---|
| 파라미터에 스크립트 태그 형태 문자열 포함 | XSS 시도 가능 |
| 이벤트 핸들러 형태 문자열 포함 | XSS 우회 시도 가능 |
| 긴 URL 인코딩 문자열 | 우회 인코딩 가능성 |
| 게시판·댓글 저장 요청 반복 | Stored XSS 시도 가능 |
| WAF의 XSS 탐지 이벤트 | 공격 시도 가능 |
CSRF 의심 징후
| 징후 | 의미 |
|---|---|
| 중요 기능 요청에 CSRF Token 없음 | CSRF 취약 가능 |
| Referer 또는 Origin이 비정상 | 외부 사이트 유도 가능 |
| 사용자가 의도하지 않은 설정 변경 | CSRF 피해 가능 |
| GET 요청으로 상태 변경 발생 | 설계 취약 |
| 짧은 시간에 동일 기능 반복 요청 | 자동화 또는 위조 요청 가능 |
파일 업로드 의심 로그
| 징후 | 의미 |
|---|---|
| 허용되지 않은 확장자 업로드 시도 | 악성 파일 가능 |
| 이미지 업로드인데 파일 내용이 이미지가 아님 | 위장 파일 가능 |
| 업로드 후 즉시 해당 파일 URL 접근 | 웹셸 실행 시도 가능 |
| 업로드 파일명에 경로 조작 문자열 포함 | 저장 경로 우회 시도 |
| 동일 IP에서 다양한 확장자 반복 업로드 | 우회 시도 가능 |
| 업로드 디렉터리에서 실행 요청 발생 | 웹셸 의심 |
실기형 로그 분석 답안은 이렇게 쓸 수 있습니다.
업로드 요청 이후 동일 IP에서 업로드된 파일 URL로 즉시 접근하는 기록이 있고, 확장자와 실제 파일 형식이 일치하지 않으므로 웹셸 업로드 시도로 의심할 수 있다. 대응 방안으로 업로드 파일을 격리하고, 파일 확장자·MIME·시그니처 검증 여부, 저장 경로와 실행 권한 설정, WAF 및 웹 서버 로그를 점검해야 한다.내용 연결 정리
게시판이 있는 웹사이트를 예로 들면 다음과 같다.
1. 사용자가 게시글을 작성한다.
2. 게시글 제목과 내용이 서버에 저장된다.
3. 다른 사용자가 게시글을 조회한다.Stored XSS 발생 가능CSRF로 게시글 작성, 비밀번호 변경, 설정 변경 요청 가능웹셸 또는 악성 파일 업로드 가능게시글 출력 시 인코딩
위험한 HTML 제한
CSP 적용
세션 쿠키에 HttpOnly, Secure, SameSite 설정
상태 변경 요청에 CSRF Token 검증
중요 기능 재인증
업로드 파일 허용 확장자 검증
파일 시그니처 검증
웹 루트 외부 저장
업로드 디렉터리 실행 권한 제거
웹 로그와 WAF 로그 모니터링시험에 나오는 포인트
| 주제 | 시험 포인트 |
|---|---|
| XSS | 악성 스크립트가 사용자 브라우저에서 실행 |
| XSS 피해 | 쿠키 탈취, 세션 탈취, 피싱, 화면 변조 |
| Stored XSS | 악성 스크립트가 서버에 저장 |
| Reflected XSS | 요청값이 응답에 반사 |
| DOM-based XSS | 클라이언트 측 DOM 처리에서 발생 |
| XSS 핵심 대응 | 출력값 인코딩 |
| CSP | 허용된 스크립트만 실행하도록 제한 |
| HttpOnly | JavaScript 쿠키 접근 제한 |
| CSRF | 로그인 상태를 악용해 원치 않는 요청 전송 |
| CSRF 핵심 대응 | CSRF Token |
| SameSite | 다른 사이트 요청 시 쿠키 전송 제한 |
| Referer/Origin | 요청 출처 검증 |
| 재인증 | 중요 기능 수행 전 추가 인증 |
| 파일 업로드 취약점 | 악성 파일 업로드·실행 가능 |
| 웹셸 | 웹을 통해 서버 조작이 가능한 악성 스크립트 |
| 업로드 대응 | 허용 확장자, MIME·시그니처 검증 |
| 저장 경로 분리 | 웹 루트 밖 저장 |
| 실행 권한 제거 | 업로드 파일의 서버 실행 차단 |
| 파일명 난수화 | 경로 조작, 덮어쓰기 방지 |
필기형 문제풀이
문제 1
XSS에 대한 설명으로 가장 적절한 것은?
A. 입력값에 SQL 구문을 삽입해 DB를 공격하는 기법
B. 웹페이지에 악성 스크립트를 삽입해 사용자 브라우저에서 실행시키는 공격
C. 서버에 대량 트래픽을 보내 서비스를 마비시키는 공격
D. 출발지 IP 주소를 위조하는 공격
XSS는 악성 스크립트를 사용자 브라우저에서 실행시키는 웹 공격입니다.
문제 2
XSS의 주요 피해로 적절하지 않은 것은?
A. 쿠키 탈취
B. 세션 하이재킹
C. 피싱
D. IP 주소를 MAC 주소로 변환
IP 주소를 MAC 주소로 변환하는 것은 ARP의 역할입니다.
문제 3
Stored XSS에 대한 설명으로 적절한 것은?
A. 요청 파라미터가 즉시 응답에 반사되어 실행된다
B. 사용자의 로그인 상태를 이용해 요청을 위조한다
C. 악성 스크립트가 서버에 저장된 뒤 사용자 조회 시 실행된다
D. 파일 확장자 검증 실패로 웹셸이 실행된다
Stored XSS는 게시글, 댓글, 프로필 등 서버에 저장된 입력값을 통해 발생할 수 있습니다.
문제 4
Reflected XSS에 대한 설명으로 적절한 것은?
A. 악성 스크립트가 게시글에 저장된 뒤 여러 사용자에게 실행된다
B. CSRF Token 없이 상태 변경 요청을 위조한다
C. 업로드된 스크립트 파일이 서버에서 명령을 실행한다
D. 요청 파라미터가 서버 응답에 반사되어 브라우저에서 실행된다
Reflected XSS는 조작된 URL이나 요청값이 응답 페이지에 반영될 때 발생할 수 있습니다.
문제 5
XSS 대응책으로 가장 핵심적인 것은?
A. 모든 입력값을 DB에 저장하지 않는 것만으로 해결
B. CSRF Token만 적용
C. 출력값 인코딩
D. 업로드 디렉터리 실행 권한 제거
XSS의 핵심 대응은 사용자 입력값을 출력 위치에 맞게 안전하게 인코딩하는 것입니다.
문제 6
HttpOnly 쿠키 속성의 효과로 적절한 것은?
A. CSRF Token 값을 자동으로 생성한다
B. SameSite 설정 없이 교차 사이트 요청을 모두 차단한다
C. DB 쿼리를 자동으로 파라미터화한다
D. JavaScript에서 쿠키 접근을 제한한다
HttpOnly는 XSS로 인한 쿠키 탈취 위험을 줄이는 데 도움이 됩니다.
문제 7
CSRF에 대한 설명으로 가장 적절한 것은?
A. 악성 스크립트를 사용자 브라우저에서 실행시키는 공격
B. 악성 파일을 서버에 업로드하는 공격
C. 사용자의 로그인 상태를 악용해 원치 않는 요청을 서버에 보내게 하는 공격
D. SQL 구문과 입력값을 섞어 DB를 조작하는 공격
CSRF는 사용자의 인증 상태를 악용하여 상태 변경 요청을 위조하는 공격입니다.
문제 8
CSRF 대응책으로 가장 핵심적인 것은?
A. CSRF Token 검증
B. Origin/Referer 검증을 생략하고 쿠키만 확인
C. 상태 변경 요청에 토큰 검증 없이 세션 쿠키만 확인
D. GET 요청으로 비밀번호 변경 같은 상태 변경을 허용
CSRF Token은 요청의 정당성을 검증하는 핵심 대책입니다.
문제 9
SameSite 쿠키 속성의 효과로 적절한 것은?
A. JavaScript에서 쿠키 값을 읽지 못하게 한다
B. SQL 구문과 입력값을 분리한다
C. 파일 업로드 확장자를 허용목록으로 제한한다
D. 다른 사이트에서 발생한 요청에 쿠키가 자동 전송되는 것을 제한한다
SameSite는 CSRF 위험을 완화하는 쿠키 속성입니다.
문제 10
파일 업로드 취약점의 위험으로 적절한 것은?
A. SameSite 미설정으로 쿠키가 교차 사이트 요청에 전송됨
B. 출력값 인코딩 누락으로 브라우저에서 스크립트 실행
C. 웹셸 업로드와 서버 명령 실행 가능성
D. CSRF Token 누락으로 상태 변경 요청 위조
파일 업로드 검증이 부실하면 웹셸이나 악성 파일이 업로드되어 서버 침해로 이어질 수 있습니다.
문제 11
파일 업로드 보안 대책으로 적절하지 않은 것은?
A. 허용 확장자 방식 적용
B. 파일 시그니처 검증
C. 업로드 디렉터리 실행 권한 제거
D. 업로드 파일을 웹 루트에 저장하고 실행 허용
업로드 파일을 웹 루트에 저장하고 실행까지 허용하면 웹셸 실행 위험이 커집니다.
문제 12
웹셸에 대한 설명으로 적절한 것은?
A. 웹 서버에서 실행되어 공격자가 서버 명령 실행이나 파일 조작을 수행할 수 있게 하는 악성 스크립트
B. 게시판 입력값에 저장되어 사용자 브라우저에서 실행되는 스크립트
C. 다른 사이트 요청에 세션 쿠키가 자동 전송되도록 악용하는 요청
D. 업로드 파일의 확장자와 실제 내용을 검증하는 보안 절차
웹셸은 파일 업로드 취약점과 자주 연결되는 고위험 악성 파일입니다.
실기형 답안 훈련
실기 예제 1
문제: XSS의 개념과 대응 방안을 설명하시오.
좋은 답안
XSS는 웹 애플리케이션이 사용자 입력값을 적절히 처리하지 않아 악성 스크립트가 다른 사용자의 브라우저에서 실행되는 공격이다. 이를 통해 쿠키 탈취, 세션 하이재킹, 피싱, 화면 변조 등이 발생할 수 있으며, 대응 방안으로는 출력값 인코딩, 입력값 검증, CSP 적용, HttpOnly·Secure 쿠키 설정, WAF 적용 등이 있다.채점 포인트
| 요소 | 포함 여부 |
|---|---|
| 악성 스크립트 | 필수 |
| 사용자 브라우저에서 실행 | 필수 |
| 쿠키·세션 탈취 | 중요 |
| 출력값 인코딩 | 매우 중요 |
| CSP, HttpOnly | 좋음 |
실기 예제 2
문제: Stored XSS, Reflected XSS, DOM-based XSS의 차이를 설명하시오.
좋은 답안
Stored XSS는 악성 스크립트가 게시글이나 댓글처럼 서버에 저장된 뒤 이를 조회하는 사용자 브라우저에서 실행되는 공격이다. Reflected XSS는 요청 파라미터가 서버 응답에 반사되어 실행되는 공격이며, DOM-based XSS는 클라이언트 측 JavaScript가 외부 입력값을 안전하지 않게 DOM에 삽입하여 발생하는 공격이다.채점 포인트
| 요소 | 포함 여부 |
|---|---|
| Stored = 서버 저장 | 필수 |
| Reflected = 요청값 반사 | 필수 |
| DOM-based = 클라이언트 DOM 처리 | 필수 |
| 사용자 브라우저 실행 | 중요 |
실기 예제 3
문제: CSRF의 개념과 대응 방안을 설명하시오.
좋은 답안
CSRF는 사용자가 웹사이트에 로그인된 상태를 악용하여 사용자가 의도하지 않은 요청을 서버에 전송하게 만드는 공격이다. 대응 방안으로는 예측 불가능한 CSRF Token을 생성해 서버에서 검증하고, SameSite 쿠키 설정, Origin/Referer 검증, 중요 기능 재인증, GET 방식의 상태 변경 금지 등을 적용해야 한다.채점 포인트
| 요소 | 포함 여부 |
|---|---|
| 로그인 상태 악용 | 필수 |
| 원치 않는 요청 | 필수 |
| CSRF Token | 매우 중요 |
| SameSite | 중요 |
| 재인증 | 좋음 |
실기 예제 4
문제: XSS와 CSRF의 차이를 설명하시오.
좋은 답안
XSS는 웹페이지에 삽입된 악성 스크립트가 사용자 브라우저에서 실행되어 쿠키 탈취, 피싱, 화면 변조 등을 유발하는 공격이다. CSRF는 사용자가 로그인된 상태를 악용하여 사용자가 의도하지 않은 요청을 서버에 전송하게 만드는 공격으로, 핵심 대응은 CSRF Token과 SameSite 쿠키 설정이다.채점 포인트
| 요소 | 포함 여부 |
|---|---|
| XSS = 스크립트 실행 | 필수 |
| CSRF = 요청 위조 | 필수 |
| XSS 피해 예시 | 좋음 |
| CSRF 대응 예시 | 좋음 |
실기 예제 5
문제: 파일 업로드 취약점의 위험과 대응 방안을 설명하시오.
좋은 답안
파일 업로드 취약점은 업로드 파일의 확장자, 내용, 크기, 저장 위치, 실행 권한 등을 검증하지 않아 웹셸이나 악성 파일이 서버에 업로드·실행될 수 있는 취약점이다. 대응 방안으로는 허용 확장자 방식 적용, MIME Type과 파일 시그니처 검증, 파일 크기 제한, 파일명 난수화, 웹 루트 외부 저장, 업로드 디렉터리 실행 권한 제거, 접근통제, 악성코드 검사 등을 적용해야 한다.채점 포인트
| 요소 | 포함 여부 |
|---|---|
| 파일 검증 미흡 | 필수 |
| 웹셸·악성 파일 | 필수 |
| 허용 확장자 | 중요 |
| 파일 시그니처 검증 | 좋음 |
| 저장 경로 분리 | 중요 |
| 실행 권한 제거 | 매우 중요 |
실기 예제 6
문제: 웹셸 업로드를 방지하기 위한 대책을 설명하시오.
좋은 답안
웹셸 업로드를 방지하기 위해 업로드 가능한 확장자를 허용목록 방식으로 제한하고, MIME Type과 파일 시그니처를 함께 검증해야 한다. 또한 업로드 파일은 웹 루트 외부에 저장하고 파일명을 난수화하며, 업로드 디렉터리의 스크립트 실행 권한을 제거하고 악성코드 검사와 접근통제를 적용해야 한다.채점 포인트
| 요소 | 포함 여부 |
|---|---|
| 허용목록 확장자 | 필수 |
| MIME·시그니처 검증 | 중요 |
| 웹 루트 외부 저장 | 필수 |
| 실행 권한 제거 | 필수 |
| 파일명 난수화 | 좋음 |
| 악성코드 검사 | 좋음 |
핵심 요약
| 개념 | 한 줄 요약 |
|---|---|
| XSS | 악성 스크립트가 사용자 브라우저에서 실행되는 공격 |
| Stored XSS | 악성 스크립트가 서버에 저장되어 실행 |
| Reflected XSS | 요청값이 응답에 반사되어 실행 |
| DOM-based XSS | 클라이언트 측 DOM 처리 과정에서 발생 |
| XSS 피해 | 쿠키 탈취, 세션 탈취, 피싱, 화면 변조 |
| 출력값 인코딩 | 입력값이 코드가 아니라 문자로 표시되게 처리 |
| CSP | 허용된 스크립트만 실행하도록 제한 |
| HttpOnly | JavaScript 쿠키 접근 제한 |
| CSRF | 로그인 상태를 악용해 원치 않는 요청 전송 |
| CSRF Token | 요청 정당성을 검증하는 예측 불가능한 값 |
| SameSite | 다른 사이트 요청 시 쿠키 전송 제한 |
| Origin/Referer 검증 | 요청 출처 확인 |
| 재인증 | 중요 기능 수행 전 추가 인증 |
| 파일 업로드 취약점 | 악성 파일 업로드·실행 가능 취약점 |
| 웹셸 | 웹을 통해 서버를 조작할 수 있는 악성 스크립트 |
| 허용 확장자 | 필요한 확장자만 업로드 허용 |
| 파일 시그니처 | 실제 파일 내용 기반 형식 확인 |
| 저장 경로 분리 | 웹 루트 외부 저장 |
| 실행 권한 제거 | 업로드 파일의 서버 실행 차단 |
| 파일명 난수화 | 경로 조작과 덮어쓰기 방지 |
필수 암기 문장
아래 문장들은 필기와 실기 모두 중요합니다.
XSS는 웹 애플리케이션이 사용자 입력값을 안전하게 처리하지 않아 악성 스크립트가 사용자 브라우저에서 실행되는 공격이다.
XSS 대응의 핵심은 사용자 입력값을 출력 위치에 맞게 인코딩하여 브라우저가 코드가 아닌 문자로 처리하게 하는 것이다.
Stored XSS는 악성 스크립트가 서버에 저장된 뒤 조회하는 사용자에게 실행되는 공격이고, Reflected XSS는 요청값이 응답에 반사되어 실행되는 공격이다.
DOM-based XSS는 클라이언트 측 JavaScript가 외부 입력값을 안전하지 않게 DOM에 삽입하여 발생한다.
CSP는 허용된 출처의 스크립트만 실행하도록 제한하여 XSS 피해를 완화한다.
HttpOnly 쿠키는 JavaScript의 쿠키 접근을 제한하여 XSS로 인한 세션 쿠키 탈취 위험을 줄인다.
CSRF는 사용자가 로그인된 상태를 악용하여 사용자가 의도하지 않은 요청을 서버에 전송하게 만드는 공격이다.
CSRF 대응을 위해 CSRF Token 검증, SameSite 쿠키 설정, Origin/Referer 검증, 중요 기능 재인증, GET 방식의 상태 변경 금지를 적용해야 한다.
파일 업로드 취약점은 파일 확장자, 내용, 크기, 저장 위치, 실행 권한 등을 검증하지 않아 웹셸이나 악성 파일이 서버에 업로드될 수 있는 취약점이다.
웹셸은 웹 서버에서 실행되어 공격자가 서버 명령 실행, 파일 조작, 내부 정보 조회 등을 수행할 수 있게 하는 악성 스크립트이다.
업로드 파일은 허용 확장자 방식, MIME Type과 파일 시그니처 검증, 파일명 난수화, 웹 루트 외부 저장, 실행 권한 제거, 접근통제, 악성코드 검사를 적용해야 한다.연습 과제
다음 문제를 풀고 정답 및 해설과 대조한다.
A. 단답형
1. XSS란 무엇인가?
2. XSS의 주요 피해 4가지를 쓰시오.
3. Stored XSS란 무엇인가?
4. Reflected XSS란 무엇인가?
5. DOM-based XSS란 무엇인가?
6. Stored XSS와 Reflected XSS의 차이를 쓰시오.
7. XSS 대응 방안 5가지를 쓰시오.
8. 출력값 인코딩이 XSS 방어에 중요한 이유는 무엇인가?
9. CSP란 무엇인가?
10. HttpOnly 쿠키가 XSS 피해 완화에 도움이 되는 이유는 무엇인가?
11. CSRF란 무엇인가?
12. CSRF가 발생하는 핵심 조건은 무엇인가?
13. CSRF 대응 방안 5가지를 쓰시오.
14. CSRF Token이란 무엇인가?
15. SameSite 쿠키가 CSRF 대응에 도움이 되는 이유는 무엇인가?
16. XSS와 CSRF의 차이를 쓰시오.
17. 파일 업로드 취약점이란 무엇인가?
18. 웹셸이란 무엇인가?
19. 파일 업로드 취약점의 위험 4가지를 쓰시오.
20. 파일 업로드 보안 대책 7가지를 쓰시오.
21. MIME Type만으로 파일 검증을 하면 안 되는 이유는 무엇인가?
22. 업로드 파일을 웹 루트 외부에 저장해야 하는 이유는 무엇인가?
23. 업로드 디렉터리 실행 권한을 제거해야 하는 이유는 무엇인가?B. 상황 매칭 문제
아래 상황에 적합한 공격 또는 대응책을 쓴다.
24. 게시판 댓글에 삽입된 악성 스크립트가 다른 사용자 조회 시 실행되었다.
25. 조작된 검색 URL을 클릭했더니 검색 결과 페이지에서 스크립트가 실행되었다.
26. 브라우저 JavaScript가 URL 조각 값을 검증 없이 DOM에 삽입했다.
27. 사용자 브라우저에서 쿠키 접근을 제한하고 싶다.
28. 허용된 출처의 스크립트만 실행되도록 제한하고 싶다.
29. 로그인된 사용자가 외부 페이지 접속 후 원치 않는 비밀번호 변경 요청을 보냈다.
30. 상태 변경 요청이 정상 페이지에서 온 것인지 서버에서 검증하고 싶다.
31. 다른 사이트에서 발생한 요청에 세션 쿠키가 자동 전송되는 것을 제한하고 싶다.
32. 이미지 업로드 기능에 서버에서 실행 가능한 악성 스크립트 파일이 업로드되었다.
33. 업로드 파일이 URL로 직접 접근되어 서버에서 실행되었다.
34. 파일 확장자는 이미지처럼 보이지만 실제 내용은 이미지가 아니다.
35. 업로드 파일명에 경로 조작 문자열이 포함되어 있다.C. 실기형 답안 작성
다음 5문제는 2~3문장으로 답안을 작성한다.
36. XSS의 개념과 대응 방안을 설명하시오.
37. Stored XSS, Reflected XSS, DOM-based XSS의 차이를 설명하시오.
38. CSRF의 개념과 대응 방안을 설명하시오.
39. XSS와 CSRF의 차이를 설명하시오.
40. 파일 업로드 취약점의 위험과 대응 방안을 설명하시오.보완 학습 및 연습 과제 정답
문맥별 출력 인코딩과 방어 묶음
XSS 방어의 핵심은 출력 위치별로 다른 인코딩을 적용하는 것이다. HTML 본문은 <, >, &, "를 엔티티로 바꾸고, HTML 속성은 따옴표와 공백 처리까지 고려한다. JavaScript 문자열 문맥은 JS 이스케이프를 적용하고, URL 문맥은 URL 인코딩과 허용 스킴 검증을 함께 적용한다.
CSP는 XSS 피해를 줄이는 보조 대책이다. 인라인 스크립트 차단, nonce 또는 hash 기반 허용, 외부 스크립트 출처 제한에 효과가 있지만, 이미 허용된 스크립트의 취약한 DOM 조작이나 정책 오설정까지 해결하지는 못한다.
파일 업로드 방어는 확장자 허용목록, MIME Type 확인, 파일 시그니처 검증, 크기 제한, 파일명 난수화, 웹 루트 외부 저장, 실행 권한 제거, 악성코드 검사, 접근통제를 묶어서 적용한다.
정답 및 해설
A. 단답형 예시 정답: 1 악성 스크립트가 사용자 브라우저에서 실행되는 공격. 2 쿠키 탈취, 세션 탈취, 피싱, 화면 변조. 3 저장형 XSS. 4 반사형 XSS. 5 DOM 처리 과정에서 발생하는 XSS. 6 저장 여부와 실행 경로가 다름. 7 문맥별 인코딩, 입력 검증, CSP, HttpOnly, 안전한 DOM API. 8 코드가 아니라 문자로 처리되게 함. 9 스크립트 실행 출처 제한 정책. 10 쿠키 탈취 완화. 11 로그인 상태를 악용한 위조 요청. 12 자동 쿠키 전송과 상태 변경 요청. 13 CSRF 토큰, SameSite, Origin/Referer, 재인증, GET 변경 금지. 14 예측 불가능한 요청 검증값. 15 교차 사이트 쿠키 전송 제한. 16 XSS는 브라우저 스크립트 실행, CSRF는 요청 위조. 17 악성 파일 업로드·실행 취약점. 18 웹으로 서버를 조작하는 악성 스크립트. 19 명령 실행, 정보 유출, 악성코드 유포, 내부망 공격. 20 허용 확장자, 시그니처, 크기, 파일명 변경, 외부 저장, 실행권한 제거, 검사. 21 조작 가능. 22 직접 실행 차단. 23 서버 실행 방지.
B. 상황 매칭 정답: 24 Stored XSS, 25 Reflected XSS, 26 DOM-based XSS, 27 HttpOnly, 28 CSP, 29 CSRF, 30 CSRF Token 또는 Origin 검증, 31 SameSite, 32 파일 업로드 취약점, 33 저장 경로·실행 권한 문제, 34 파일 시그니처 검증, 35 파일명 난수화와 경로 정규화.
C. 실기형 채점 기준: 핵심 키워드는 문맥별 출력 인코딩, CSP 한계, HttpOnly, CSRF Token, SameSite, Origin/Referer, 파일 시그니처, 웹 루트 외부 저장, 실행 권한 제거이다. 부분점은 개념 25%, 유형 구분 20%, 대응 묶음 40%, 운영상 주의 15%로 부여한다. 입력값 검증만으로 XSS가 해결된다고 쓰거나 MIME Type만 신뢰한다고 쓰면 감점한다.