초보자용 익스플로잇으로 Chess.com을 해킹한 방법
(skii.dev)체스닷컴에서의 XSS 발견
- 체스를 취미로 즐기며 기술을 가지고 놀던 중, 체스닷컴에서 XSS 취약점을 발견함.
- 체스닷컴은 1억 명 이상의 회원을 보유한 인터넷 상의 최대 체스 사이트임.
개요
- 2023년 초 체스닷컴에서 많이 놀기 시작함.
- 친구를 사이트에 가입시키고 친구 기능을 사용하여 즉시 친구가 됨.
- MySpace 웜과 유사한 방식으로 자동 친구 추가가 가능한지 궁금해짐.
- 새 계정을 만들고 개발자 도구의 네트워크 탭을 확인하여 자동 친구 추가 URL을 발견함.
중반 게임
- TinyMCE 리치 텍스트 에디터를 사용하여 XSS를 시도함.
- Burp 프록시를 사용하여 'About' 설명에 직접 HTML 코드를 삽입함.
- TinyMCE 설정을 확인하고
background-image스타일 속성을 이용하여 XSS 페이로드를 생성함. - 여러 기호를 테스트하여 XSS를 실행하는 방법을 찾아냄.
- 최종적으로 쿠키와 자바스크립트 객체를 추출할 수 있는 방법을 개발함.
엔드게임
- XSS를 완전히 실행하기 위해 노력함.
srcset속성을 이용하여 더 넓은 JS 구문을 사용할 수 있는 새로운 방법을 찾아냄.- Base64 인코딩을 사용하여 XSS 페이로드를 직접 실행함.
- TinyMCE 에디터가 사이트 전반에 사용되고 있어 영향이 큼.
분석
- 취약점의 근본 원인은 이미지 재업로드 기능임.
- 체스닷컴의 도메인 이름을 포함하여 이미지 호스팅 검사를 우회할 수 있음.
- 리치 텍스트 에디터는 다양한 HTML 요소를 허용하기 때문에 XSS를 달성하기에 좋음.
- TinyMCE는 최신 상태였으나, 최종 HTML에 대한 살균 처리가 누락됨.
- 체스닷컴은 사용자에게 보여지는 최종 HTML에 대해 살균 처리를 해야 함.
GN⁺의 의견:
- 이 블로그 포스트는 체스닷컴과 같은 대규모 온라인 플랫폼에서 발생할 수 있는 보안 취약점을 발견하고 이를 보고하는 과정을 흥미롭게 설명함.
- XSS 취약점은 웹사이트의 보안에 심각한 위협이 될 수 있으며, 이러한 취약점을 찾아내고 해결하는 것은 웹사이트 사용자의 개인정보 보호에 매우 중요함.
- 이 글은 소프트웨어 개발자와 보안 전문가들에게 리치 텍스트 에디터와 같은 웹 애플리케이션 구성 요소의 취약점을 인식하고 이를 방지하기 위한 중요성을 강조함.
댓글과 토론
Hacker News 의견들
-
OP입니다. 긍정적인 댓글들 정말 감사합니다. 배경을 조금 설명하자면, 저는 영국에서 A-Levels를 준비 중인 17세 학생이고, 어느 대학에 갈지와 degree apprenticeship 선택지를 아직 고민하고 있습니다
GitHub 프로필은 여기서 볼 수 있습니다 -> https://github.com/Jayy001
저는 HashPals의 핵심 멤버 중 한 명이고, Search-That-Hash를 만들었으며 ReMarkable 태블릿용 무료 소프트웨어 오픈소스 저장소의 메인테이너이기도 합니다- FAANG 회사에서 degree apprenticeship를 했고 운 좋게 그곳에서 정규직으로 전환했음. 회사마다 크게 다르지만, 당장 취업 전망만 보면 잘 알려진 회사의 견습 과정이 Oxbridge를 제외한 대학보다 훨씬 도움이 된다고 봄
더 이야기하고 싶으면 연락해도 좋고, 이메일은 프로필 설명에 있습니다 - 제 ReMarkable이 고마워할 겁니다. 잘하고 있으니 계속 하세요
그리고 IT로 간다면 계약 협상과 재무도 꼭 배우는 게 좋습니다 - XSS를 성공시키는 데 얼마나 걸렸나요?
- Meta 추천을 시도해보겠습니다. 이력서/이메일 등을 tehlike gmail com으로 보내줄 수 있나요?
- FAANG 회사에서 degree apprenticeship를 했고 운 좋게 그곳에서 정규직으로 전환했음. 회사마다 크게 다르지만, 당장 취업 전망만 보면 잘 알려진 회사의 견습 과정이 Oxbridge를 제외한 대학보다 훨씬 도움이 된다고 봄
-
인터넷 경험이라고는 Chess.com에서 “자원봉사 사서”로 매번 지는 것뿐이던 시절, 실시간 Chess.com 게임에 어색하게 이스케이프한 문자, 닫는 태그, 흔한 제어 문자열, 심지어 OLE 객체까지 주입하곤 했음
창업자인 Eric이 더 정식 감사를 정중히 요청했지만, 11살 스크립트 키디라는 걸 드러내고 싶지 않아 거절했음. 대신 채팅방 검열에 필요한 정규식을 설명했고, 비동기 환경에서 부정행위를 어떻게 탐지할지라는 더 큰 문제를 함께 다뤘습니다
고민 끝에 가능한 유일한 방법은 모든 게임상 중요한 고가치 수를 엔진의 알려진 최선 수와 비교하고, 통계적 추론으로 실력 좋은 인간과 부정행위자를 구분하는 것이라고 말했음
물론 당시에는 터무니없이 불가능한 방식이었고, 결론도 그렇게 났습니다. 그래도 초등학교를 갓 벗어난 아이가 진짜 웹마스터와 그런 미묘한 주제를 논의했다는 건 꽤 좋은 인터넷 기억으로 남아 있음- “가능한 유일한 방법”이라는 건 왜 그런가요? 부정행위를 탐지하는 방법은 여러 가지 떠올릴 수 있습니다
-
“이 기능이 2005년쯤 MySpace 웜을 떠올리게 했다니, 저는 그때 태어나지도 않았어요!”라는 부분에서 매일 나이 들어간다는 걸 실감함
- 제 전 아내가 2006년부터 2008년쯤까지 MySpace 보안팀을 관리했음. 정말 거친 부분은 하루 작업이 어떻게 진행됐는지 보려고 MySpace 해커 포럼에 직접 들어가던 일이었습니다
사용자에게 사이트에 HTML을 넣게 허용하려는 고집이 엄청난 문제였음. 요즘이라면 HTML 입력을 제대로 파싱해서 금지된 속성과 태그를 제거하겠지만, 당시에는 정규식 광기로 처리했습니다 - 처음 든 생각은 “요즘 어린 친구들이 이런 일을 하는 걸 보니 좋다”에 가까웠는데, 나이를 계산해보니 정신적으로 타격이 컸음
- 잠깐, 이 사람 20세 미만이군요
- 제 전 아내가 2006년부터 2008년쯤까지 MySpace 보안팀을 관리했음. 정말 거친 부분은 하루 작업이 어떻게 진행됐는지 보려고 MySpace 해커 포럼에 직접 들어가던 일이었습니다
-
관련 있는지는 모르겠지만, Chess.com 게임에서 다른 사람이 제 수를 대신 두는 것을 직접 봤고 녹화까지 한 적이 있음. 진행 중인 게임이 저에게 뜨고, 원래 둘 수 없어야 할 상황에서 수를 둘 수 있었던 적도 있습니다
구글링하면 관련 스레드도 꽤 많습니다. Chess.com이 최근 몇 달 사이 고쳤는지는 모르겠지만, 제가 신고하려고 했을 때는 들으려 하지 않았음
이 모든 게임은 사이트에 로그인하지 않은 상태에서 벌어졌습니다. 로그인 중에는 겪어본 적이 없지만, 체스는 혈압에 안 좋아서 자주 하지는 않습니다- 이해가 잘 안 됩니다. “다른 사람이 제 수를 둔다”는 게 게임에서 당신의 수를 자기 수로 대체한다는 뜻인가요? 아니면 당신 게임의 수를 자기 게임에 그대로 따라 둔다는 뜻인가요? 아니면 다른 의미인가요?
- 그들이 당신의 수를 두고 있다는 걸 어떻게 알 수 있나요?
- “제 수”라니, 정확히 무슨 뜻인가요?
-
제목만 보고는 훨씬 초보적인 내용일 줄 알았는데, 실제로는 여러 단계의 입력 검증을 영리한 우회로 뚫는 익스플로잇을 만들었음. 기본 도메인처럼 보이게 하려고 하위 도메인까지 설정했습니다
이게 통할 거라고는 예상 못 했고, 그 자체로도 흥미로웠음. 도메인을 정규식으로 파싱하는 게 얼마나 복잡한지 생각하면 빠뜨리기 쉬워 보이기도 합니다. 아니면 단순히 변수 안에서'...'를 검사하는 식이었을지도 모르지만요
작성자는 자기 분야를 잘 알고 있습니다. 이런 수준의 기술을 위해 얼마나 오래 파고들었는지 감탄하게 됨. 꽤 흥미로운 커리어가 될 것 같습니다- 작성자가 글에서 지나가듯 말한 걸 보면 2005년 이후 출생이라서, 아주 어리다는 점까지 고려하면 더 인상적입니다
- 프로필 방문자를 친구로 추가하는 첫 번째 익스플로잇은 적어도 꽤 단순했고, 제목도 말장난입니다. 하지만 전체 XSS까지 가는 과정은 이후 굉장히 복잡해졌습니다
-
좋은 글입니다, OP. 해킹 여정도 잘 이어가길 바랍니다. 혹시 아직 모른다면
alert(1)같은 페이로드에서 괄호가 필터링되거나 인코딩될 때 백틱을 써서alert\1``을 시도해볼 수 있습니다
JavaScript 주입을 한 단계 올리고 싶다면 Brute Logic의 XSS 치트시트와 Gareth Heyes의 Javascript for Hackers가 좋은 자료입니다. 어떤 사람들은 교차 사이트 스크립팅을 가볍게 보지만, 여전히 매우 강력하고 널리 퍼져 있습니다. 특히 plugin-baby가 짚었듯 세션 쿠키에 HttpOnly가 안 붙어 있으면 더 그렇습니다 -
아주 멋집니다. 버그 바운티 분석 글, 특히 XSS 글을 보는 걸 좋아합니다. 항상 찾기 쉬워 보이지만 그건 확증 편향일 뿐이고, 실제로는 아무 성과 없는 테스트와 샛길에 들인 시간을 제가 못 보는 거겠죠
- 제 경험상 보통은 우연히 이상한 걸 발견한 뒤에 찾게 됩니다. 진짜 어려운 부분은 그 결함을 실제로 악용 가능하게 만드는 일이고, 이 경우에는 텍스트 편집기가 그 대상이었네요
-
“이 기능이 2005년쯤 MySpace 웜을 떠올리게 했다니, 저는 그때 태어나지도 않았어요!”라는 부분에서 바로 늙었다는 느낌이 들었음
- 너무 걱정하지 마세요. 더 심해집니다
이 사건에 대해 OP에게 묻고 싶은 건, 이걸 어떻게 알게 됐느냐입니다. Darknet Diaries였나요, 아니면 다른 경로였나요?
- 너무 걱정하지 마세요. 더 심해집니다
-
리치 텍스트 편집기를 “성배”라고 한 부분이 재미있음. Chess.com은 큰 웹사이트지만, 낡은 포럼 같은 곳에서 그런 편집기나 과하게 화려한 기능을 볼 때마다 사이트가 구멍투성이는 아닐까 생각하게 됩니다. 어쨌든 훌륭한 글입니다
-
“버그 바운티 보고와 검토 중에, 제가 다시 재현하려고 하자 개발자들이 차단을 구현하려 했고 다음 오류 메시지가 떴다…”라는 부분은 버그 바운티 프로그램의 취지와는 거리가 멀어 보입니다