pathtraversal 풀이

2021. 5. 29. 17:55Dreamhack Wargame

728x90

문제 제목
문제 정보
문제에서 제시된 코드
웹페이지 로그인 화면

코드를 보면 Flag is here!!이라는 주석이 붙어있는 부분이 있습니다.

파일의 이름이 flag.txt 라는 정보를 얻었습니다.

 

또한, 문제에서는 "api/flag에 있는 플래그를 획득하세요!"라고 했으니

URL에서 맨 뒷부분을 ../flag로 바꿔줘야 플래그를 찾을 수 있을 겁니다.

 

우선 guest, admin, ../flag로 입력을 했을 때 각각 어떤 결과가 나오는지 보겠습니다.

 

guest를 입력 했을 때 순간적으로 userid가 0으로 변한 모습
admin을 입력했을 때 순간적으로 userid가 1로 변한 모습
../flag를 입력 했을 때 순간적으로 userid가 undefined로 변한 모습

이 웹사이트의 동작 구조는 위처럼 3개로 나뉜다 볼 수 있을 것 같습니다.

 

그리고 ../flag가 아니라 다른 입력값을 입력 해도

똑같이 undefined로 출력이 나왔습니다.

아무래도 admin이랑 guest 외에는 전부 undefined로 출력하라고

코딩이 되어있는 것 같습니다.

 

딱 여기까지 알아내고 5분 정도 별다른 생각이 들지 않아서

한 번 웹페이지 소스코드를 뒤져보는 것도 나쁘지 않을 거란 생각이 들었습니다.

 

<!doctype html>
<html>
  <head>
    <link rel="stylesheet" href="/static/css/bootstrap.min.css">
    <link rel="stylesheet" href="/static/css/bootstrap-theme.min.css">
    <link rel="stylesheet" href="/static/css/non-responsive.css">
    <title>Get User Info Path Traversal</title>
    
  

  </head>
<body>

    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">Path Traversal</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="#about">About</a></li>
            <li><a href="#contact">Contact</a></li>
          </ul>

        </div><!--/.nav-collapse -->
      </div>
    </nav>

    <div class="container">
      
<h1>Get User Info</h1><br/>

  <pre>{&#34;userid&#34;: &#34;guest&#34;, &#34;level&#34;: 1, &#34;password&#34;: &#34;guest&#34;}</pre>

<form method="POST" id="form">
  <div class="form-group">
    <label for="userid">userid</label>
    <input type="text" class="form-control" id="userid" placeholder="userid" name="userid" value="guest" required>
  </div>
  <button type="submit" class="btn btn-default">View</button>
</form>
<script>
  const users = {
    'guest': 0,
    'admin': 1
  }
  function user(evt){
  	document.getElementById('userid').value = users[document.getElementById('userid').value];
    return true;
  }
  window.onload = function() {
    document.getElementById('form').addEventListener('submit', user);
  }
</script>

    </div> <!-- /container -->

    <!-- Bootstrap core JavaScript -->
    <script src="/static/js/jquery.min.js"></script>
    <script src="/static/js/bootstrap.min.js"></script> 
</body>
</html>

CSS 부분은 자연스럽게 패스하고

HTML 부분도 적당히 훑어봤습니다.

중요한 부분은 없는 듯합니다.

 

JS 부분을 유심히 봤더니 

 

const users = {
    'guest': 0,
    'admin': 1
}

라는 부분이 있었습니다.

 

제 예상이 맞았습니다...!

guest는 0으로, admin은 1로, 그 외 값은 undefined로 출력되는 것이었습니다!

 

이제 "그냥 입력창에 입력을 하는 걸로는 문제를 풀 수 없겠구나!"라는 큰 깨달음을 얻었습니다.

그러다가 콘솔 창을 이용해보자, 라는 생각이 들었습니다.

 

JS 부분을 보면

users[document.getElementById('userid').value]; 

이 부분에서 최종적으로 값이 입력됩니다.

 

콘솔 창에서 저 부분의 값을 조정해보겠습니다.

 

../flag로 고정 성공!

이제 admin의 값을 고정했으니 admin을 입력창에 입력해보겠습니다.

 

FLAG 획득 완료

admin이 guest로 바뀌면서 플래그가 출력된 것을 볼 수 있습니다.

 

문제 풀이 성공

콘솔 창의 활용을 더 능숙하게 해야겠다는 생각이 들었습니다.

 

users['admin']='../flag'라는 식을 생각해내기까지 20분 정도가 걸렸다는...

728x90

'Dreamhack Wargame' 카테고리의 다른 글

basic_exploitation_001 풀이  (0) 2021.07.10
broken-png 풀이  (0) 2021.06.03
file-download-1 풀이  (0) 2021.05.09
simple_sqli 풀이  (0) 2021.05.08
cookie 풀이  (0) 2021.03.09