자유로운 개발일지/실험일지

[직링 분석] 프록시 기반 분석 2.5탄

그낙이 2025. 6. 20. 00:31
반응형

📌 참고해주세요!
이 글에 소개된 방법보다 다른 더 좋은 방법이 있을 수도 있습니다.

다른 프로젝트를 병행 중이라 분석 속도가 느립니다.

 

이전 글에서 피들러를 더 뜯어보고 티켓 링크의 실제 동작 방식과 직링을 구하는 방식에 대해 얘기했었습니다. 이번 글은 JS를 뜯어보고 난 중간 정리입니다. 

 

⚠️ 이 글은 기술적인 호기심과 실험적인 분석을 위한 목적으로 작성되었습니다. 실제 예매 과정에서 이를 악용하거나 무단으로 활용하는 것은 서비스 약관 위반이 될 수 있으며, 법적 책임이 따를 수 있습니다. 또한, 이번 글에서는 코드 구현보다는 개념과 작동 원리에 집중하니 가볍게 읽어주시길 바랍니다.

 

지난번 HTML을 분석했을 때 나온 응답 값 중 일부입니다. curl을 이용해서 JS 파일을 다운받고 분석을 시작해봅시다. 

<script
  src="//tketlink.dn.toastoven.net/frontend/ticketlink/latest/main-DswQdeJu@2.7.2.js"
  crossorigin
  type="module"
></script>

<body>
  <div id="app"></div>
</body>

 

curl이란?

curl이란 Client URL의 약자로, 터미널에서 웹 서버에 요청을 보내고 응답을 가져오는 명령어 도구입니다. 쉽게 말해 브라우저 없이 서버에서 파일을 다운로드하거나, API 요청을 보내거나, 데이터를 받아올 수 있는 테스트 도구입니다. 웹사이트가 <script> 내부에 주입하는 JS 파일은 클라이언트로 내려오는 공개된 파일이므로 누구나 URL을 알고 있으면 쉽게 curl 등으로 다운로드 받을 수 있습니다. 개인 학습, 개발 목적의 분석을 하는 것은 일반적으로 불법이 아니지만, 저작권은 여전히 사이트(또는 회사)에 있으므로 상업적 목적으로 사용하는 것은 문제가 될 수 있습니다.

curl -o main.js "https://tketlink.dn.toastoven.net/frontend/ticketlink/latest/main-DswQdeJu@2.7.2.js"

 

명령어를 명령 프롬프트, 혹은 터미널에 입력하여 JS 파일을 다운받으실 수 있습니다. 이렇게 하면 main.js 이름으로 저장됩니다. 원하시는 이름이 있으시면 변경하셔도 무방합니다. 다운받은 JS 파일을 코드 에디터(VS Code 등)으로 열어 시작점을 만들어봅시다. reserve/product/54833? 으로 링크가 시작되는 것을 확인했으니, reserve/product로 검색을 해 코드가 작성된 부분을 찾습니다. 

const qg = ({
  productDate: e,
  scheduleId: n,
  productId: s,
  hasNotSchedule: a = !1,
}) => {
  const o = {};
  e && (o.productDate = M(e).tz().format("YYYY.MM.DD")),
    n && (o.scheduleId = String(n));
  const r = new URLSearchParams(o).toString();
  me == null || me.close(),
    (me = window.open(
      R.applyPath(`/reserve/product/${s}${a ? "" : `?${r}`}`),
      "예매하기",
      qr
    ));
};

 

총 4부분이 나오고, R.applyPath에 감싸져서 새로운 창을 여는 것으로 보입니다. 변수를 productDate, scheduleId, productId, hasNotSchedule을 받고 이를 바탕으로 url을 생성해 새로운 창을 엽니다. 그렇다면 쓰이는 4군데의 함수가 어디에 사용되고, 어떻게 export 되는지 확인한 후, 다른 JS들도 다 다운받아서 어떤 방식으로 사용하는지 확인하면 요청 보내는 방식을 알 수 있을 것 같습니다. 

 

그리고 아마도 평문으로 요청을 내보내지 않을가 싶습니다. export, import를 몇몇 군데만 확인해봤지만 암호화하는 부분은 존재하지 않았습니다.(제가 못찾은 걸 수도 있습니다.) JS 코드에서 평문으로 요청을 보냈는데 실제로는 암호화된 URL이 찍힌다면 총 3가지 정도를 의심해볼 수 있습니다. 

1. JS 암호화 함수 : 평문으로 보내는 요청을 덮어쓰기(Monkey Patch)했다.

2. Service Worker, 또는 중간 레이어에서 암호화를 진행한다.

3. 서버가 redirect(302)로 암호화된 URL을 제공한다. 

 

/home?=evwf로 보내는 script도 존재하고, 아마 내부에서 암호화를 진행하는 것 같지만 코드 길이가 17,000자 정도 되고 난독화가 되어있으므로 최후의 수단으로 남겨놔야 할 것 같습니다. 다음 글에서는 JS 분석이 아닌, 다른 방식으로 직링을 파해치는 시도를 해봅시다. 

 

 

반응형