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() 함수로 값을 보낸다는 걸 확인 할 수 있다.
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 값이 전달되고 있음을 확인할 수 있다
아래 코드를 확인하면 get 방식으로 timer 변수가 넘어가는 걸 알 수 있다. 이것으로 URL에 timer=3으로 입력해도 동일하게 타이머가 동작됨을 확인할 수 있다.
여기 코드를 보게 되면 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 |