정보보안 스터디 - 5주차 1일 - Stored XSS
XSS
XSS는 서버 측이 아니라 클라이언트 측 스크립트를 삽입하여,
웹 브라우저에서 실행하게 만드는 공격입니다.
공격자가 스크립트를 주입하면 서버는 그대로 저장하고 응답을 줍니다.
보통 alert(1) 로 많이 테스트를 해서 성공하면 다른 악의적인 스크립트도 주입이 가능합니다.
예를들면 이용자의 세션ID를 탈취할 수 있습니다.
주로 자바스크립트, HTML 으로 동작합니다.
발생 가능한 위치는
input 뿐만 아니라 파라미터 값을 입력해서 응답페이지가 나오는 곳입니다.
서버에 저장되는 Stored xss
입력값을 반사시키느 Reflected xss
숨겨져 있는 Dom based xss
가 있습니다.
Stored xss
같은 경우에는 게시판 같은 곳에 남들이 많이 들어오는 곳에 스크립트 alert를 삽입을 해서
글을 올리게 되면 읽는 순간 스크립트가 모두 실행이 됩니다. 이용자들은 악성코드의 실행을 당하게 되는것이죠.
서버에 저장되어서 인지도 못하면서 당하는 경우가 많습니다.
그리고 기본적으로 스크립트 코드를 넣을 수 있다고 하더라도
제목에 직접적으로 노출시켜 넣는것이아니라
정상글처럼 올리고 내용에 숨겨서 실행되도록 합니다.
서버에서 실행되기 때문에 불특정 다수를 공격할 수 있습니다.
Reflected xss
공격같은 경우에는 서버에 저장되지않습니다. 공격자페이지에서만 실행됩니다.
게시판보다는 닉네임을 입력했을 때 '안녕하세요 ~~님' 이라고 뜨거나,
검색창에 '~~에 대한 검색결과입니다' 처럼 나의 입력값을 반사하기만 하면 되는 구조입니다.
(입력값뿐만아니라 응답되는 곳이면 모두 공격소지가 있습니다. )
거기에다가 스크립트문을 삽입하면 alert알림창이 뜨는데,
get형식의 링크로 만들어서 특정한 사용자에게 링크를 클릭하도록 유도하는 것입니다.
링크는 코드가 감춰지도록 짧은 링크로 올릴 것이구요.
그러면 사용자는 클릭하고 alert는 물론, 쿠키 세션id 가 탈취될 수 있는 코드를 실행시킨 겁니다.
이 처럼 stored에 비하면 아주 쉽게 찾을 수 있고, 저장은 되지않는 구조입니다.
저장이 되지않아 서버에 직접적인 영향을 끼치지 않고,
클라이언트 측에서만 실행되는 코드여서 다수의 사람들에게 피해를 끼치지는 않지만,
특정 대상을 정하여 사회공학기법과 함께 링크 전송하여 공격한다면 쉽고 역시나 위험할 것입니다.
reflected는 쉽게 찾아지기 때문에 버그 바운티에서는 그렇게 인정해주지 않고,
기업측에서도 직접적인 서버에 피해를 끼치지는 않기 때문에 우선순위가 낮습니다.
Dom based xss
같은 경우에는 버프스위트로 응답을 확인 했을 때 검색이 되지 않고 숨겨져 있는 구조입니다.
그래서 놓치고 넘어가기가 쉽습니다.
사이트 소스에서는 숨겨져있지만 실제로 url을 넣어서 보면 입력한 값이 보입니다.
reflected와 마찬가지로 url에 get방식으로 링크를 만들고 보낼 수 있습니다.
Stored XSS 공격과정
대표적으로 서버에 저장되는(남들에게 보여지는)곳은
제목, 본문내용 이 있습니다.
게시판에 글을 작성하고
처음부터 스크립트를 제목에 노출 시키면 안되기 때문에
이렇게 본문에다가 글을 작성하고
<" '> 기호가 사용가능한지 확인합니다.
process.php로 이동하면서 글작성이 완료됩니다.
그러면 history에 들어가서 param이 체크되어 있고, 글 쓴 내용을 확인하겠습니다.
작성한 제목, 내용이 보이니까 맞는 것 같습니다.
반복해서 수정하기 위해서 Repeater로 옮깁니다.
하지만 우리는 글을 여러번 작성하는 게 아니라
하나의 글을 가지고 반복적으로 수정을 해서 확인할 것이기 때문에
수정 페이지가 필요합니다.
Repeater로 옮겨 값 변경까지 완료되는 모습입니다.
확인은 직접하는 게 아니라 burp suite를 통해서 html 코드 결과값을 확인합니다.
마찬가지로 Repeater로 불러와 값이 변경될 때마다 새로고침을 해주고,
Auto-scroll을 설정해줘서 값을 빠르게 확인합니다.
큰, 작은 따움표는 통하는데 <> 는 필터링 처리되는 것을 볼 수 있습니다.
그럼 내용말고 제목도 같은 결과인지 확인해보겠습니다.
기호가 모두 잘 들어갑니다.
그렇기 때문에 <script> 가 통하는지 확인,
<script></script> 확인합니다.
역시나 통합니다.
이제 alert를 삽입할 수 있습니다.
알림창이 뜹니다.