728x90

1. XSS, CSRF 차이점

 

1) XSS 

: 공격자에 의해 작성된 스크립트가 다른 사용자에게 전달되는 것으로, 다른 사용자의 웹 브라우저 내에서 적절한 검증 없이 실행되어 발생하는 취약점이다.

: 공격자가 작성한 스크립트를 통해 정상 사용자의 세션을 탈취하거나, 웹 사이트를 변조, 악의적인 사이트로 사용자를 이동시킬 수 있다.

 

Reflected XSS Stored XSS
매개변수를 통해 입력 받은 값을 다시 출력해주는 로직이 있을 때 발생하는 취약점
텍스트 입력창에 단순한 텍스트가 아닌 경고문을 출력하는 스크립트를 입력한 경우 스크립트가 실행되면 취약점이 존재
게시물에 악성 스크립트를 삽입함으로써 다른 사용자가 게시물을 열람하였을 때, 해당 브라우저에서 스크립트가 실행되고, 그때 발생한 쿠키 및 세션 정보를 공격자가 얻는 공격이다.

 

1-1) XSS 공격 대응 방안

(1) 입력 값 제한

: 사용자의 입력 값을 제한하여 스크립트를 삽입하지 못하도록 한다.

(2) 입력 값 치환

: XSS 공격은 기본적으로 <script> 태그를  사용하기 때문에 XSS 공격을 차단하기 위해 태그문자(<,>)등 위험한 문자 입력 시 필터링 하거나 인코딩 시킨다.

 

2) CSRF

: XSS 취약점과 유사하게 사용자의 입력 값 검증 및 사용자의 요청 시 세션 쿠키, 출발지 주소 등 올바르게 요청된 것인지 검증을 하지 않았을 경우 발생한다. 공격은 불특정 다수를 대상으로 진행된다.

 

2-1) CSRF  공격 대응 방안

(1) Referrer 검증

:요청 헤더에 있는 referrer 속성을 검증하여 신뢰할 수 있는 도메인에서 들어오는 요청인지 검색

(2) CSRF 토큰 사용 

: 랜덤한 수를 사용자의 세션에 저장하여 사용자의 모든 요청에 대해 서버단에서 검증하는 방법

 

 

3) XSS vs CSRF

: XSS 와 CSRF 공격의 큰 차이점은 공격이 실행되는 위치이다.

XSS CSRF
사용자 PC (클라이언트) 에서 실행되어 사용자의 정보 탈취 사용자 PC (클라이언트) 에서 실행되어 사용자의 정보 탈취

 

 

2. XSS Lv3, Lv4

1) XSS Lv3

Level 3번 문제에서 먼저 각각의 이미지를 눌렀을 때 URL부분에 #뒤 숫자가 변하는 것을 확인 할 수 있다.

 

위의 코드를 보면, 각각의 버튼은 클릭 시 chooseTab() 함수로 값을 보낸다는 걸 확인 할 수 있다.

 

주어진 4개의 힌트를 번역하자면 아래 내용과 같다.
 

1. 버그의 원인을 찾으려면 JavaScript를 검토하여 사용자가 제공한 입력을 처리하는 위치를 확인한다.
2. window.location 개체의 데이터는 공격자의 영향을 받을 수 있다.
3. 주입 지점을 파악한 후, 새로운 HTML 요소를 몰래 삽입하기 위해 무엇을 해야 하는지 생각해 봐라.
4. 이전과 같이 <script> ...를 페이로드로 사용하면 페이지가 로드된 후 추가된 스크립트를 브라우저에서 실행할 수 없다.

 

self.location.hash.substr(1) 은 url 의 # 부분에 있는 값을 가져오게 된다. 따라서 url 에 값을 입력하게 되면 chooseTab() 을 통해 화면에 출력할 수 있다.

 

다음으로 chooseTab() 을 통해 전달된 num 를 통해 html 변수에 num.jpg 를 넣어주고 있는 것을 확인 할 수 있다. 이는 num 의 값을 통해 결과가 출력되는 것으로 3번 힌트를 참고하자면 html에 새로 추가해서 문제를 풀 수 있다고 유추할 수 있다.

 html += "<img src='/static/level3/cloud" + num + ".jpg' />";

 

onerror 를 통해 alert() 를 실행하는 방법을 이용해서 num 부분에 없는 파일을 넣게 되면 아래 사진과 같이 문제가 해결 되었음을 확인 할 수 있다. 

(onerorr : 외부에서 파일을 로드하는 중 에러가 발생할 경우 대체 목적으로 실행되는 이벤트)

 

URL: https://xss-game.appspot.com/level3/frame#4' onerror="alert(1)"> 

 

2) XSS Lv4

아래 버튼을 클릭하면 타이머가 동작되는데 이때 URL에 timer 변수로 3 값이 전달되고 있음을 확인할 수 있다

index.html

아래 코드를 확인하면 get 방식으로 timer 변수가 넘어가는 걸 알 수 있다. 이것으로 URL에 timer=3으로 입력해도 동일하게 타이머가 동작됨을 확인할 수 있다. 

timer.html

여기 코드를 보게 되면 img 태그 부분에 onload 부분에 timer 값이 들어가게 되는 것을 확인할 수 있는데, 이 부분을 ㅅ수정을 하게 되면 원하는 값을 얻을 수 있을 거라유추할 수 있다.

 

{{ timer }} 로 변수 입력 되므로 이 부분을 timer=1');alert('attack 값으로 수정해서 전달하게 되면 아래와 같이 문제가 해결되었음을 확인 할 수 있다.

이때 주의해야할 부분은 URL에 직접입력하는 것으로 세미콜론(;) 을 %3B로 바꿔서 입력해줘야 한다.

'자기개발 > Web' 카테고리의 다른 글

[2022 리버싱: Day 18] 패킹과 언패킹  (0) 2022.02.21
[ 웹스터디 5주차 ]  (0) 2021.11.23
[ 웹 스터디 3주차 ]  (0) 2021.11.07
[ 웹 스터디 2주차 ]  (0) 2021.09.28
[ 웹 스터디 1주차 ]  (0) 2021.09.14

+ Recent posts