XSS (Cross Site Scripting)
- XSS는 웹사이트 취약점 공격의 일종으로, 사용자가 입력한 내용이 웹사이트에 그대로 반영되는 취약점을 이용하여 악의적인 스크립트를 삽입하는 공격입니다.
- XSS 공격에는 크게 Stored XSS와 Reflected XSS 그리고 DOM-based XSS가 있습니다.
XSS 공격의 종류
- Stored XSS -- 저장형 XSS
- XSS 취약점이 있는 웹 서버에 악성 스크립트를 입력해두고 방문자가 해당 페이지를 읽는 순간 방문자의 브라우저를 공격하는 방식이다. 일명 저장 방식이다.
- Reflected XSS -- 반사형 XSS
- 특정 파라미터 값을 통해서 공격하는 방식으로 검색, 에러메시지, URL 등 사용자로부터 입력한 값을 받아 브라우저에게 응답할 때 전송되는 방법이다.
- DOM-based XSS -- DOM 기반 XSS
- Document Object Model의 약자로 DOM 객체를 포함하는 자바스크립트 등을 이용하여 데이터 접근 시 검증되지 않은 입력값이 자바스크립트를 통해 삽입되어 발생하는 취약점을 이용하는 방식으로 URL을 통해 사용자를 공격한다.
XSS 공격 방법
- Script 태그를 이용한 XSS 공격 : script 태그를 이용하여 XSS 공격을 수행합니다.
<script> alert("XSS"); </script>
- javascript URL을 이용한 XSS 공격 : javascript URL을 이용하여 XSS 공격을 수행합니다.
<a href="javascript:alert('XSS');">XSS</a>
- onerror 이벤트를 이용한 XSS 공격 : 이미지가 로드되지 않을 때 발생하는 onerror 이벤트를 이용하여 XSS 공격을 수행합니다.
<img src="http://example.com/404.png" onerror="alert('XSS');" />
- 블랙리스트 우회를 이용한 XSS 공격 : 블랙리스트에 있는 태그를 우회하여 XSS 공격을 수행합니다.
<ruby
src="http://example.com/404.png"
onerror="alert(String.fromCharCode(88,83,83));"
/>
- 난독화를 이용한 XSS 공격 : 난독화를 이용하여 XSS 공격을 수행합니다.
<a href="javas
c&#
x72;ipt
:
alert

('XSS')">XSS</a>
XSS 공격 방어
- 입력값 검증
- 사용자의 입력값을 검증하여 XSS 공격을 방어합니다.
- 입력값을 검증할 때는 블랙리스트 방식과 화이트리스트 방식이 있습니다.
- 블랙리스트 방식 : 특정 문자를 제거하는 방식입니다.
- 화이트리스트 방식 : 특정 문자만 허용하는 방식입니다.
- 현업에서는 화이트리스트 방식을 사용합니다. (블랙리스트 우회를 이용한 XSS 공격을 방어하기 위함)
- HTTPOnly 쿠키 설정
- HTTPOnly 쿠키는 자바스크립트에서 접근할 수 없는 쿠키입니다.
- HTTPOnly 쿠키를 사용하면 XSS 공격을 방어할 수 있습니다.
- Content Security Policy (CSP) - 콘텐츠 보안 정책
- CSP는 웹 페이지에서 로드할 수 있는 리소스의 종류를 제한하는 보안 방식입니다.
CSRF (Cross Site Request Forgery)
- CSRF는 웹사이트 취약점 공격의 일종으로, 사용자가 의도하지 않은 요청을 웹사이트에 전송하는 공격입니다.
- CSRF 공격은 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 하게 만드는 공격입니다.
CSRF 공격의 예시
- CSRF 공격은 다음과 같은 예시로 설명할 수 있습니다.
- 공격자는 다음과 같은 코드를 작성합니다.
<form action="http://example.com/transfer" method="POST">
<input type="hidden" name="account" value="1234567890" />
<input type="hidden" name="amount" value="1000000" />
<input type="submit" value="송금하기" />
</form>
- 공격자는 위의 코드를 웹사이트에 삽입합니다.
- 사용자는 공격자가 삽입한 코드를 클릭합니다. (사용자가 의도하지 않은 요청)
- 사용자는 자신의 의지와는 무관하게 공격자가 의도한 행위를 하게 됩니다. (계좌에 100만원이 송금됨)
CSRF 방어 방법
- CSRF 공격을 방어하기 위해서는 다음과 같은 방법을 사용할 수 있습니다.
- Referer 검증 : 요청을 보낸 웹사이트의 주소를 검증합니다.
- HTTP Referer 헤더는 요청을 보낸 웹사이트의 주소를 포함하고 있습니다.
- Referer 헤더를 검증하여 요청을 보낸 웹사이트의 주소를 확인할 수 있습니다.
- 하지만, 해당 정보는 ZAP 등의 툴을 사용하면 쉽게 확인할 수 있기 때문에, Referer 헤더를 검증하는 것은 취약점 공격에 취약합니다.
- CSRF 토큰 : 요청을 보낼 때 CSRF 토큰을 같이 보내고, 서버에서 CSRF 토큰을 검증합니다.
- 서버에서 hash 로 암호화한 CSRF 토큰을 생성합니다. (ex. SHA-256)
- 사용자는 매번 요청을 보낼 때마다 CSRF 토큰을 같이 보냅니다.
- GET/POST 요청 구분하기 : GET/POST 방식을 구분하여 요청을 보냅니다.
- GET 방식은 CSRF 공격에 취약하기 때문에 img 태그는 GET 방식으로 요청을 보내고, form 태그는 POST 방식으로 요청을 보냅니다.
- 참고로 필자는 스터디 때 GET/POST 방식의 차이를 발표한적이 있었는데, 그 때는 왜 이 2개를 구분하는지에 대해서는 잘 모르고 있었습니다. 그래서 이번에 CSRF 공격에 대해서 공부하면서 GET/POST 방식을 구분하는 이유를 알게 되었습니다. (GET 방식은 CSRF 공격에 취약하기 때문에)
- 추가 인증 : CAPTCHA, OTP 등을 사용하여 추가 인증을 요구합니다.
- 사용자가 인증을 완료해야만 요청을 보낼 수 있습니다.
Reference