Over the Wire/natas

[OvertheWire:Natas] natas 20 → 21 / natas21

ruming 2021. 7. 19. 06:09

원래 페이지의 소스코드

<?

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

?>

admin을 1로 만들어야함을 알 수 있다. 

 

하이퍼링크가 걸린 사이트로 들어가보았다.

해당 웹페이지의 소스코드

<?  

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

?>

이번에도 디버그를 출력해주길래 파라미터에 다음과 같이 입력했다.

 

?debug=true&admin=1

그러나 화면에는 나타나지 않았다. 새로운 세션을 추가하기 위해선 submit=Update라는 값이 추가되어야 한다.

 

해당 값을 추가하고 다시 로드하면

위와 같이 admin이 나타나는 것을 볼 수 있다. 

 

최종 페이로드

?debug=true&align=center&fontsize=100%&bgcolor=yellow&submit=Update&admin=1

 

이제 이 사이트의 쿠키값을 메인 페이지에 넣어줄 것이다.

개발자도구로 세션값을 복사해서 메인페이지에 붙여넣었다.

패스워드를 얻을 수 있었다!

chG9fbe1Tq2eWVMgjYYD1MsfIvN461kJ