어디에도 기록 안 된 줄 알았던 서브도메인이 털렸다 — @@Dh2OA

사이트 하나가 털렸다. flywithu.com 이야기는 아니고, 개인적으로 아주 작게 쓰던 기록용 사이트다. 아이들 학원비 납부 여부를 월별로 체크하는 정도의 페이지였다. 주소는 어디에도 링크를 걸거나 공유한 적이 없는 서브도메인이었다. 외부 어디에도 기록되지 않은 도메인이라 노출될 일이 없다고 생각했다.

그런데 어느 날 들어가 보니 기존 데이터는 사라졌고, 과목명 자리에 @@Dh2OA라는 정체불명의 한 줄만 남아 있었다.

학원비 관리 페이지에 @@Dh2OA라는 항목만 남아 있는 화면
남아 있던 흔적. 개인 정보는 블러 처리.

피해와 조치

  • 피해: 기존 기록 삭제, 의미 없는 항목 1건 추가
  • 복구: 주기적으로 백업해 둔 데이터로 전체 복원
  • 조치: 로그인 추가. “어차피 아무도 모르는 주소”라는 이유로 인증 없이 열어 두었던 것이 가장 큰 원인

결국 핵심은 나의 무관심이다. 그래도 궁금한 건 남는다. 어떻게 이 주소를 알았고, 왜 굳이 들어와서 이런 걸 남겼을까.

어떻게 찾아왔을까 — 추정

로그를 깊게 본 것은 아니라 확정할 수는 없다. 다만 가장 유력한 경로는 인증서 투명성(Certificate Transparency, CT) 로그다.

  • Let’s Encrypt 등으로 HTTPS 인증서를 발급받으면, 그 인증서에 들어간 도메인 이름이 공개 CT 로그에 기록됨
  • crt.sh 같은 사이트에서 누구나 조회 가능. 내가 어디에도 적지 않았어도 인증서 발급 기록에는 남아 있음 – 가능성에 대해서는 Claude 가 알려줌.
  • 스캐너 봇들은 CT 로그를 실시간으로 구독하다가 새 호스트가 생기면 수 분~수 시간 안에 찾아옴
  • DNS 자체는 “등록된 레코드 목록 보기” 기능이 없음. 이름을 알아야 조회되는 구조
  • 다만 우회 경로는 여럿: 공개 리졸버를 거친 조회를 모아 둔 passive DNS 데이터베이스, 흔한 이름을 대입해 보는 서브도메인 브루트포스, 설정이 잘못된 존 전송(AXFR), DNSSEC NSEC 레코드를 따라가는 존 워킹

즉 “주소를 숨겼다”는 생각 자체가 틀렸던 셈이다. 개별 인증서를 발급받는 순간, 그 서브도메인은 사실상 공개 목록에 올라간다. 숨기고 싶다면 와일드카드 인증서(*.example.com)를 쓰는 편이 낫지만, 그것도 보안이 아니라 약간의 은닉일 뿐이다.

왜 들어와서 이런 걸 남겼을까

아마 “왜”라고 물을 상대가 없을 가능성이 높다. 사람이 학원비 페이지를 노리고 들어왔다기보다는, 자동화된 스캐너가 지나가다 건드린 쪽에 가깝다고 본다.

  • 입력 폼 발견 → 아무 값이나 넣고 제출 → 그 값이 저장되어 다시 화면에 나오는지 확인. 저장형 XSS·인젝션 취약점을 찾는 전형적인 절차
  • 인증 없이 쓰기가 되는 페이지는 스캐너 입장에서 “쓸 만한 곳” 목록에 올라감. 이후 스팸 링크 게시나 다른 공격의 발판 후보
  • 데이터가 통째로 사라진 것도 같은 맥락으로 추정. 화면의 삭제가 단순 링크(GET 요청)였다면, 페이지의 링크를 전부 따라가는 크롤러가 지나가기만 해도 행이 하나씩 지워짐. 악의라기보다 설계 실수가 만든 결과일 가능성

마지막 항목이 개인적으로 제일 뜨끔했다. 삭제나 수정 같은 상태 변경을 GET 링크로 만들면, 사람이 아니라 봇이 누르게 된다.

정리

  • “어디에도 안 적었다”는 착각. 인증서 발급과 동시에 공개 기록에 남음
  • 인터넷에 열린 페이지는 개인용이든 아니든 봇이 찾아옴. 시간 문제일 뿐
  • 최소한의 인증은 필수. 이번에 로그인 추가
  • 삭제·수정은 GET 링크가 아니라 POST로
  • 백업 덕분에 피해는 0. 백업 습관 하나는 칭찬

작은 사이트라서 괜찮겠지, 라는 생각이 제일 위험했다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다