webhacking/etc

overthewire natas 11

qkqhxla1 2014. 11. 24. 17:25

급 난이도 상승; 


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