급 난이도 상승;
xor_encrypt함수 내부의 $key값은 내가 알아내야된다. 처음엔 '<censored>'라고 있어서 이거
자체가 키값인줄 알았는데 똑같은 소스코드로 돌려봤는데 같은 결과가 안나오고, censored라는
단어를 찾아보니 검열되어 삭제된 그런 뜻이 있어서 key값을 구해야된다는걸 알았다.
쿠키는 아래 함수로 만들어진다.
function saveData($d) {
setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
}
이게 맨 마지막에 실행된다. 실행되는 부분은
$data = loadData($defaultdata);
if(array_key_exists("bgcolor",$_REQUEST)) {
if (preg_match('/^#(?:[a-f\d]{6})$/i', $_REQUEST['bgcolor'])) {
$data['bgcolor'] = $_REQUEST['bgcolor'];
}
}
saveData($data);
인데, loadData()함수를 살펴보면 내가 입력한 데이터로 $defaultdata의 값이 바뀌어서 들어간다.
즉 인자없이 그냥 처음 실행될때는 그냥 $data == $defaultdata; 라는 소리이다.
그러면 맨 마지막줄의 savaData함수는 savaData($defaultdata); 라고 봐도 무방하다.
그러면 쿠키는 setcookie("data", base64_encode(xor_encrypt(json_encode($defaultdata))));
이렇게 생성된 쿠키이다. 거꾸로 진행하여 xor_encrypt함수의 키 값을 알아야한다.
키값을 알아낸다음 $defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
이 변수의 showpassword를 yes로 만들어서 다시 인코딩을 여러번 해서 쿠키값으로 넣어주면 될것이다.
xor의 성질중에 a^b=c, c^b=a, a^c=b의 성질을 이용했다.
키값 알아내기.
<? function xor_encrypt() { $cookie = base64_decode("ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sF0cIaAw%3D"); //결과값부분 $defaultdata = json_encode(array( "showpassword"=>"no", "bgcolor"=>"#ffffff")); //인자부분 // Iterate through each character for($i=0;$i<strlen($defaultdata);$i++) { echo $defaultdata[$i] ^ $cookie[$i % strlen($cookie)]; } } xor_encrypt(); ?>
이런식으로 짤경우 키값이 쿠키값보다 길이가 짧을 경우 키값이 반복될것이다.(길이가 짧다.)
encrypt시킬시에 $text[$i] ^ $key[$i % strlen($key)]와 같은 알고리즘으로 encrypt시키는데
key배열을 계속 처음부터 길이만큼 반복하면서 암호화시키기 때문이다. 반대로 위에서 짠 알고리즘으로
decrypt할 경우에는 반대로 키값이 계속 반복될것이다. 그 반복되는 부분이 키값이다.
실행결과 키값은 qw8J로 알 수 있다. 그러면 이제 이 키값을 가지고 잘 인코딩해서 쿠키값에 집어넣으면
된다.
<? $defaultdata = 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; } echo base64_encode(xor_encrypt(json_encode($defaultdata))); ?>
쿠키값이 출력되며 바꿔주면 통과
'webhacking > etc' 카테고리의 다른 글
GoogleBig - HackGame (0) | 2014.12.01 |
---|---|
Enigmagroup basic/Prerequisites, Spoofing, URL Manipulation (0) | 2014.11.30 |
overthewire natas 1~10 (0) | 2014.11.24 |
wargame.kr type_confusion (0) | 2014.10.30 |
wargame.kr login_with_crypto_but (0) | 2014.10.29 |