"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)