강의 및 교육/Inflearn - Webgoat

Cross Site Scripting - 10 & 11 & 12

이우정 2022. 2. 23. 22:23
728x90

Concept

이 단원에서는 XSS(Cross-Site Scripting)가 무엇이며 개발자의 원래 의도가 아닌 작업을 수행하는데 어떻게 사용될 수 있는지 설명합니다.

 

Goals

사용자는 XSS가 무엇이고 어떻게 작동하는지에 대한 기본적인 이해를 가져야 한다. 사용자는 Reflected XSS와 DOM-based XSS Injection에 대해 알게 될 것이다. 

 

What is XSS?

Cross-Site Scripting(XSS)은 인코딩 또는 거사없이 브라우저에 렌더링 되는 입력으로 html/script tag 허용을 결합한 취약점이다. 

 

Cross-Site Scipting(XSS) is the most prevalent(널리 퍼진) and pernicious(치명적인) web application security issue

이 공격에 대한 간단한 잘 알려진 방어가 있지만 웹에서는 여전히 많은 사례가 있다. 그것을 고치는 측면에서도 coverage가 문제되는 경향이 있다. 

 

XSS has significant impact

특히 'Rich internet Applications'가 점점 더 보편화됨에 따라 JavaScript를 통해 연결된 권한있는 함수 호출이 손상 될 수 있다. 그리고 제대로 보호되지 않으면 민감한 데이터(ex. 인증 쿠키)를 도난 당할 수 있다. 

 

Quick examples : 

- Chrome, Firefox 같은 브라우저 개발자 도구 JS 콘솔

alert("XSS Test");
alert(document.cookie);

- 클라이언트로 반환되는 모든 데이터 필드는 잠재적으로 주입할 수 있다. 

<script>alert("XSS Test")</script>

 

Most common locations

(받은걸 반환하는 경우가 많다.)

- 검색 문자열을 사용자에게 반향하는 검색 필드

- 사용자 데이터를 echo하는 입력 필드

- 사용자 제공 텍스트를 반환하는 오류 메시지

- 사용자 제공 데이터를 포함하는 Hidden field

- 사용자 제공 데이터를 표시하는 페이지 (message 보드, 댓글)

- HTTP 헤더

 

 

Why should we care?

XSS attacks may result in

- session cookies 도난

- 잘못된 요청 생성

- 페이지에 잘못된 필드를 생성하여 인증 정보 수집

- 페이지를 "non-friendly"사이트로 리디렉션

- 기밀 정보를 훔치는 것

- 최종 사용자 시스템에서 악성 코드 실행(액티브 스크립팅)

- 유해하고 부적절한 콘텐츠 삽입

<img src="http://malicious.site.com/image.jpg/>
">GoodYear recommends buying BridgeStone tires...

XSS attacks add validity to phishing attacks

- URL에 유효한 도메인이 사용된다. 

 

Types of XSS

1. Reflected

- 사용자 요청의 악성 콘텐츠가 웹 브라우저에 사용자에게 표시된다. 

- 서버 응답 후 악성 콘텐츠가 페이지에 기록된다. 

- Social Enginerring이 필요하다.

- 브라우저에서 사용자로부터 상속받은 브라우저 권한으로 실행

 

2. DOM-based (also technically reflected)

- 사용자 요청의 악의적인 내용은 클라이언트측 스크립트에서 HTML을 자신의 페이지에 쓰는 데 사용된다. 

- Reflected XSS와 유사

- 브라우저에서 사용자로부터 상속받은 브라우저 권한으로 실행

 

The main difference between DOM based XSS and Reflected XSS is that the DOM-based XSS is a type of XSS that processes data from an untrusted source by writing data to a potentially dangerous sink within the DOM. But, the reflected XSS is a type of XSS that occurs when an application obtains data in an HTTP request and includes that data within the immediate response in an unsafe way.

- DOM : DOM 내의 잠재적 위험 싱크에 데이터를 기록, 신뢰할 수 없는 소스의 데이터를 처리

- Reflected : 응용프로그램이 HTTP 요청에서 데이터를 얻고 안전하지 않은 방식으로 즉각적인 응답 내에 해당 데이터를 포함할 때 발생

 

3. Stored or persistent

- 악성 컨텐츠는 서버(DB, file system, 기타 객체)에 저장되고 나중에 웹 브라우저에 사용자에게 표시된다. 

- 사회 공학(social engineering) 필요없다. 

브라우저에서 사용자로부터 상속받은 브라우저 권한으로 실행

 

