ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Root-me> PHP - register globals
    Wargame/Root-me = Web - Server 2022. 1. 14. 12:18

    PHP - register globals

    비밀번호를 입력할 수 있다.

     

    문제 설명을 보면

    개발자들이 종종 백업 파일을 주변에 남겨둔다고 한다.

     

    BAK 파일은 동일한 목적으로 여러 응용 프로그램에서 모두 사용되는 백업 파일이다. 대부분의 BAK 파일은 백업을 저장해야하는 프로그램에 의해 자동으로 작성된다.

    따라서, ./index.php.bak을 입력하면 index.php.bak 파일을 다운로드 받을 수 있다. 

     

    index.php.bak 파일을 열면

    <?php
    
    function auth($password, $hidden_password){
        $res=0;
        if (isset($password) && $password!=""){
            if ( $password == $hidden_password ){
                $res=1;
            }
        }
        $_SESSION["logged"]=$res;
        return $res;
    }
    
    function display($res){
        $aff= '
    	  <html>
    	  <head>
    	  </head>
    	  <body>
    	    <h1>Authentication v 0.05</h1>
    	    <form action="" method="POST">
    	      Password&nbsp;<br/>
    	      <input type="password" name="password" /><br/><br/>
    	      <br/><br/>
    	      <input type="submit" value="connect" /><br/><br/>
    	    </form>
    	    <h3>'.htmlentities($res).'</h3>
    	  </body>
    	  </html>';
        return $aff;
    }
    
    session_start();
    if ( ! isset($_SESSION["logged"]) )
        $_SESSION["logged"]=0;
    
    $aff="";
    include("config.inc.php");
    
    if (isset($_POST["password"]))
        $password = $_POST["password"];
    
    if (!ini_get('register_globals')) {
        $superglobals = array($_SERVER, $_ENV,$_FILES, $_COOKIE, $_POST, $_GET);
        if (isset($_SESSION)) {
            array_unshift($superglobals, $_SESSION);
        }
        foreach ($superglobals as $superglobal) {
            extract($superglobal, 0 );
        }
    }
    
    if (( isset ($password) && $password!="" && auth($password,$hidden_password)==1) || (is_array($_SESSION) && $_SESSION["logged"]==1 ) ){
        $aff=display("well done, you can validate with the password : $hidden_password");
    } else {
        $aff=display("try again");
    }
    
    echo $aff;
    
    ?>

    문제를 해결하기 위해서는

    $password 값이 설정되어있어야 하고, 빈 문자열이 아니어야 한다.

    그리고 auth($password, $hidden_password)가 1을 반환해야 한다.

     

    또는, $_SESSION이 배열이어야 하고, $_SESSION["logged"]가 1이어야 한다.

     

    따라서, URL에 ?_SESSION[logged]=1을 입력하면

    비밀번호를 획득할 수 있다.

     

    대부분의 웹 사이트에서는 $_SESSION[logged]를 사용할 수 없다.

    register globals는 php.ini 설정의 내부 php 설정으로, 서버에 접근하는 방법을 제어하며 ON과 OFF 상태가 존재한다.

    보안 문제로 인해 default는 OFF 상태이다.

    ON 상태이면, Global 배열(GET[], POST[], REQUEST[] 등) 없이 양식 속성에 접근할 수 있다.

    OFF 상태이면, Global 배열을 통해서만 모든 속성에 접근해야 한다.

     

    문제 제목이 register globals인 것으로 보아 ON 상태임을 짐작할 수 있다.

    'Wargame > Root-me = Web - Server' 카테고리의 다른 글

    <Root-me> Local File Inclusion  (0) 2022.01.18
    <Root-me> Python - Server-side Template Injection  (0) 2022.01.15
    <Root-me> PHP - Filters  (0) 2022.01.13
    <Root-me> File upload - Null byte  (0) 2022.01.11
    <Root-me> Directory traversal  (0) 2022.01.11
Designed by Tistory.