Dreamhack/Dreamhack Wargame (Challenge)

[41] IT 비전공자 [dreamhack]image-storage문제 풀기

imaginefuture-1 2024. 10. 20. 08:05

 

후후 41번째 문제..과연 무슨 문제가..?

 

 

 

오호 파일 업로드..? 새로운 해킹 방법인데..!

 

 

php

 

PHP는 웹사이트에 회원가입을 할 때 아이디 검사, 주소 검색, 비밀번호 유효성 검사 등의 행위를 실행하도록 만들어주는 역할을 합니다. 조금 더 자세히 설명드리자면 동적인 웹페이지를 만들기 위해 설계가 된 언어입니다.

 

홈페이지를 들어가니 사진을 업로드하고 공유하라고한다 하나씩 찬찬히 둘러보자

 

업로드한게 아직 아무것도 없다보니 리스트에는 아무것도 없다.

 

upload page에 업로드 할 수 있다.

 

업로드를 해본다

 

오! 리스트 page에 업로드 되었다

 

 

c언어 트리 사진이 야무지게 업로드 되었다

 


 

흠 파일 업로드 취약점을 이용해 flag를 획득해라는건...하나도 모르겠다 (먼산)

 

이럴땐 우리 gpt를 불러보자

 

나:

 

php로 작성된 파일 저장 서비스에서 파일 업로드 취약점이 뭐가 있어?

 

gpt:

 

PHP로 작성된 파일 저장 서비스에서 발생할 수 있는 파일 업로드 취약점은 여러 가지가 있으며, 이들 취약점은 보안에 심각한 위협을 줄 수 있습니다. 주요 취약점은 다음과 같습니다:

1. 파일 확장자 검증 실패

  • 서버가 사용자가 업로드하는 파일의 확장자를 충분히 검증하지 않는 경우, 악성 파일(예: .php, .exe 등)이 업로드될 수 있습니다.
  • 공격자는 PHP 스크립트 파일을 업로드하여 서버에서 이를 실행하도록 유도할 수 있습니다.

2. MIME 타입 검증 실패

  • 업로드된 파일의 MIME 타입을 제대로 검증하지 않는 경우, 실제 파일 형식과 다른 형식으로 인식될 수 있습니다. 예를 들어, 텍스트 파일의 MIME 타입이 text/plain으로 설정되었지만, 실제로는 악성 코드를 포함한 스크립트일 수 있습니다.

3. 파일 이름 변경

  • 사용자가 제공한 파일 이름을 그대로 사용하면, 파일 이름에 악성 코드를 포함할 수 있습니다. 예를 들어, 공격자가 malicious.php라는 이름으로 파일을 업로드할 수 있습니다.
  • 파일 이름을 처리할 때 특수 문자나 경로 구분자를 필터링하지 않으면, 경로 탐색 공격이 가능해질 수 있습니다.

4. 디렉토리 탐색 공격

  • 업로드된 파일이 저장되는 경로를 잘못 처리하면, 공격자가 상위 디렉토리로 접근하여 시스템의 다른 파일에 접근할 수 있습니다. 예를 들어, ../../etc/passwd와 같은 경로를 통해 시스템 파일에 접근할 수 있습니다.

5. 파일 크기 제한 미설정

  • 파일 크기에 대한 제한을 설정하지 않으면, 대용량 파일을 업로드하여 서비스 거부(DoS) 공격을 수행할 수 있습니다. 이는 서버의 저장 공간을 소모하고, 다른 사용자의 파일 업로드를 방해할 수 있습니다.

6. 서버 측 코드 실행

  • 악성 파일이 서버에 업로드되어 실행될 수 있는 경우, 서버가 손상되고 데이터가 유출될 수 있습니다. 공격자는 서버 권한을 탈취하거나 데이터베이스에 접근할 수 있습니다.

7. 악성 스크립트 포함

  • 공격자는 악성 스크립트를 포함한 파일을 업로드하여 다른 사용자가 해당 파일에 접근할 때 악성 코드를 실행할 수 있습니다. 이는 사용자의 세션 하이재킹이나 개인 정보 탈취로 이어질 수 있습니다.

