web_security/web info

XSS (Cross Site Scripting) 란?

HawordFREAKEK 2019. 9. 27. 21:12

네 안녕하세요. Godhaword 입니다.

CTF나 wargame에서 XSS문제를 만나면 공부해볼까? 생각하다가 복잡한 RCE문을 보고 그냥 내려놓기 다반사였는데요. 이번에 한 번 천천히 공부해보기로 했습니다.

자료조사 하기전에 이해가 안 갔던게 아는 분들한테 XSS 관련 글에서 중요한 게 있냐 물어봤더니

" 테스트 할 때, 파이어폭스로 하세요. 크롬에선 스크립트는 안막지만 끼워넣는 스크립트 삽입은 막아요"

라는 말이였습니다.

"? 그럼 제가 공격일 때 크롬이 불리하단거죠?"

" 공격은 관련 없고 피해자가 크롬이면 불리하죠"

... 약간 뇌정지 왔었습니다. 제가 지금까지 하던 SSTI, R(L)FI, SQL Injection 등등 서버나 데이터베이스에 악의적인 공격을 하는 것이였어서, '아... 모지... 그러면 그 사이트 쪽 운영진 들은 크롬만 쓰는건가..' 하고 약간 뇌절 왔긴 했었습니다.

위 대화는 이번 글을 통해 한 번 차근차근 해석해 봅시다.



목차는

1. XSS란?

2. XSS 취약점이 발생하는 이유

3. XSS 취약점을 공격하는 방법

4. 공격 예제

5. XSS 취약점을 보완하는 방법

으로 설명드리겠습니다. 





1. XSS란?

Cross-Site-Scripting, 동적으로 생성되는 웹페이지에 악의적인 HTML 태그나 스크립트를 삽입하는 공격 입니다. (또 인젝션이네)

XSS에는 3가지 종류가 있다고 합니다.

OWSAP 에선 Reflected Xss, Stored Xss, Dom Xss 등이 있다합니다.

일단 밑에 설명을 더 쉽게 이해하기 위하여 공격자와 피해자가 있고, 그 사이에 서버가 있다 생각하시면 편합니다.

쿠키 스니핑이나 악의적인 사이트나 알림창을 보여줄때 많이 쓴다합니다.


1. Reflected XSS

바로 번역하면, 비추는 XSS, 반사하는 XSS 입니다. 
악성 스크립트가 있는 url을 사용자가 클릭하도록 유도하여, 클라이언트를 공격하는 방식입니다. 쪽지나 웹 게시판을 통해 많이 이루어진다고 합니다. 이 방법은 브라우저 자체에서 막는 경우가 많아 공격하기 어렵다 합니다.

2. Stored XSS

어느 사이트에선 Persistent 라고도 하더라고요. Reflected XSS와 유사하나 Reflected XSS는 악성스크립트가 포함된 URL을 사용자가 클릭하게 유도하는 공격방식이고, Stored XSS는 웹 서버에 공격용 스크립트를 입력시켜 놓으면 해당 페이지를 읽는 순간 브라우저를 공격하는 방식입니다.

3. DOM XSS

피해자 브라우저가 HTML 페이지를 구문 분석할 때 공격스크립트가 DOM의 일부로 실행된다는데... 
Q : DOM 이 뭐죠?
DOM, Document Object Model 한글로 바꿔보면, 문서 객체 모델..? 로 해석됩니다. 여러사이트 돌아다니면서 정의 요약해보니. 웹 브라우저가 HTML 페이지를 읽는 방식? 이라고 생각됩니다.. DOM XSS는 추후에 더 공부되면 추가 및 다듬어서 보안하겠습니다..





2. XSS 취약점이 발생하는 이유

클라이언트 입장에서 XSS필터링을 끄거나, 서버 입장에서 악의적인 문구의 필터링이 안되어 발생하는게 가장 큰 이유입니다. 

필터링이 잘 안되어 발생하고, 악의적인 문장을 인젝션 한다는 부분에서 SQL injection이랑 많이 닮아 있습니다. 하지만 차이점은 SQL injection은 서버의 DB 를 공격하지만 XSS는 다른 클라이언트, 즉 사이트를 사용하는 유저에게 발생하는 공격이라는 겁니다.

