Web Hacking/Study Notes

[ Web ] Client-Side basic

S!_Jmini 2020. 7. 30. 22:59

 

 

 

 


클라이언트 사이드 취약점들은 본인을 식별하기 위한 사용자 정보, 

 

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

 

사용자의 브라우저에서 자바스크립트를 실행하여 사용자가 보낸 것처럼 

 

요청을 전송하는 것을 주 목적으로 합니다. 

 

 

 

# Keyword

 

- Same Orgin Policy(SOP)

: scheme, host, port의 구성 요소를 가지며 모두 같은 값을 가지고 있다면 동일한 오리진(Origin)이라고 합니다.

 

 

# Content

 

1. Cross Site Scription (XSS)

: 공격자의 입력값이 크로스 사이트의 자바스크립트 일부로 웹 브라우저에서 실행되는 취약점

실행된 스크립트는 해당 사이트의 일부가 되어 SOP 제약 없이 사이트의 구조를 변경하거나

임의 HTTP 요청을 보낼 수 있습니다. 

조건

- 입력한 데이터가 충분한 검증 과정이 이루어지지 않아 악성 스크립트가 삽입될 수 있어야 합니다. 
- 서버의 응답 데이터가 웹 브라우저 내 페이지에 출력 시 충분한 검증 과정이 없어야 합니다. 
- 응답 데이터 출력 시 악성 스크립트가 웹 브라우저의 렌더링 과정에 성공적으로 포함되어야 합니다. 

 

 

분류

 

1) Stored XSS 

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

주로 게시글에 스크립트를 작성해두고 다른 사용자가 게시글을 읽으면 실행


2) Reflected XSS 
: 사용자의 요청 데이터가 서버의 응답에 포함되는 과정에서 HTML 등의 공격 스크립트가 그대로 출력되어 발생
아래는 방어 기술의 종류들입니다. 

 

 

방어
1. Server-side Mitigations 

2. HTTPOnly 플래그 사용

3. Content Security Policy 사용 
4. X-XSS-Protection 


 

2. Cross Site Request Forgery (CSRF) 

: 비 정상적으로 사용자의 의도와 무관하게 HTTP 요청을 보내는 것.

Simple Request나 HTML 엘리먼트면 SOP의 제약을 받지 않는 다는 점을 이용합니다.

 

 

조건
- 해당 웹 사이트가 쿠키를 이용한 인증 방식을 사용해야 합니다. 
( 모든 HTTP 전송엔 쿠키가 함께 전송되기 때문에 쿠키에 저장된 세션 아이디도 전송 )

- 공격자가 사전에 알 수 없는 파라미터가 존재해서는 안됩니다.
( 자동입력 방지 문자를 넣어야 하는 요청 )
( 패스워드 변경 기능에서 기존 패스워드를 입력 받는 요청 )

왼쪽의 Request 정보를 파악하여, 오른쪽에서 악용한 사례


방어 
- 세션 쿠키 대신 커스텀 헤더를 사용하여 사용자 인증 
- 공격자가 예측할 수 없는 파라미터 추가 및 검증 
( CSRF Token , CAPTCHA )



3. Open Redirect 

: Redirect 기능을 악용해 피싱사이트로 접속을 유도하거나, 다른 취약점을 연계하여 사용자를 공격할 수 있습니다. 
* Redirect(리다이렉트)는 사용자의 Location(위치)를 이동 시키기 위해 사용하는 기능 중 하나 입니다. 

 

리다이렉트 예시

 


방어 
- 리다이렉트 기능 구현 시 이동을 허용할 주소들에 대해서만 이동
- 서버에서 해당 링크에 대한 검증을 거친 후 사용자에게 배포

 

 

 


4. Click Hijacking 

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

방어 
부모 페이지의 URL을 제한하는 방식으로 클릭재킹을 방어 

 

 

 

 

 

 

 

# Advanced

 

1. 대소문자 구분을 하지 않을 시 우회

 

<sCRipT>alert(document.cookie)</scriPT>

 

 

 

2. src 속성을 이용하여 데이터 입력

 

<sCrIpt src=data:,alert(document.cookie)></SCRipt>

 

 

 

3. base64 인코딩을 통해 우회

 

<sCrIpt src=data:;base64,YWxlcnQgKGRvY3VtZW50LmNvb2tpZSk7></SCRipt>

 

 

 

4. 멀티라인 미검증시 우회

 

<img src=""
onerror = alert(documentcookie) />

 

 

 

5. 다른 태그를 이용해 우회

 

<video><source onerror=alert(document.cookie) /></video>

 

 

 

6. on, script 필터링 우회

 

<iframe srcdoc='<img src=about: o&#110;error=parent.alert(document.domain)>'></iframe>

 

 

 

7. 자바스크립트 기능 를 이용한 필터링 우회

 

this['al'+'ert'](this['docu'+'ment']['coo'+'kie']);
this['al'+'ert']((({'\u0063ookie':x})=>x)(self['\x64ocument']))
Boolean[atob('Y29uc3RydWN0b3I')](atob('YWxlcnQoZG9jdW1lbnQuY29va2llKQ'))();

 

=> alert(document.cookie);