공격 난이도
- 낮은 수준
취약 정도
- 최상
가능한 옵션 : 계정탈취(Account Takeover)
테스트 블로그에서 확인된 세션 탈취 예제
iframe 내부에 탈취한 세션이 표시된다.
찾아낸 계기는 이렇습니다.
포럼에서 글을 봤는데 크로스도메인 세션 문제로 보였습니다.
들어가서 쿠키를 봤다가 설정된 쿠키 규칙을 보고 만약 2차도메인을 루트로 만들고
서브도메인에서 세션을 확인하면 사이트 접속자의 세션을 탈취할수있지 않나 하는 생각이 들어서
테스트블로그로 확인을 해보았고 가능함을 확인하였습니다.
표준 웹 규격에서 도메인에 설정된 세션은 서브도메인과 공유하도록 되어있습니다.
설마 했지만 루트도메인으로 티스토리를 설정 후 서브도메인으로 iframe을 로드하면 당연히 세션이 전달됩니다.
공격 과정은 이렇습니다.
서버(Apache)측 세팅입니다.
Header always append X-Frame-Options "allow-from 도메인"
X-Frame-Options을 설정하지 않거나 특정도메인(정보수집용 서버)을 허용합니다.
도메인은 티스토리 2차도메인(루트 : https://hi098123-test.ga/)로 설정
정보 수집용 서버는 서브도메인 : https://test.hi098123-test.ga/으로 설정했습니다.
이런 경우 아래와 같이 프레임 로드를 허용하거나 금지하지 않으면(아파치 기본 값) 다른페이지에서 프레임으로 로드가 가능합니다.
Header always append X-Frame-Options "allow-from https://hi098123-test.ga/"
※ 현재 정보수집용 서버로 접속불가합니다. 공개된 티스토리에 iframe이 삽입되어 있다면 누군가에게 힌트를 줄수있기때문에 제거해놓은 상태입니다.
※ 공격 재현시 주의사항 : https -> http는 접근이 불가하므로 "테스트용 주소로도 letsencrypt 발급하여 설정" 필요
서버는 PHP로 작성되었습니다.
공격에 사용된 정보수집 서버측 소스코드는 아래와 같습니다.
<?php
header('Access-Control-Allow-Origin:https://hi098123-test.ga');//CORS
if(isset($_COOKIE['TSSESSION'])){//쿠키에 세션이 존재한다면..
echo $_COOKIE['TSSESSION']; //실제공격에서는 없을 내용 : 디버그(확인)용
/*
실제공격이라면 DB에 저장해도됨
*/
}
?>
세션을 루트도메인에서 서브도메인으로 공유하기때문에 발생한 문제이며,
만약 example.com -> aaa.com 으로 iframe을 로드한다면 동일 문제는 발생하지 않습니다.
example.com(루트 도메인) -> aa.example.com(서브도메인) <가능>
blog.example.com -> aa.example.com <불가>
blog.example.com -> example.com <불가>
공격 가능 대상
- 악의적으로 만들어진 티스토리에 접속한 사람모두
- 포럼 등을 통해 유입가능
- 댓글(홈페이지)을 통해 유입가능
등등의 모든 유입경로를 통해 티스토리 해킹용 페이지에 접속과 동시에 iframe으로 세션 정보가 탈취됩니다.
공격 테스트 결과
예상과 동일하게 서버에서 세션탈취가 이뤄졌습니다.
그리고 TSSESSION 만으로 로그인 계정 정보가 바뀜을 확인하였습니다.
TSSESSION 쿠키를 변경했을때 어떠한 제한사항없이 "로그인 된 아이디(티스토리 이메일 계정)가 변경"되었습니다.
조치해야 할 점
아마도 운영 초기부터 있었을 문제였을것 같습니다.
이용자는 티스토리를 사용안할때 로그아웃, 로그인을 하여 세션을 새로 생성해야되고
서버에서는 다음과 같이 설정할 수 있습니다. 세션은 도메인 설정이
.example.com
(기본값)이 아닌
example.com
으로 설정되어야 할것 같습니다.
이후 티스토리측 답변에서 이렇게는 불가함을 안내받았습니다.
참고했던 내용이 이전 내용을 봐서 현재 브라우저 스펙과는 다르네요
도메인 앞에 .이 없어도 서브도메인은 항상 포함되는 것으로 보이나.. (ko: link, en: link)
If omitted, defaults to the host of the current document URL, not including subdomains.
하지만 도메인을 생략하면 서브도메인 포함안함으로 설명하는것 같습니다.
후속조치로 기존에 설정된 세션(세션 수정 전)을 티스토리에 접속과 동시에 서버상에서 새로 발급하면서 세션 쿠키 도메인값을 동시에 바꿔줘도 될 것 같습니다. (이렇게 하면 사용자는 변화없이 서버에서만 세션 재발급이 가능할것으로 예상됩니다.)
기존 루트(티스토리) 서브(다른 도메인)이용시 자의든 타의든 세션이
다른도메인 서버로 전송되었을것이므로 세션 재발급이 필요할것 같습니다.
티스토리 https://<blog name>.tistory.com/ (또는 https://<blog name>.com/) 에 접속시
서버에서 쿠키 확인
TSSESSION=<session hash> domain=.<blog name>.com 에서
TSSESSION=<session hash2> domain=<blog name>.com 으로 변경 필요
기존
TSSESSION=<session hash> domain=.tistory.com 은 그대로 사용
2차도메인(루트)의 서브도메인은 티스토리가 아니므로 세션정보를 공유할 이유없음
문제수정이후 해당방식으로 운영되는(2차도메인중 루트도메인으로 설정 + 서브도메인이 iframe으로 삽입되어있는) 사이트 로그조사가 필요합니다.
XHR로 쿠키 전달은 최신브라우저 정책상 안되지만 구형 브라우저 이용시 XHR로도 전송이 가능했을것입니다.
하고싶은 말
.(dot) 하나로 발생한 보안문제입니다.
정말 간단하면서도 놓지기 쉬운게 보안입니다.
이런 문제는 한번도 본적없는 내용이라 발견하기 어려웠을수도 있습니다.
바라는 점
발생하는 오류는 최대한 빠르게 찾아서 수정해주시길 바랍니다.
이 문제에 대해서는 빠르게 수정해주신 후 적당한 수준의 보상을 해주시면 좋겠습니다.
티스토리측 조치결과
1. 임시조치(2차도메인 세션 제거) - 2020.07.24 15:52:24
https://notice.tistory.com/2546
[안내] 2차 도메인 사용 시 유의사항
안녕하세요. 티스토리팀 입니다. 티스토리는 블로그 개설 시 지정하신 블로그 주소 (000.tistory.com)외 가지고 계신 별도의 도메인 (www.000.com 등)으로도 서비스를 이용하실 수 있도록 2차 도메인 연��
notice.tistory.com
2. 수정 안내 답변 2020.07.27 17:40
제보 보상
카카오, 티스토리측 각종 굿즈와 카카오 미니c AI 스피커를 받았습니다.
'보안 > web' 카테고리의 다른 글
DDOS와 부하 (0) | 2021.09.26 |
---|---|
싹둑 서비스 가벼운 결함 (0) | 2021.09.26 |
티스토리 API 보안 취약점 (0) | 2020.08.13 |
티스토리) 중대한 보안 문제 발견 (해결시 까지 비공개) (0) | 2019.09.17 |
국내 방송사인 MNET 유료제공 기능에 보안문제 발견. (0) | 2019.05.05 |
트위치 스트리밍 보안 문제 해결 (0) | 2019.05.05 |
세계 1위 스트리밍 업체 트위치의 보안문제를 제보하다 (0) | 2019.04.19 |
저작권 보호안내
무단 전재, 재배포 행위는 금지됩니다. (글을 복사하여 게시금지)
본문의 일부(링크용 문장) 인용은 가능하지만, 출처와 링크(a 태그)를 남기셔야 됩니다.
(웹툴을 이용하고, 스크린샷/녹화하는것은 상관없습니다.)
예외적으로. 저에게 허락받은 경우에는 본문을 전재할 수 있습니다.
만약, 본문 공유를 원하신다면 링크 공유를 해주세요
저작권 정책 확인하기링크 공유하기