이렇게 조사하다보니 위에서 언급하였던 피해자가 크롬일 경우 공격자가 불리하다는 말이 조금씩 이해가기 시작했습니다. Chrome, IE 같은 경우 내부적으로 XSS를 보호해주는 보안기능이 있다 합니다. (Firefox도 있긴 한데 일 잘 안한다고 하더라고요)




3. XSS 취약점을 공격하는 방법

글쓰기가 가능한 곳에 html 태크나 script 태그 입력을 하여 원하는 행동이 실행되면, XSS취약점이 있다 판단하여 그 이후 행동을 시작합니다.
*무*키를 가보니 저 두가지 외에도 여러가지 기법이 존재하더라고요.. https://github.com/pgaijin66/XSS-Payloads/blob/master/payload.txt 부지런하게 payload 봐가면서 어느 유형의 문제에는 어떻게 접근해야한다라는 느낌으로 접해야 할 것 같습니다.





4. 공격 예제

1. XSS GAME LEVEL.1

왠만하면 균일하게 ROOT ME의 XSS 문제로 풀어드리려고 했는데.. 조금 어렵더라고요.. 푸는 대로 추가하겠습니다.

제가 문제 풀 때는 크롬의 번역기능을 사용하여 번역 후에 풀었습니다.(영어를 못하는게 아니라.. 저거 해석하기 넘나 귀찮아서..)

스크립트를 읽고 해석하여 alert를 내면 되는 것 같습니다.


대충 사이트가 어떻게 구성되어있나 확인해보기 위해, 입력창에 test를 쳐보니 ?query= 이후에 제가 입력한 값이 나왔습니다.

저 곳에 공격문을 넣어보면 되겠다 싶어서 기본적으로 script 에 alert를 시켜보았습니다.


어.. 이 문제 풀 때 따로 target code는 열어보지 않았습니다.


2. LEVEL 2

어.. 번역하고 보니까 북한 사이트같네요.. 이 문제도 아까와 같이 alert 시키면 되는 뭍제 같습니다.
저 입력창에 원하는 글을 적고 공유를 누르면 페이스북과 같이 글이 올라가는 형태의 사이트 입니다.


아까와 같은 스크립트 문으로 공격을 해봤으나 alert도 안뜨고 오히려 그냥 공란만 공유된 것을 볼 수 있었습니다.
여기서 아.. <script>로 시작하면 그냥 필터링 해버리는 건가.. 하고 생각하여 더 고민하다가 힌트를 내려보았습니다.

onerror 이라는 힌트를 보게 되었고, 그에 관련한 정보를 검색하던 중 이벤트 속성 이란 것을 알게되었습니다.
위와 같이 없는 이미지 파일 값을 주어 error 창을 뜨게 했습니다.
위 문제는 사이트에 어떠한 값을 저장하기에 stored Xss로 보입니다.


3. Level 3

onerror 이라는 정보를 알고 시작해서 그런가 이 문제가 오히려 2번 문제보다 더 빨리 풀렸습니다.

이미지 1부터 3까지 왔다갔다하면 #뒤의 숫자가 바뀌길래 없는 값을 주고 onerror을 주려 저렇게 입력해봤으나 아무일도 일어나지 않았습니다.

(지금 보니까 끝에 > 안닫았네요..)

>를 닫으면 사진.jpg />하고 뜹니다.

아 형식 문제구나 하고 #23 뒤에 ' 로 닫아주면

문제가 풀립니다.


LEVEL 4 이상은 푸는 대로 추가하여 올리겠습니다.



5. XSS 취약점을 보완하는 방법

일단 서버측에서는 중요한 정보는 쿠키에 저장하지 않는 것이 중요합니다. 쿠키 스니핑을 통해 중요 정보가 유출될 수도 있기 때문입니다.

그리고 필터링도 해두고, 사용자가 입력가능한 문자를 정해놓는 것이 좋습니다. 블랙리스트 우회 방법은 대중화? 되있는 공격 방법 이기 때문에 화이트리스트 방식 차단을 해두는 것도 좋습니다.

사용자가 입력을 하는 곳에는 html 형식의 글을 쓸 수 없도록 합니다.


사용자 측에서는... 개발자나 보안 확인을 위해서가 아니면 XSS필터를 켜둡시다. default 값이 켜있기에 끄지 맙시다. 그리고 웹 브라우져 업데이트가 나오면 자주 업데이트 하는 것도 좋습니다.