접기
소스코드가 전 코드에 비하면 매우 복잡하다. 하지만 잘 보면 xor 연산을 통해서 암호화 하고있다는 것을 볼 수 있다. xor 연산은 a xor b = c 이면 a xor c = b 가 될 수도 있다. 이 점을 이용해서 키값을 찾고, showpassword를 yes로 바꾸어 암호화 해서 보내면 패스워드를 알 수 있다. 현재 알고있는 값은 평문과 암호문이다. 그러면 평문과 암호문을 xor해서 키 값을 알아낸다. key 값은 똑같은 4개의 문자가 반복되는 것을 볼 수 있다. 이 key를 이용해서 show password를 yes로 바꿔 암호문을 만들어낸다. 이 암호문 값을 cookie에 있는 data에 넣어주면 비밀번호는 풀린다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
# key 값 찾기
$enc = "ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw%3D" ;
$plain = array ( "showpassword" = > "no" , "bgcolor" = > "#ffffff" );
function xor_encrypt($in ) {
global $enc ;
$key = base64_decode ($enc );
$text = $in ;
$outText = '' ;
// Iterate through each character
for ($i =0 ;$i <strlen($text );$i ++ ) {
$outText .= $text [$i ] ^ $key [$i % strlen($key )];
}
return $outText ;
}
$plain = json_encode($plain );
$key = xor_encrypt($plain );
echo $key . "\n" ;
# 결과 key 값 : qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq
?>
IT Secu0rity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
# 암호문 만들기
$enc = "ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw%3D" ;
$plain = array ( "showpassword" = > "yes" , "bgcolor" = > "#ffffff" );
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 ;
}
$plain = json_encode($plain );
$key = xor_encrypt($plain );
echo base64_encode ($key ) . "\n" ;
# 결과 암호문 값 : ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK
?>
IT Security
접기