: level 20 → level 21

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

위 사진은 natas21의 메인페이지다. 화면에 또다른 사이트로 가는 링크가 하나 보인다.

링크로 이동하기 전에 소스코드를 먼저 살펴보자.

<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": "natas21", "pass": "<censored>" };</script></head>
<body>
<h1>natas21</h1>
<div id="content">
<p>
<b>Note: this website is colocated with <a href="http://natas21-experimenter.natas.labs.overthewire.org">http://natas21-experimenter.natas.labs.overthewire.org</a></b>
</p>

<?

function print_credentials() { /* {{{ */
    if($_SESSION and array_key_exists("admin", $_SESSION) and $_SESSION["admin"] == 1) {
    print "You are an admin. The credentials for the next level are:<br>";
    print "<pre>Username: natas22\n";
    print "Password: <censored></pre>";
    } else {
    print "You are logged in as a regular user. Login as an admin to retrieve credentials for natas22.";
    }
}
/* }}} */

session_start();
print_credentials();

?>

<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>
{"mode":"full","isActive":false}

natas21의 소스코드는 이전 level과는 달리 간략해보인다.

중간에 있는 print_credentials함수 하나만 실행되는 듯 하다.

해당 함수는 $_SESSION['admin']의 값이 1이어야 natas22의 password를 보여주는 함수다.

그렇다면 다음 레벨로 가기 위해서는 $_SESSION['admin']을 추가하고 해당 값을 1로 만들어주어야 한다.

 

 

 

이 문제를 해결하기 전에 메인 페이지에 있는 링크로 이동해봤다.

위 사진은 링크에 연결된 또다른 페이지다.

CSS style을 입력받는 폼이 존재한다. 소스코드를 살펴보자.

<html>
<head><link rel="stylesheet" type="text/css" href="http://www.overthewire.org/wargames/natas/level.css"></head>
<body>
<h1>natas21 - CSS style experimenter</h1>
<div id="content">
<p>
<b>Note: this website is colocated with <a href="http://natas21.natas.labs.overthewire.org">http://natas21.natas.labs.overthewire.org</a></b>
</p>
<?  

session_start();

// if update was submitted, store it
if(array_key_exists("submit", $_REQUEST)) {
    foreach($_REQUEST as $key => $val) {
    $_SESSION[$key] = $val;
    }
}

if(array_key_exists("debug", $_GET)) {
    print "[DEBUG] Session contents:<br>";
    print_r($_SESSION);
}

// only allow these keys
$validkeys = array("align" => "center", "fontsize" => "100%", "bgcolor" => "yellow");
$form = "";

$form .= '<form action="index.php" method="POST">';
foreach($validkeys as $key => $defval) {
    $val = $defval;
    if(array_key_exists($key, $_SESSION)) {
    $val = $_SESSION[$key];
    } else {
    $_SESSION[$key] = $val;
    }
    $form .= "$key: <input name='$key' value='$val' /><br>";
}
$form .= '<input type="submit" name="submit" value="Update" />';
$form .= '</form>';

$style = "background-color: ".$_SESSION["bgcolor"]."; text-align: ".$_SESSION["align"]."; font-size: ".$_SESSION["fontsize"].";";
$example = "<div style='$style'>Hello world!</div>";

?>

<p>Example:</p>
<?=$example?>

<p>Change example values here:</p>
<?=$form?>

<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>
{"mode":"full","isActive":false}

위 소스코드에서 주목해서 봐야할 건 맨 위쪽에 있는 if문이다.

natas21을 해결하려면 세션에 admin을 추가해야 한다.

해당 소스코드는 세션에 새로운 key => value값을 추가할 수 있는 코드다. 이를 이용하면 admin 세션을 추가할 수 있다.

새로운 세션값을 추가하기 위해서는 연관배열에 submit이라는 key가 존재해야 한다.

해당 구문이 참이되면 서버로 전달하는 데이터들을 세션값으로 만들 수 있다.

그러기 위해서 submit을 GET방식으로 보내고 admin도 동일하게 GET방식으로 전달해봤다.

?debug=true&submit=Update&admin=1    (debug는 array의 추가 여부를 확인하기 위해 넣었음)

(두 번째 if문에 $_SEESION의 값을 확인할 수 있는 debug 기능이 있다.)

 

 

 

따라서 아래와 같이 URL을 작성할 수 있다.

 

 

 

해당 URL로 다시 로딩하면 아래 사진 처럼 세션의 key => value값을 확인할 수 있다.

admin => 1이 제대로 추가됐다.

CSS style 페이지에는 세션에 admin이 추가되었다. natas21을 해결하려면 메인 페이지가 해당 세션과 공유할 수 있어야 한다.

두 페이지간 세션값을 공유하기 위해서 CSS style 페이지의 PHPSESSID값을 메인 페이지의 PHPSESSID에 복사하고 실행해봤다.

 

 

 

그 결과 natas22의 password를 얻어낼 수 있었다.

 

natas22 password: chG9fbe1Tq2eWVMgjYYD1MsfIvN461kJ

 

 

 

 

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

[natas] Level 21 -> Level 22  (0) 2021.07.20
[LOS] darkknight  (0) 2021.07.17
[LOS] golem  (0) 2021.07.11
[natas] Level 19 -> Level 20  (0) 2021.07.11
[LOS] skeleton  (0) 2021.06.27
복사했습니다!