네 안녕하세요. 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
2. Stored XSS
3. DOM XSS
2. XSS 취약점이 발생하는 이유
클라이언트 입장에서 XSS필터링을 끄거나, 서버 입장에서 악의적인 문구의 필터링이 안되어 발생하는게 가장 큰 이유입니다.
필터링이 잘 안되어 발생하고, 악의적인 문장을 인젝션 한다는 부분에서 SQL injection이랑 많이 닮아 있습니다. 하지만 차이점은 SQL injection은 서버의 DB 를 공격하지만 XSS는 다른 클라이언트, 즉 사이트를 사용하는 유저에게 발생하는 공격이라는 겁니다.
이렇게 조사하다보니 위에서 언급하였던 피해자가 크롬일 경우 공격자가 불리하다는 말이 조금씩 이해가기 시작했습니다. Chrome, IE 같은 경우 내부적으로 XSS를 보호해주는 보안기능이 있다 합니다. (Firefox도 있긴 한데 일 잘 안한다고 하더라고요)
3. XSS 취약점을 공격하는 방법
4. 공격 예제
1. XSS GAME LEVEL.1
왠만하면 균일하게 ROOT ME의 XSS 문제로 풀어드리려고 했는데.. 조금 어렵더라고요.. 푸는 대로 추가하겠습니다.
제가 문제 풀 때는 크롬의 번역기능을 사용하여 번역 후에 풀었습니다.(영어를 못하는게 아니라.. 저거 해석하기 넘나 귀찮아서..)
스크립트를 읽고 해석하여 alert를 내면 되는 것 같습니다.
대충 사이트가 어떻게 구성되어있나 확인해보기 위해, 입력창에 test를 쳐보니 ?query= 이후에 제가 입력한 값이 나왔습니다.
저 곳에 공격문을 넣어보면 되겠다 싶어서 기본적으로 script 에 alert를 시켜보았습니다.
어.. 이 문제 풀 때 따로 target code는 열어보지 않았습니다.
2. LEVEL 2
3. Level 3
onerror 이라는 정보를 알고 시작해서 그런가 이 문제가 오히려 2번 문제보다 더 빨리 풀렸습니다.
이미지 1부터 3까지 왔다갔다하면 #뒤의 숫자가 바뀌길래 없는 값을 주고 onerror을 주려 저렇게 입력해봤으나 아무일도 일어나지 않았습니다.
(지금 보니까 끝에 > 안닫았네요..)
>를 닫으면 사진.jpg />하고 뜹니다.
아 형식 문제구나 하고 #23 뒤에 ' 로 닫아주면
문제가 풀립니다.
LEVEL 4 이상은 푸는 대로 추가하여 올리겠습니다.
5. XSS 취약점을 보완하는 방법
일단 서버측에서는 중요한 정보는 쿠키에 저장하지 않는 것이 중요합니다. 쿠키 스니핑을 통해 중요 정보가 유출될 수도 있기 때문입니다.
그리고 필터링도 해두고, 사용자가 입력가능한 문자를 정해놓는 것이 좋습니다. 블랙리스트 우회 방법은 대중화? 되있는 공격 방법 이기 때문에 화이트리스트 방식 차단을 해두는 것도 좋습니다.
사용자가 입력을 하는 곳에는 html 형식의 글을 쓸 수 없도록 합니다.
사용자 측에서는... 개발자나 보안 확인을 위해서가 아니면 XSS필터를 켜둡시다. default 값이 켜있기에 끄지 맙시다. 그리고 웹 브라우져 업데이트가 나오면 자주 업데이트 하는 것도 좋습니다.
'web_security > web info' 카테고리의 다른 글
[WebHacking] 파일업로드 취약점(File Upload Vulnerability)이란?(New) (0) | 2022.06.01 |
---|---|
[WebHacking] XSS (Cross Site Scripting) 란?(New) (2) | 2022.05.29 |
파일 업로드(File-Upload) 취약점이란? (0) | 2019.09.21 |
RFI(Remote File Inclusion) 란? (0) | 2019.09.14 |
LFI(Local File Inclusion)란? (3) | 2019.09.13 |