메뉴 건너뛰기

노루발의 개인 게시판

"Cookies are protected with XOR encryption"


쿠키를 확인하면 아래와 같은 형태의 데이터가 있다:

"data=ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw%3D"


이 데이터는 다음과 같은 함수로 암호화 되어 있는 것 같다:


function xor_encrypt($in) {
    $key = '<censored>';
    $text = $in;
    $outText = '';

    // Iterate through each character
    for($i=0;$i<strlen($text);$i++) {
    $outText .= $text[$i] ^ $key[$i % strlen($key)];
    }

    return $outText;
}


key를 알면 복호화 하는 코드를 짤 수 있을 것 같지만 key를 순순히 알려주지 않는다...

하지만 초기 데이터와 알고리즘을 알고 있으므로 key를 알아내보자.


일단 아래의 PHP 코드를 실행하여 XOR 암호화 전의 데이터를 알아낼 수 있었다:

<?

$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
echo base64_encode(json_encode( $defaultdata ))."<br>";

?>


Base64로 인코딩하기 전의 데이터:

{"showpassword":"no","bgcolor":"#ffffff"}

Base64로 인코딩한 후의 데이터:

eyJzaG93cGFzc3dvcmQiOiJubyIsImJnY29sb3IiOiIjZmZmZmZmIn0=

암호화된 data와 길이가 똑같으니 정확해 보인다.


그럼 여기에서 Key를 알아낼 수 있을까?

XOR연산을 두 번 하면 원래의 결과로 돌아온다는 점에 착안하여 두 Base64 문자열을 XOR 연산한다.


암호화된 Base64 문자열:

00001010 01010101 01001011 00100010 00011110 00000000 01001000 00101011 00000010 00000100 01001111 00100101 ...

원문 Base64 문자열:

01111011 00100010 01110011 01101000 01101111 01110111 01110000 01100001 01110011 01110011 01110111 01101111 ...


결과:

01110001 01110111 00111000 01001010 01110001 01110111 00111000 01001010 01110001 01110111 00111000 01001010 ...


01110001 01110111 00111000 01001010 부분이 번갈아서 나타나는 것을 알 수 있다.

아스키 코드로 변환하면 qw8J가 되고, 따라서 XOR 암호화에 사용된 키는 qw8J임을 알 수 있다.


따라서 다음과 같은 코드로 쿠키의 data를 복호화 할 수 있다.


<?php
function xor_encrypt($in) {
    $key = 'qw8J';
    $text = $in;
    $outText = '';

    // Iterate through each character
    for($i=0;$i<strlen($text);$i++) {
    $outText .= $text[$i] ^ $key[$i % strlen($key)];
    }

    return $outText;
}

$data = "ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=";
echo xor_encrypt(base64_decode($data));


결과: {"showpassword":"no","bgcolor":"#ffffff"}


우리는 showpassword 값을 yes로 바꾸고 싶으므로 아래의 코드를 실행하여 필요한 쿠키값을 받아오자:


<?php
function xor_encrypt($in) {
    $key = 'qw8J';
    $text = $in;
    $outText = '';

    // Iterate through each character
    for($i=0;$i<strlen($text);$i++) {
    $outText .= $text[$i] ^ $key[$i % strlen($key)];
    }

    return $outText;
}

$defaultdata = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff");
$defaultdata = base64_encode(xor_encrypt(json_encode($defaultdata)));

echo $defaultdata;


결과:

ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK=

Tamper Data 등의 프로그램을 사용해 cookie의 data 값을 위의 결과로 바꾸면 Natas12의 비밀번호를 얻을 수 있다.


쉽다가 갑자기 빡세지네요

분류 :
망한거
조회 수 :
19
등록일 :
2020.03.07
03:19:24 (*.47.15.90)
엮인글 :
게시글 주소 :
https://hondoom.com/zbxe/index.php?mid=noru&document_srl=818054
파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )
옵션 :
:
:
List of Articles
번호 제목 글쓴이 날짜 조회 수
36 망한거 (스포일러) Natas14 풀이 노루발 2020-03-10 12
35 망한거 (스포일러) Natas13 풀이 노루발 2020-03-10 7
34 망한거 (스포일러) Natas12 풀이 노루발 2020-03-08 15
» 망한거 (스포일러) Natas11 풀이 노루발 2020-03-07 19
32 망한거 (스포일러) Natas10 풀이 노루발 2020-03-07 13
31 망한거 (스포일러) Natas9 풀이 노루발 2020-03-06 11
30 망한거 (스포일러) Natas8 풀이 노루발 2020-03-06 8
29 망한거 (스포일러) Natas7 풀이 노루발 2020-03-06 10
28 망한거 (스포일러) Natas6 풀이 노루발 2020-03-06 9
27 망한거 (스포일러) Natas5 풀이 노루발 2020-03-06 7
26 망한거 (스포일러) Natas4 풀이 노루발 2020-03-06 4
25 망한거 (스포일러) Natas3 풀이 노루발 2020-03-06 7
24 망한거 (스포일러) Natas2 풀이 노루발 2020-03-06 10
23 망한거 (스포일러) Natas1 풀이 노루발 2020-03-06 9
22 망한거 (스포일러) Natas0 풀이 노루발 2020-03-06 15
21 마실것 캄포트를 만들자 [1] 노루발 2019-08-07 30
20 오토바이 엔진에서 잡음이 나서 고쳤습니다. [3] 노루발 2019-07-31 75
19 오토바이 오토바이 체인 청소 [1] 노루발 2019-07-29 183
18 오토바이 (약혐) 오토바이 체인 청소전 사진 [4] 노루발 2019-07-27 60
17 오토바이 엔진오일 확인하고 옴 노루발 2019-07-21 27