: level 10 → level 11

http://natas11.natas.labs.overthewire.org

 

 

 

이번에도 역시 소스코드 먼저 확인했다. 소스코드는 다음과 같다.

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

코드가 길어서 복잡해보이지만, 천천히 살펴보면 data가 XOR로 암호화되고 있고, 이것을 인코드한 $data["showpassword"]의 값이 yes이면 natas12의 password가 출력되는 것을 알 수 있다.

 

잘보면 data의 값은 cookie에 의해 결정되기 때문에 $data["showpassword"]가 yes가 되는 cookie값을 전달해주면 natas12의 password를 알아낼 수 있을 것이다.

 

그러기 위해선 먼저 xor_encrypt 함수의 $key값을 알아내야 한다.

XOR연산은 A ^ B = C    →    A ^ C = B 라는 특징을 갖고 있기 때문에 쉽게 $key값을 알아낼 수 있다.

 

 

 

function saveData($d) {
    setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
}

위 saveData 함수는 json_encode -> xor_encrypt -> base64_encode 순으로 실행된다.

base64_decode()의 반환값과 key를 XOR 연산하면 json_encode()의 반환값이 나올 것이다. 여기서 XOR 연산의 특징을 이용해서 base64_decode()의 반환값과 json_encode()의 반환값을 XOR 연산하면 key값이 나올 것이다.

 

cookie 값은 다음과 같다.

 

다음과 같이 key값을 알아낸 결과,

qw8J가 반복출력되고 있는 것을 알 수 있었다.

 

 

 

이제 이 key값을 이용해서 cookie값을 세로 세팅할 수 있다.

새로운 쿠키값은 다음과 같다.

 

 

 

cookie값을 다음과 같이 바꿔주면 natas12 password를 얻을 수 있다.

natas12 password: EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3

 

 

 

 

'Study > Web Hacking' 카테고리의 다른 글

[XSS Challenge] Stage #9  (0) 2021.05.15
[LOS] wolfman  (0) 2021.05.15
[natas] Level 9 -> Level 10  (0) 2021.05.14
[XSS Challenge] Stage #8  (0) 2021.05.08
[XSS Challenge] Stage #7  (0) 2021.05.08
복사했습니다!