Reflected XSS scenario

공격자가 공격 대상자에게 악의적인 URL을 보냄.

피해자가 악의적인 웹 페이지를 로드하는 링크를 클릭함.

URL에 포함된 악의적인 스크립트가 공격 대상자 브라우저에서 실행된다. 

- 스크립트는 세션 ID와 같은 중요한 정보를 훔쳐 공격자에게 공개한다. 

- 피해자는 공격이 발생했다는 것을 알지 못한다. 

피해자가 URL 클릭, 악성 스크립트가 브라우저에게 실행되면 중요 정보가 공격자에게 전달된다.&nbsp;

 

Stored XSS

공격자가 올려놓은 게시판을 피해자가 들어와서 피해자의 쿠키가 자동으로 공격자 서버로 전송됨

 

Reflected and DOM-Based XSS

DOM 기반 XSS는 반사된 XSS의 또 다른 형태이다. 둘 다 브라우저에 반영되는 입력과 함께 링크를 전송함으로써 트리거 된다. DOM과 Reflected XSS의 차이점은 DOM을 사용하면 페이로드가 서버로 전송되지 않는 다는 것. 클라이언트에서만 처리된다. 서버와 관계 없이 브라우저에서 발생

- 공격자는 피해자에게 악의적인 URL을 전송한다. 

- 피해자는 link를 클릭한다. 

- 이 링크는 취약한 route/handler가 있다면 악의적인 웹페이지 또는 공격자의 웹페이지를 로드할 수 있다.

- 악의적인 웹페이지인 경우 자체 JS를 사용하여 취약한 route/handler로 다른 page/url을 공격할 수 있다. 

- 취약한 페이지는 페이로드를 렌더링하고 해당 page/site의 사용자 context에서 공격을 실행한다. 

- 공격자의 악의적인 스크립트가 로컬 계정의 권한으로 명령을 실행할 수 있다. 

- 피해자는 공격이 발생했다는 것을 알지 못한다. 

- 공격자의 악의적인 스크립트가 로컬 계정의 권한으로 명령을 실행할 수 있다. 

 

 

[ 문제 ]

Identify potential for DOM-Based XSS

 

DOM 기반 XSS는 일반적으로 클라이언트 측 코드에서 경로 구성을 검색하여 찾을 수 있다. 페이지에 "reflected(반영)"되는 입력을 가져오는 경로를 찾는다. 

 

이번 예시에서 경로 핸들러에서 일부 'test' 코드를 찾을 수 있다. (WebGoat는 backbone으로 JS library를 사용한다) 때때로 test 코드가 남아있을 수 있다. (테스트 코드는 매우 간단하며 보안이나 품질 관리가 부족할 수 있다) 당신의 목표는 경로를 찾아서 이용하는 것이다. 'base route'는 start.mvc#lesson/ 이고 param은 CrossSiteScripting.lesson/9이다. 그럼, 제작 중에 앱에 남아있던 테스트 코드의 경로는 어떻게 되는가? 

 

hint : http://127.0.0.1:8080/WebGoat/js/goatApp/view/GoatRouter.js를 확인하시오.

 

#의 의미

1) #
#은 브라우저가 리로딩 없이 자바스크립트를 불러오기위한 방법입니다. 동시에 URL을 브라우저 히스토리에 남깁니다. 

 

[ 풀이 ]

http://127.0.0.1:8080/WebGoat/start.mvc#lesson/CrossSiteScripting.lesson/9

 

# 이후를 test/ 로 변경

 

 

[ 문제 ]

Try It! DOM-Basesd XSS

몇몇 공격은 성공여부를 알 수 없다. 다행히 서버가 가동 중이라 성공여부를 알 수 있을 것이다. 방금 찾은 경로를 사용하여 웹고트에서 내부 함수를 실행하는 데 인코딩 없이 경로의 매개 변수를 반영하는지 확인하라. 

사용 함수 : webgoat.customjs.phoneHome()

물론 console/debug로 트리거할 수도 있지만 새탭의 URL을 통해 트리거해야한다. 트리거링한 뒤, 후속 응답이 브라우저의 콘솔에 임의 번호로 표시된다. 그 임의 숫자를 입력하라. 

 

hint

[ 풀이 ]

http://127.0.0.1:8080/WebGoat/start.mvc#test/

뒤에 파라미터가 들어옴.

<script>webgoat.customjs.phoneHome()</script>를 파라미터로 붙임 => 실패

URL 인코딩 필요

숫자 입력 후 성공

 

 

728x90