웹 해킹 | XSS란? ①

나쵸 소스
|2021. 8. 24. 01:56

해킹에 대해 정말 찍먹도 아닌 손가락으로 소스만 살짝 찍어먹는 느낌으로 하는 중이지만

유튜브에 이것저것 자료 찾아보니 영어로 되어있는 자료들이 무척이나 많았다 역시 영어공부는 꾸준히

그 중 개인적으로 괜찮다고 생각한 유튜브 영상과 함께 해킹 관련 지식들을 정리해보고자 한다 :)

드림 핵이라는 플랫폼을 통해서도 해킹 공부를 하고있는데 정말 좋은 질의 내용들이 많으니 강력 추천!

앞으로 여러 유튜브 강의와 드림 핵에 있는 강의 내용, 구글링 및 책을 통해 이 블로그에 정리해서 써볼 예정이다

 

※ 최대한 찾아보며 정리해보려고 하지만, 저도 배워가는 학생으로서 정리한 글이니 오류가 생길 수 있습니다.

오류가 있어도 양해 부탁드립니다! 오류 지적 정말 환영합니다 :)

 


XSS란?

CROSS-SITE SCRIPTING  라고 불리기도 하는 이 XSS는 간단하게 말하면 웹 페이지에 스크립트를 삽입하여 침투하는 방식이라 생각하면 될 것같다. HTML에서 <script></script>라는 태그를 통해 자바스크립트 코드를 삽입할 수가 있는데, 이 스크립트 태그를 이용해서 침입을 할 수도 있는 것같다. (HTML에는 다양한 태그가 존재하기 때문에 당연히 script 태그 말고도 이벤트 핸들러나 다른 태그를 통해서도 칩입이 가능할 것이다)

대부분 xss 공격에는 ① Reflected XSS② Stored XSS 라고 불리는 2가지 방식이 쓰인다고 한다. (악성 스크립트의 전달방식 차이)

 

 

① Reflected XSS (Non-persistent)

단어 자체에 'Reflected' 라는 말이 들어있으니, 이와 관련된 뜻인건 당연지사일거라 생각

드림 핵 web hacking 강의에서의 설명을 보니, (출처 : https://dreamhack.io/lecture/curriculums/1)

Reflected XSS는 악성 스크립트가 사용자의 요청과 함께 전송되는 형태이며 사용자가 요청한 데이터가 서버의 응답에 포함되어 HTML 등의 악성 스크립트가 그대로 출력되어 발생하게 된다고 정의한다.

 

대표적으로는 특정 링크를 유도하는 방식이 있다고 한다. (요즘 많이 보이는 코로나 관련 보이스피싱 문자가 그런건가 싶다. 해당 링크에 들어가게 되면 개인정보가 다 유출되는...) Reflected XSS에 관해서 계속 찾아보니 공통점들은 URL과 관련해서 악성코드를 전달하나보다.

Reflected XSS에 관하여 더 자세한 설명이 없을까하여 유튜브에 검색해봤는데 설명이 괜찮은 것같아 가져와봤다 

저 영상을 참고로 Reflected XSS의 이해를 위해 좀 더 써보겠다. Reflected XSS가 실행되는 과정은 다음과 같다.

 


 

STEP 1 ) Baddie가 User에게 악성코드가 담긴 URL 을 보낸다. (Baddie sends URL(containing code) to User)

(URL이란 Uniform sort locator 의 약자이며 흔히 웹 브라우저 주소창에 있는 것을 말함)

Baddie는 URL을 삽입할 특정 웹사이트를 선택하여 그들의 JavaScript code를 URL에 넣는다. 그리고 Baddie는 그 URL을 User에게 보낸다.

근데 도대체 그 URL을 User에게 보내는데? => phishing attack 같은 형식으로 User가 특정 링크를 클릭할 수 있게끔 만든다. (이메일이라던지)

 

STEP 2 ) User가 해당 URL을 클릭한다. (User clicks on URL)

이를 통해 URL은 web server에게 request를 보내게 된다. 그러면 request를 받은 web server는 뭐하는데?

 

STEP 3) 취약한 웹사이트는 코드를 User에게 반사시킨다. (Vulnerable website reflects code)

웹 페이지는 유저에게 URL였던 Javascript code를 포함하여 반사시켜 보내게 된다.

아 그래서 여기서 반사 라는 말이 나와서 Reflected XSS라고 하나보다.

 

STEP 4) User의 브라우저는 코드를 실행하게 된다. (User's browser executes code)

웹을 파싱하기 시작하여 Attacker가 보낸 JavaScript code가 공격하게 될 것이다.

 

STEP 5) User의 정보가 Baddie에게 보내지게 된다. (User's info is sent to Baddie)


Reflected XSS는 특정 유저가 링크를 클릭했을 때 발생하는 것이므로 Attack이 persistent하지 않다. (비지속적임) 그러므로 Reflected XSS를 Non-persistent라고 부르기도 한다.

 

 

 

② Stored XSS (persistent)

이번엔 'Stored'라는 단어가 포함되어있다. 그렇다면 무언가 데이터와 관련된 느낌의 기법이라고 예상이 된다.

이번에도 드림 핵  Web hacking 강의에서의 내용을 가져오자면 (Reflected XSS 설명에서의 링크와 동일)

악성 스크립트가 서버 내에 존재하는 데이터베이스 또는 파일 등의 형태로 저장되어 있다가 사용자가 저장된 악성 스크립트를 조회하는 순간 발생하는 형태의 XSS 라고 한다. 

그냥 쉽게 생각하면 약간 구글링하다가 게시물 잘못 클릭해서 막 바이러스 걸리고 그런 느낌인가보다

Stored XSS 설명에서도 위 영상을 참고하여 정리해보겠다. 개인적으로 저 유튭 채널도 맘에 든다. 설명을 너무 잘함

 


STEP 1) Baddie가 취약한 웹사이트를 발견해낸다.(Baddie discovers vulnerable website)