예방 조치

이러한 취약점을 방지하기 위해 다음과 같은 예방 조치를 취할 수 있습니다:

  1. 파일 확장자 및 MIME 타입 검증: 업로드된 파일의 확장자와 MIME 타입을 엄격하게 검증합니다. 허용된 형식만 업로드할 수 있도록 제한합니다.
  2. 파일 이름 처리: 파일 이름을 안전한 형식으로 변경하고, 특수 문자를 필터링합니다.
  3. 디렉토리 접근 제한: 파일 업로드 경로를 안전하게 설정하고, 경로 탐색 공격을 방지합니다.
  4. 파일 크기 제한 설정: 업로드할 수 있는 파일의 최대 크기를 설정합니다.
  5. 업로드 파일 저장 방식: 업로드된 파일을 실행할 수 없는 경로에 저장하고, PHP 파일 실행을 비활성화합니다.
  6. 웹 애플리케이션 방화벽(WAF): 악성 요청을 차단하기 위해 WAF를 사용합니다.

이러한 방법들을 통해 파일 업로드 취약점을 최소화할 수 있습니다.

 

 

오호 말그대로

파일을 업로드하는 과정에서 파일 이름, 확장, 크기, 악성 파일 자체 업로드, 악성 스크립트 포함 파일 업로드,

무려 경로 문제까지!!

 

보안입장에서 엄청 까다로운 녀석이다.,.

 

일단 소스코드를 한번보자

 

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>

 

 


gpt:

 

이 PHP 스크립트는 파일 업로드 기능을 구현한 간단한 웹 애플리케이션입니다. 사용자가 파일을 업로드할 수 있도록 HTML 폼을 제공하며, 서버는 업로드된 파일을 지정된 디렉토리에 저장합니다. 아래에서 각 부분을 자세히 분석하겠습니다.

