Over the Wire/natas

[OvertheWire:natas] natas 10 → 11

ruming 2021. 5. 18. 15:48

쿠키값이 XOR 암호화로 보호되어 있다고 한다.

 

소스코드 확인

<html>
<head>
<!-- This stuff in the header has nothing to do with the level -->
<link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css">
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" />
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" />
<script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script>
<script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script>
<script src=http://natas.labs.overthewire.org/js/wechall-data.js></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script>
<script>var wechallinfo = { "level": "natas11", "pass": "<censored>" };</script></head>
<?

$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");

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;
}

function loadData($def) {
    global $_COOKIE;
    $mydata = $def;
    if(array_key_exists("data", $_COOKIE)) {
    $tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true);
    if(is_array($tempdata) && array_key_exists("showpassword", $tempdata) && array_key_exists("bgcolor", $tempdata)) {
        if (preg_match('/^#(?:[a-f\d]{6})$/i', $tempdata['bgcolor'])) {
        $mydata['showpassword'] = $tempdata['showpassword'];
        $mydata['bgcolor'] = $tempdata['bgcolor'];
        }
    }
    }
    return $mydata;
}

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



?>

<h1>natas11</h1>
<div id="content">
<body style="background: <?=$data['bgcolor']?>;">
Cookies are protected with XOR encryption<br/><br/>

<?
if($data["showpassword"] == "yes") {
    print "The password for natas12 is <censored><br>";
}

?>

<form>
Background color: <input name=bgcolor value="<?=$data['bgcolor']?>">
<input type=submit value="Set color">
</form>

<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>

XOR 암호화

https://underwatch.tistory.com/31

반전되는 것이 특징이기 때문에 한번 더 암호화하면 원래대로 돌아온다고 한다.

 

json_encode

json 문자열로 변환하는 함수라고 한다.

 

showpass를 yes로 만들어야 패스워드를 얻을 수 있다.

jason_encode, xor_encrypt, base64_encode로 총 세 번을 암호화한다.

 

key값을 구하려면 XOR의 특징에 대해 이해하고 있어야 한다. A^B = C라고 하면 A^C=B가 되는 성질을 이용한다.

<?php
$data = base64_decode("ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sF04BaAw%3D");
$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");

function xor_encrypt($in) {
    global $data;
    $text = $in;
    $outText = '';

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

$defaultdata1 = json_encode($defaultdata);
$data = xor_encrypt($defaultdata1);

print $data;

?> 

결과값 : qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq(gJq

뒤에가 왜 이상하게 나왔는지 모르겠다.

키는 반복되는 qw8J이다. showpassword값을 yes로 바꾼후 xor연산을 할 것이다.

 

<!DOCTYPE html>
<html>
<body>

<?php
$data = base64_decode("ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sF04BaAw%3D");
$defaultdata = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff");

function xor_encrypt($in) {
    global $data;
    $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 = json_encode($defaultdata);
$key = xor_encrypt($defaultdata);

print base64_encode($key);

?> 

</body>
</html>

쿠키값은 다음과 같다.

ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK

쿠키값을 적용시키니 다음 비밀번호를 획득할 수 있었다.

 

EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3

 

'Over the Wire > natas' 카테고리의 다른 글

[OvertheWire:natas] level 12 → 13  (0) 2021.05.23
[OvertheWire:natas] natas 11 → 12  (0) 2021.05.23
[OvertheWire:natas] level 9 → 10  (0) 2021.05.16
[natas] level 8 → 9  (0) 2021.05.09
[natas] level 7 → 8  (0) 2021.05.09