XSS / CSRF

devAnderson·2022년 1월 24일
0

TIL

목록 보기
38/106

XSS란

Cross site scripting의 약자로, 웹 어플리케이션의 취약점을 이용해 여러가지 코드를 이용하여 자바스크립트를 실행하게 만들어 타격하는 공격방식이다. 공격에 성공하면, 사용자의 브라우저는 의도치않게 삽입된 코드를 실행하여 의도치 않은 행위가 발생하거나 쿠키, 세션등과 같은 보안정보를 탈취당하게 된다.

공격은 보통 html을 이용하여 이루어진다. 즉, 여러 사용자가 접근이 가능한 게시판 등을 이용해 코드를 삽입한다. 공격방법이 자바스크립트의 원론적인 방식을 취하는 경우가 많아, 해당 내용에 대해 방어가 되어있지 않은 웹사이트가 많아 공격이 성공되는 경우가 많아 주의해야 한다.

공격방식은 보통 아래와 같다

1. reflected XSS

스크린샷 2022-01-24 오전 11 09 53

이메일에 XSS 공격이 스크립트 태그에 담긴 URL을 보내서 사용자가 그것을 누르도록 유도한다.

예를들어,

Link : http://test.com?=test=<script>alert("hello")</script>

와 같은 링크를 난독화나 인코딩하여 일반 URL 처럼 보이게 한 후, 사용자가 이것을 누르면 브라우저의 alert로 hello가 뜨게 된다.
만약, 쿠키나 세션의 탈취 코드가 해당 스크립트 태그에 적혀있다면 이것이 실행되어버리기때문에 위험하다.
스크린샷 2022-01-24 오전 11 13 52

위의 내용처럼, 스크립트 태그에 자동으로 document의 location을 해당 주소로 바꾸게 하여, 해당 주소는 query를 날려 현재 cookie의 저장값을 확인해 전달하게 만들면 공격이 성공된다
물론, 요즘에는 쿠키 옵션으로 httpOnly를 통해 저런식으로 접근조차 할 수 없지만, 오래된 사이트에는 해당 공격이 성공할 경우가 있다...(쿠키에 옵션설정이 없을경우)

2. stored XSS

스크린샷 2022-01-24 오전 11 15 55

게시판과 같은 장소는 그대로 html을 노출시킬 수 있다는 방식을 이용, script 태그를 집어넣어 해당 내용이 그냥 문자열로 나오는지, 아니면 진짜로 스크립트로 실행이 되는지 확인해보는 형태이다. 사용자가 만약 게시글을 눌렀을 때 해당 태그가 실행되면 XSS 공격이 성공되는 것이다.

XSS 를 방어하기 위해서는

  1. 개발자 입장에선 script문자열을 필터링해줘야한다. 또한 XSS Cheat Sheet에 대한 필터목록을 만들어놓고, 모든 치트시트를 대응해야한다.
  2. 그것이 어렵다면 XSS를 방어하는 라이브러리, 브라우저의 확장기능을 사용한다
  3. 사용자는 웹 방화벽을 사용한다.

CSRF란

cross-site request forgery의 약자로, 쿠키와 같은 방식으로 사용자 인증이 브라우저에 저장되어 있는 상태에서의 요청을 서버가 그대로 신뢰한다는 점을 이용, 이 인증내용자체를 탈취하여 공격을 하는 방식이다.

스크린샷 2022-01-24 오전 11 29 11

예를들어, 유저가 타 사이트로부터 로그인하여 쿠키를 얻어왔다고 가정하자.
위의 내용처럼 쿠키 옵션이 samesite=none으로 의도적으로 설정이 되어 있을 경우(서드파티 활용 허가를 위해서 설정했는 경우 등)

해당 쿠키는 어느 사이트로 링크를 통해 이동을 하게 되든 같이 붙여져서 날아가게 된다.

만약 위의 내용처럼, attacker가 이메일로 공격사이트를 보내고, 해당 사이트 내용에 form태그를 통해서 post 요청을 실제 타사이트에 전송을 하도록 한다고 하자.

서버로는 쿠키가 자동으로 붙여서 전송되기 때문에 서버입장에선 쿠키만 보고 사용자라고 착각하고 그대로 input에 있는 value대로 비밀번호를 바꿔버리게 된다.

이것이 바로 CSRF 공격 시나리오이다.

즉, cross-origin간의 write가 가능하다는 점을 이용한 공격이다.

하지만 만약 쿠키의 옵션이 strict 으로 설정되어 있다면, same site가 아니라면 쿠키가 전송되지 않는다.

스크린샷 2022-01-24 오전 11 34 20

same site란, .com과 같은 public suffix에서 바로 하위 도메인까지 확인하여 같은지 아닌지만 확인하여 쿠키의 전송을할지 말지를 정한다.

추가적으로, 만약 쿠키의 옵션이 lax라면, strict처럼 same site에만 쿠키전송이 가능한 것은 동일하지만 a href나, document.location을 이용한 top-level navigations(타사이트로의 이동)의 경우에는 쿠키전송이 가능하다. (즉, 내가 만약 타 사이트에서 a href링크를 통해 쿠팡과 같은 사이트에 접속하려고 할때, 내 브라우저에 저장된 same-site가 lax인 옵션을 가진 쿠키들은 해당 사이트에게 같이 전송이 된다. 그러면 쿠팡은 해당 쿠키들을 보고 맞춤형 광고를 보여줄 수 있게 된다)

profile
자라나라 프론트엔드 개발새싹!

0개의 댓글