코드 분석

  1. PHP 파일 업로드 처리:
    • HTTP 요청 메서드가 POST인지 확인하여, 파일 업로드 요청이 들어왔을 때만 처리를 시작합니다.
  2. php
    코드 복사
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  3. 파일 정보 가져오기:
    • $_FILES 배열을 사용하여 업로드된 파일의 정보를 가져옵니다. 여기서 $_FILES["file"]는 HTML 폼에서 name 속성이 file인 입력 요소의 정보를 포함합니다.
    • $directory: 파일이 저장될 디렉토리 경로입니다.
    • $error: 파일 업로드 시 발생한 오류 코드입니다.
    • $name: 업로드된 파일의 원래 이름입니다.
    • $tmp_name: PHP가 임시로 저장한 파일의 경로입니다.
  4. php
    코드 복사
    if (isset($_FILES)) { $directory = './uploads/'; $file = $_FILES["file"]; $error = $file["error"]; $name = $file["name"]; $tmp_name = $file["tmp_name"];
  5. 파일 업로드 오류 처리:
    • 파일 업로드 중 오류가 발생하면 해당 오류 코드를 출력합니다.
  6. php
    코드 복사
    if ($error > 0) { echo "Error: " . $error . "<br>";
  7. 파일 존재 여부 확인:
    • 동일한 이름의 파일이 이미 업로드된 경우, 사용자에게 경고 메시지를 출력합니다.
  8. php
    코드 복사
    if (file_exists($directory . $name)) { echo $name . " already exists. ";
  9. 파일 저장:
    • move_uploaded_file() 함수를 사용하여 임시 파일을 지정된 디렉토리로 이동합니다. 성공적으로 저장되면 파일 경로를 출력합니다.
  10. php
    코드 복사
    if (move_uploaded_file($tmp_name, $directory . $name)) { echo "Stored in: " . $directory . $name; }
  11. HTML 폼:
    • 파일을 업로드하기 위한 HTML 폼을 정의합니다. enctype='multipart/form-data' 속성은 파일 데이터를 서버로 전송하기 위해 필요합니다.
    • <input type="file"> 요소를 사용하여 사용자가 파일을 선택할 수 있도록 합니다.
  12. html
    코드 복사
    <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>

잠재적인 취약점

  1. 파일 확장자 검증 실패:
    • 서버가 업로드되는 파일의 확장자를 검증하지 않으므로, 악성 스크립트(예: .php 파일 등)가 업로드될 수 있습니다.
  2. MIME 타입 검증 실패:
    • 서버는 업로드된 파일의 MIME 타입을 확인하지 않으므로, 실제 파일 형식과 다르게 처리될 수 있습니다.
  3. 디렉토리 탐색 공격:
    • 사용자 입력을 검증하지 않으면, 공격자가 경로 탐색 공격을 통해 서버의 다른 파일에 접근할 수 있습니다.
  4. 파일 크기 제한 미설정:
    • 파일 크기에 대한 제한이 없으면, 대용량 파일을 업로드하여 서비스 거부(DoS) 공격이 발생할 수 있습니다.
  5. 파일 이름 처리 부족:
    • 파일 이름을 직접 사용하여 저장하므로, 특수 문자가 포함된 파일 이름이 문제를 일으킬 수 있습니다. 예를 들어, 공격자가 ../ 문자를 사용하여 의도하지 않은 위치에 파일을 저장하려고 할 수 있습니다.

결론

이 PHP 스크립트는 기본적인 파일 업로드 기능을 제공하지만, 여러 가지 보안 취약점이 존재합니다. 파일 업로드를 처리할 때는 다음과 같은 방어책을 고려해야 합니다:

  • 파일 확장자 및 MIME 타입 검증: 허용된 파일 형식만 업로드하도록 검증합니다.
  • 안전한 파일 이름 처리: 파일 이름을 안전하게 변경하고, 경로 탐색 공격을 방지합니다.
  • 파일 크기 제한 설정: 업로드할 수 있는 파일의 최대 크기를 설정합니다.
  • 파일 저장 경로 보호: 업로드된 파일이 실행될 수 없도록 별도의 디렉토리에 저장합니다.

이러한 보안 조치를 통해 파일 업로드 기능을 보다 안전하게 만들 수 있습니다.

 


 

나:

 

                                                    어떻게 하면 flag 파일을 파일 업로드 과정에서 볼 수 있을까?
 

 

 

gpt:

 

 

flag.txt 파일을 파일 업로드 과정에서 볼 수 있는 방법은 보안 취약점을 이용하는 것입니다. 아래에서는 이 PHP 파일 업로드 스크립트의 잠재적인 취약점을 이용하여 flag.txt 파일을 읽거나 접근할 수 있는 몇 가지 방법을 설명하겠습니다.

1. 악성 PHP 파일 업로드

가장 일반적인 방법은 악성 PHP 파일을 서버에 업로드하는 것입니다. 이를 위해, 파일 업로드 취약점을 이용해 서버에서 PHP 코드를 실행할 수 있는 파일을 업로드할 수 있습니다.

절차

  1. PHP 웹 쉘 작성:
    • 간단한 PHP 웹 쉘을 작성합니다. 이 웹 쉘은 서버에서 PHP 코드를 실행할 수 있는 기능을 포함합니다.
    php
    코드 복사
    <?php if (isset($_GET['file'])) { echo file_get_contents($_GET['file']); } ?>
    • 이 코드를 shell.php라는 이름으로 저장합니다.
  2. 업로드:
    • 위의 스크립트를 업로드하는 과정에서 파일 확장자 검증이 이루어지지 않으면, shell.php 파일을 업로드합니다. 이때, 파일 이름이 flag.txt로 덮어쓰기 되지 않도록 합니다.
  3. 플래그 파일 접근:
    • 업로드가 성공하면, 웹 브라우저에서 다음과 같은 URL을 통해 flag.txt 파일의 내용을 읽습니다.
    plaintext
    코드 복사
    http://<서버 주소>/shell.php?file=./flag.txt

2. 경로 탐색 공격

경로 탐색을 통해 flag.txt 파일에 접근할 수도 있습니다. 만약 파일 경로 검증이 제대로 이루어지지 않으면, 사용자가 입력한 파일 이름에 ../와 같은 경로 탐색 문자를 포함시켜, 다른 디렉토리에 있는 파일에 접근할 수 있습니다.

절차

  1. 파일 업로드:
    • 파일 업로드를 통해 flag.txt 파일을 요청하는 코드가 있는 파일을 업로드합니다. 예를 들어, 파일 이름을 ../../uploads/flag.txt로 설정할 수 있습니다.
  2. 접근 시도:
    • 파일 업로드가 성공하면, 웹 브라우저에서 접근하여 해당 경로의 파일을 확인합니다.

3. 취약점 검사

위 방법들이 성공하기 위해서는 다음과 같은 조건이 충족되어야 합니다:

  • 파일 확장자 검증이 없거나 미약할 것: 업로드된 파일의 확장자나 MIME 타입 검증이 제대로 이루어지지 않아야 합니다.
  • 디렉토리 탐색이 허용될 것: 사용자 입력이 충분히 검증되지 않아야 하며, 경로 탐색이 가능해야 합니다.
  • 서버에서 PHP 파일 실행이 가능할 것: 업로드된 PHP 파일이 웹 서버에서 실행될 수 있어야 합니다.

주의 사항

  • 위의 방법은 교육적 목적으로만 설명되었으며, 실제 공격 행위는 불법입니다. 보안 취약점을 이해하고 방어 방법을 배우는 데 목적이 있습니다.
  • 웹 애플리케이션을 안전하게 만들기 위해서는 이러한 취약점을 방지하는 것이 중요하며, 필수적인 보안 조치를 적용해야 합니다.

방어 방법

  • 파일 업로드 검증: 확장자 및 MIME 타입 검증을 강화합니다.
  • 파일 이름 안전 처리: 업로드된 파일 이름을 안전하게 변경하고, 디렉토리 탐색을 방지합니다.
  • PHP 실행 제한: 업로드된 파일이 있는 디렉토리에서 PHP 실행을 비활성화합니다.
  • CSP 및 WAF: 콘텐츠 보안 정책(CSP)을 적용하고 웹 애플리케이션 방화벽(WAF)을 사용하여 악성 요청을 차단합니다.

이와 같은 방어 방법을 통해 웹 애플리케이션의 보안을 강화할 수 있습니다.

 

좋아 해보자고

 

 

shell.php파일을 업로드했다
 

 

 

아무일도 없었다..

 

 

 


 

gpt: 

 

 

`shell.php` 파일을 업로드했음에도 불구하고 흰 화면만 보이는 경우에는 여러 가지 원인이 있을 수 있습니다. 아래에서 점검해야 할 몇 가지 사항과 가능성을 정리하겠습니다.

### 점검해야 할 사항

1. **PHP 오류 표시 설정**:
   - PHP 오류가 발생했지만 표시되지 않을 수 있습니다. `php.ini` 설정에서 오류 표시를 활성화하거나, 스크립트에서 다음 코드를 추가하여 오류를 확인할 수 있습니다.
   ```php
   <?php
   error_reporting(E_ALL);
   ini_set('display_errors', 1);
   ?>
   ```

2. **파일 경로 및 권한**:
   - `shell.php` 파일이 실제로 업로드된 위치에 있는지 확인합니다. 파일 권한이 적절히 설정되어 있어야 하며, 웹 서버가 해당 파일을 실행할 수 있는 권한이 있어야 합니다.

3. **웹 서버 로그 확인**:
   - 웹 서버의 에러 로그를 확인하여 PHP 오류나 다른 문제를 찾습니다. 로그 파일은 일반적으로 `/var/log/apache2/error.log` (Apache) 또는 `/var/log/nginx/error.log` (Nginx)에 위치합니다.

4. **PHP 실행 여부 확인**:
   - 서버에서 PHP가 올바르게 실행되고 있는지 확인합니다. 간단한 PHP 스크립트를 사용하여 PHP 실행이 가능한지 확인할 수 있습니다.
   ```php
   <?php
   echo "PHP is working!";
   ?>
   ```

5. **웹서버의 디렉토리 설정**:
   - 업로드한 파일이 있는 디렉토리에서 PHP 파일 실행이 허용되어 있는지 확인합니다. 예를 들어, `.htaccess` 파일에 PHP 파일을 실행할 수 없도록 설정되어 있을 수 있습니다.

6. **CSRF 및 보안 정책**:
   - 특정 보안 설정이 파일 업로드를 제한하고 있는지 확인합니다. 예를 들어, CSP(Content Security Policy)가 적용되어 있다면 외부 스크립트의 실행이 차단될 수 있습니다.

### 기본적인 웹 쉘 코드

올바르게 작성된 기본 웹 쉘 코드는 다음과 같습니다. `shell.php` 파일에 다음 코드를 삽입해 보세요.

```php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

if (isset($_GET['file'])) {
    $file = $_GET['file'];
    if (file_exists($file)) {
        echo nl2br(htmlspecialchars(file_get_contents($file)));
    } else {
        echo "File does not exist.";
    }
} else {
    echo "No file specified.";
}
?>
```

이 스크립트는 쿼리 문자열에서 `file` 매개변수를 가져와서 해당 파일의 내용을 읽어 표시합니다. 이 코드를 업로드하고, 다음과 같은 URL로 접근해 보세요:

```
http://<서버 주소>/shell.php?file=./flag.txt
```

### 결론

이러한 점검 사항을 통해 문제를 해결할 수 있을 것입니다. 문제가 계속된다면, 추가적인 정보를 제공해 주시면 더 구체적으로 도와드릴 수 있습니다.

마지막 소스코드를 삽입해 업로드했더니..!!
응 안돼~

 


 

 

블로그...블로그 해설이 필요하다...

 

https://man-25-1.tistory.com/127

 

[웹해킹] dreamhack image-storage

dreamhack image-storage write up php로 작성된 파일 저장 서비스에서 파일 업로드 취약점을 이용해서 플래그를 획득해야한다. 문제 풀이 접속해서 upload 탭을 누르면 위와 같이 뜬다. 특이한 점이 있는지

man-25-1.tistory.com

엌ㅋㅋ php 코드 너무 간단했고..

system 함수를 이용하는거였다..

system 함수는 뭐지..

 

 

system() 함수는 PHP에서 외부 프로그램이나 명령어를 실행할 때 사용하는 함수입니다. 이 함수는 명령어의 실행 결과를 출력하고, 마지막 명령어의 종료 상태를 반환합니다.

 

https://blog.naver.com/imm7745/221787926378

 

[PHP]외부 명령 실행하기

[PHP]외부 명령 실행하기 PHP에서 윈도우 시스템의 명령 실행하기 exec 함수 - 실행 결과의 마...

blog.naver.com

흠...이런 느낌..?

 

https://paric.tistory.com/m/789

 

[PHP]System program execution

escapeshellarg(string $arg): string 문자열 주위에 작은 따옴표를 추가하고 기존의 작은 따옴표를 인용/이스케이프하여 문자열을 쉘 함수에 직접 전달하고 단일 안전한 인수로 처리할 수 있도록 합니다.

paric.tistory.com

 

어...이건 내 머리속 지식의 한계인데

https://01092090536.tistory.com/36

 

[A1] PHP 코드 인젝션

PHP 코드 인젝션 페이지가 GET 메서드로 요청하기 때문에 URL에 message 라는 변수를 노출한다 PHP에서 exec()함수나 eval() 함수를 사용한 경우 세미콜론 ; 을 사용하여 다른 함수를 실행하는 취약점이

01092090536.tistory.com

오오오 이런 느낌..?

 

php문은 아직 나에게 미지의 영역 같다..!

드림핵 강의 들어야하는데ㅔㅔㅔㅔ흐아ㅏㅏ