IT & CODE 이야기

제 6 강 XSS 공격과 방어 해보기 본문

Lecture/Ruby coin(강의)

제 6 강 XSS 공격과 방어 해보기

Karoid 2017. 1. 26. 10:04

# AJAX 사용법

https://youtu.be/fiqApu1t1Vc

# XSS 공격 개요와 실습

https://youtu.be/DoN7bkdQBXU

# 해킹용 서버 구축과 XSS를 통한 세션 탈취

https://youtu.be/cehEkpWl7fg

# XST 공격 기법

https://youtu.be/YvmetHjjPek

# CSRF 공격 기법

https://youtu.be/nzoUgKPwn_A

강의안

정말 오랜만에 현강을 하게 되었는데, 자신이 별로 없어서 글을 써놓고 함께 보면서 강의를 하려고 합니다.
수업에 들어가기 전에 여러분이 처음 로그인 하는 게시판을 만드셨던 것을 기억할 것입니다. 우선 그 게시판에 들어가셔서 글 내용이 보이는 곳을 다음과 같이 편집해주세요

<%=@post.content%>
이 부분을 아래 내용과 같이 바꿔주세요
<%=@post.content.html_safe%>

오늘의 주제

XSS 공격과 방어 해보기!

XSS공격이란?

"크로스 사이트 스크립팅"이라고 불리우는 "XSS취약점"은 보안에 대한 지식이 없는 웹프로그래머에 의해 개발된 WEB어플리케이션에서 발견되는 어플리케이션(HTTP) 관련 취약점입니다

예를 들어서 내가 /create_form 에 post로 user_id 값 1로 조작해서 한번 보내보았더니 관리자가 쓴 글로 등록된다던지, 내가 쓴 글을 보게 되면 몰래 회원 탈퇴를 시키는 라우트에 get 신호를 보내는 방법같은게 있습니다.

그리고 이런 방식을 사용하기 위해서는 javascript를 남의 사이트에 저절로 작동하게 만들어서 쉽게 이루어질 수 있습니다.

질문!


간단한 알림창 띄워보기

그럼 간단하게 실습을 해봅시다. 주어진 게시판에 다음 코드를 적고 작성 완료 해보세요

<script>
alert('까꿍')
</script>

그리고 작성한 글에 들어가 보시면 다음과 같은 알림창이 뜬다면 게시글이 자바스크립트를 차단하지 않았다는 의미가 됩니다. 사진
이렇게 자바스크립트가 차단되지 않으면 누가 이 글을 보던지 스크립트가 자동으로 실행되어서 비밀번호 탈취, 및 공격을 감행할 수 있습니다! 그래서 대부분의 사이트 관리자는 script 태그가 작동하지 않도록 차단해 놓습니다. 하지만 이럴때도 해킹의 방법은 무수히 많이 있습니다ㅎㅎㅎㅎ

<!--링크 태그로 자바스크립트를 실행한다.-->
<a href="javascript:alert('XSS')">XSS</a>
<!--이벤트 속성을 사용한다.-->
<img src="#" onerror="alert('XSS')">
<!--알려지지 않은 태그와 속성들을 사용한다.-->
<ruby oncopy="alert('XSS')">XSS</ruby>
<!--따옴표로 감싸는 문자열 사이에 공백 문자들을 넣고, HTML 인코드를 하여 난독화한다.-->
<a href="&#x6A;&#x61;&#x76;&#x61;&#x73;&#xA;&#x63;&#x72;&#x69;&#x70;&#x74;&#xA;&#x3A;&#xA;&#x61;
&#x6C;&#x65;&#x72;&#x74;&#xA;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;">XSS</a>

이런 식으로 어떻게든 javascript가 실행되게 만들어서 사이트 공격을 감행하게 됩니다.

질문!


AJAX로 실질적인 피해 입히기

자 지금까지 한 짓들은 범죄의 영역에 들어가지 않습니다ㅎㅎㅎ 왜냐하면 저희는 알림창만 띄웠기 때문이죠. 하지만 지금부터는 실질적인 방법으로 여러분들의 사이트를 한번 해킹해 보겠습니다.

실질적인 피해를 입히기 위해서는 ajax 라는 자바스크립트의 기능을 알아야 합니다. Ajax는 서버로부터 데이터를 가져와 전체 페이지를 새로 고치지 않고 일부만 로드할 수 있게 하는 기법입니다. 이것을 이용해 사용자가 게시글을 읽는 것만으로도 게시글을 쓰게 만들 수 있습니다.

예를 들어서 POST 으로 /create에 title 파라미터로 제목을, content 파라미터로 내용물을 담아서 접근하면 현재 사용자의 이름으로 글을 쓰게 된다고 해봅시다. 그러면 다음과 같이 코드를 짜면 됩니다.

<!-- Jquery를 불러옵니다 -->
<script
  src="https://code.jquery.com/jquery-1.12.4.min.js"
  integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ="
  crossorigin="anonymous"></script>

<!-- AJAX 코드를 작성합니다 -->
<script>
$.ajax({  
  url: "/create",  
  type: "POST",  
  data: {content: "내용물", title: "제목"},  
  success: function(data){
alert("성공! 너는 글을 작성해버렸다")
}
});
</script>

이것을 이용해 자바스크립트로 사용자가 의도하지 않아도 글을 작성하게 만들수가 있습니다.

그럼 이제 무엇을 해 볼 것이냐면, 사용자를 한번 강제 탈퇴시켜 보겠습니다. 다시말해 사용자가 내 글을 읽게 되면 바로 탈퇴되어버리는 어이없는 일을 일으켜 보세요ㅎㅎㅎㅎ 어떤 주소가 탈퇴되는 라우트인지는 개발자 도구를 이용해서 추측해 볼 수 있답니다! 그럼 화이팅

XSS를 막아보기

그럼 이런 어이없는 공격들을 어떻게 막을 수 있을까요? 그건 바로 html_safe를 풀어버리시면 됩니다. 처음에 설정했던 부분을 해제하게 되면 아예 html이 작동되지 않습니다.

<%=@post.content.html_safe%>
이 부분을 아래 내용과 같이 바꿔주세요
<%=@post.content%> or <%=sanitize @post.content%>

그런데 이렇게 하면 문제가 하나둘 발생하는게 아닙니다. 이미지도 못 불러오고 유튜브도 올릴 수가 없습니다ㅠㅠ 그래서 저희같은 평민이 이 공격을 막으면서 일반적인 게시판처럼 만들려고 저는 Loofah 라는 잼을 이용하고 있답니다. 물론 유튜브가 되게 하기 위해서는 추가 작업을 해야 하지만요ㅠㅠ

Comments