STEP 2) Baddie가 웹 페이지에 악성코드를 삽입한다. (Baddie injects malicious code into webpage)

그렇게 함으로써 서버는 이 정보들을 저장하게 된다. 



STEP 3) 피해자의 브라우저는 코드를 다운하고 실행하게 된다. (Victim's browser downloads and executes code)

이 경우 특정 웹 서버에 특정 페이지를 방문한 모든 다음 사용자들이 피해자가 된다.

 

STEP 4) 피해자의 정보는 Baddie에게 전달된다. (Victim's info is sent to Baddie)  



Baddie가 웹 서버에 코드를 삽입하게 되면 코드는 서버에 저장하게 되고, 한번 코드가 서버에 저장하게 되면 그 특정 웹페이지의 서버를 방문한 모든 피해자들은 악성코드를 받아 실행하게 되므로 이 attack은 지속적(persistent)으로 일어나게 된다. 이것은 때때로 persistent cross-site라고 불리게 됨 

드림 핵 강의 내용에 따르면 Stored XSS는 웹 브라우저에서 스크립트를 실행하는 것이 Reflected XSS 공격과 동일하지만 웹 서버에 스크립트를 저장했다가 실행된다는 차이점이 있다고 한다. 

 

 

 

(+) DOM (Document Object Model) Based XSS

찾아보니 DOM XSS라는 기법도 있어서 추가적으로 다뤄보려고 한다. 

우선 DOM, 즉 Document Object Model (문서 객체 모델) 이 무엇인지에 대해 알아보자. 구글링의 결과에 따르면 DOM은 XML, HTML 문서의 각 항목을 계층으로 표현하여 생성, 변형, 삭제할 수 있도록 돕는 인터페이스(W3C의 표준) 란다. 

출처 :By ‍Birger Eriksson - 자작, CC BY-SA 3.0,  https://commons.wikimedia.org/w/index.php?curid=18034500

 

그래서 DOM Based XSS가 뭔데? 싶어서 찾아보다가 설명이 괜찮아보이는 블로그 주소를 첨부해본다 https://www.acunetix.com/blog/articles/dom-xss-explained/

영어로 되어있어서 간략하게만 정리를 해보자면 

DOM Based XSS은 웹 애플리케이션이 sanitization하지 않고 Document Object Model에 데이터를 작성하는 경우 가능하며, 공격자는 악의적인 JavaScript 코드와 같은 XSS 콘텐츠를 웹 페이지에 포함하도록 이 데이터를 조작할 수 있다고 한다. (wiki에 따르면 소스코드 추가로 발생한단다)

sanitization 의 뜻이 위생 처리라는 말인데 왜 여기에 쓰는 걸까 해서 찾아봤더니 sanitize-html라는 게 있는데, 악성코드를 막아주는 역할을 하나보다.

더 자세한 HTML sanitization에 대한 설명은 위키에서 (https://en.wikipedia.org/wiki/HTML_sanitization)

 

 

DOM Based XSS에 대한 설명이 잘되어있는 유튭 영상이 있어, 이 영상들로 통해 정리해보고자 한다

스크롤을 내릴 때 마다 동적으로 내용이 로드되는 웹 사이트가 있다고 가정한다. 이 때, URL fragment가 track을 이용하여 스크롤 위치를 나타낸다 (www.@@@@.com#2, www.@@@@.com#3 식으로..)   

위키백과에 따르면 URL fragment는 컴퓨터 하이퍼 텍스트에서 URI 조각은 다른 기본 리소스에 종속 된 리소스를 나타내는 문자열이란다.


만약 유저가 해당 사이트에서 다른 사이트로 이동하고 다시 뒤로 가기 버튼을 누르면 전에 방문했던 사이트는 그들의 마지막 위치를 reload하게 된다
이 때, 사이트에 의해 해석되는 URL fragment 방식에서 취약점이 발생하게 된다.

사이트는 내용에 대한 체크없이 URL fragment로부터 페이지 넘버를 즉각 업데이트를 하게 되는데, 그 뜻은 attacker가 악성코드(Javascript)가 포함된 URL을 만들 수 있다는 뜻이다. (여기서 아까 말한 sanitization하지 않는다는게 그 의미인가 보다) 그리고 누군가가 그 URL에 속아넘어가서 들어가게 되면 JavaScript코드는 브라우저에서 실행하게 된다. 이것이 바로 DOM Based XSS

 

최대한 정말 쉽게쉽게 풀어서 써보았는데 XSS라는 것을 처음 접해본 사람들도 술술 읽어질 만큼 이해가 잘 되었으면 좋겠다 :)

사실은 나도 아마추어 하기도 부끄러울 정도로 매우 미흡한 상태라 이것저것 오류도 많을것이고 자세한 내용을 작성하진 못했다

향후에 이에 대한 실력이 더 쌓여있을 때, 더 설명을 이 곳에 추가해보겠다 (그럴 일이 있기를...)

다음 XSS 게시물에는 이론과 관련하여 가능하면 실습 포스팅을 올려보려고 한다. 다음에 또 봬요!