본문 바로가기
코딩

카카오 송금 url 분석하기, 리버스 엔지니어링

by JuBro 2024. 2. 3.
728x90

사이드 프로젝트에서

현재 사이트에서 입력한 금액 정보를 최대한 그대로 송금할 수 있게 구현을 하고 싶었다.

예를들어서 내 사이트에서 5000원 보낸다! 했으면 송금링크로 들어가면 바로 5000원이 입력되게끔까지.

물론 송금하기 직전 송금앱에서 금액을 바꿀 수 있겠지만 그것까지 막을 방도가 없다.

 

그런데 일단 카카오 송금링크로 가는 이상, 우리 사이트의 권한이 아니기에 거기서 데이터 처리를 할 수 없다.

 

하지만, 우리가 마지막으로 영향을 줄 수 있는건, 카카오 송금 링크로 request 할때, 그 url속에서 최대한 정보를 때려넣는것이다!

 

 

 

우선 카카오 송금 링크는 다음과 같다.

1. 그냥 송금링크 생성했을경우
https://qr.kakaopay.com/{{user.id}}
2. 금액 지정 송금링크를 생성했을 경우
https://qr.kakaopay.com/{{user.id}}{{금액 해시값}}

 

따라서 유저 아이디는 고유하고, 금액 설정에 따라 뒤에 숫자 해시값이 계속 바뀌는 형태이다.

뒤에 숫자 해시값의 규칙만 찾으면, 우리가 일반 유저 송금링크를 받은 후 사이트에서 받은 금액값을 해싱 규칙에 따라 변환 후 뒤에 문자열로 붙여주면 되는 형태이다.

 

 

1의자리 송금을 분석해볼까?

 

우선, 1원 지정 송금링크를 여러번 생성해봤다.

<1원 송금링크>

송금링크 이진수 변환
https://qr.kakaopay.com/Ej8aQn4KN87175 10101010010000111
https://qr.kakaopay.com/Ej8aQn4KN86660 10101001010000100
 https://qr.kakaopay.com/Ej8aQn4KN81376 10011110111100000



똑같은 1원 송금 링크인데, 이상하게 다 숫자가 달랐다.

혹시 이진수로 바꾸면 규칙이 있을까 했지만, 규칙이 보이지 않았다.

그런데, 5자리의 숫자 중에 맨앞 한자리는 항상 8로 고정되었다.

그래서 url을 직접 쳐서 들어가보니, 5자리 중 맨 앞자리 가 8이기만 하면 뒤에 4자리 숫자가 어떠한숫자이던 1원 송금링크가 되었다.

카카오송금링크/{{user.id}}8XXXX 형태이면 다 1원 송금링크인것이다.

 

이후 2,3,4원 1원씩 늘려서 좀 더 알아보았다.

다른 금액들도 마찬가지로, 위에서 알아냈듯이 앞의 자리 숫자만 고정되면 뒤에 4자리가 어떻든 같은 금액 링크였다.

  유저 아이디 뒤 숫자
2원 101855
3원 181167
4원 201551

 

그리고 1원씩 증가할때마다 앞에 자릿수가 10 > 18 > 20 으로 늘었다.

이는 16진수로 생각하면, 8 > 10 > 18 > 20 으로 늘어난것이므로, 8씩 증가했다는것을 알 수 있다.

 

숫자를 좀 더 늘려봐서 테스트해보면 확실하다는 것을 알 수 있었다.

  유저 아이디 뒤 숫자
20원 a02435
21원 a85124
22원 b03245
24원 b82156
25원 c09854
26원 c82354

 

알파벳이 나오고 이쁘게 숫자가 증가하는 것을 볼 수 있다.

 

그렇다면, 1원당 숫자는 8씩 증가하고,  이를 16진수 변환을 했으니

내가 어떠한 X원을 보내고 싶다면 X에 8을 곱하고 이를 16진수로 변환한 코드 + 뒤에는 임의의 4자리 문자열을 카카오페이 아이디 뒤에 붙이면 내가 원하는 금액을 보낼 수 있는 링크가 된다!

 

검증 : 51234원을 보낸다고 치면??

 

01234
슬라이드쇼 >> 넘기기

1. 1원당 8씩 증가하므로 8*51234 = 409872

2. 409872를 16진수 변환 = 64114

3. 카카오 송금 링크에 64114 + 임의 4자리(1234) 넣기

4. 카카오페이 송금 링크로 가면 51234원이 입력되어있음!!

 

 

 

최종 매커니즘
아이디 뒤에 붙는 숫자값 = 금액 * 8 한걸 16진수계산 한 문자열 + 4자리 임의 수

 

 

코드 구현
const transferButtons = document.querySelectorAll(".btn.btn-transfer");

            const originalKakaoURL = document.getElementById("kakaoTransferLink").querySelector("a").href;
            const originalTossURL = document.getElementById("tossTransferLink").querySelector("a").href;

            transferButtons.forEach(function(button) {
                button.addEventListener("click", function() {
                    let kakaoTransferLink = document.getElementById("kakaoTransferLink").querySelector("a");
                    let tossTransferLink = document.getElementById("tossTransferLink").querySelector("a");

                    let inputValue = document.querySelector("input[name='funding_price']").value;
                    let multipliedValue = inputValue * 8;
                    let hexadecimalValue = multipliedValue.toString(16);
                    
                    let kakaoInfo = [originalKakaoURL, hexadecimalValue, '0000'];
                    kakaoTransferLink.href = kakaoInfo.join('');
                    
                    let tossInfo = [originalTossURL, inputValue.toString()];
                    tossTransferLink.href = tossInfo.join('/');
                });
            });

const 값으로 바뀌지 않게 원래 href 값을 저장해둔 후,

금액을 계산한 해시값을 뒤에 문자열로 추가해준다.

 

 

 

 

추가 궁금증

1. 뒤에 네자리는 무엇을 뜻하는 것일까?

2. 뒤에 네자리를 임의로 주면 보안상의 위험은 없을까?

728x90

'코딩' 카테고리의 다른 글

WSL 메모리 차지문제, GNU grub 부팅 해결  (0) 2024.03.15
Windows 11 WSL 환경 설정하기  (0) 2024.03.10