김승현

[Dreamhack : Web] Apache htaccess 본문

Web/Dreamhack : Web

[Dreamhack : Web] Apache htaccess

kshind 2023. 2. 28. 12:25

문제

\

파일 취약점을 이용해서 서버의 권한을 획득하는 문제이다.

 

풀이

접속하면 이렇게 파일을 선택할 수 있게 되어있다. 아무 파일이나 업로드 해보자.

bof4.txt라는 파일을 골랐고 submit해보자.

이렇게 저장된 주소가 출력되고

해당 주소로 가보면 파일 내용이 출력이 된다.

다운한 파일들을 살펴보자.

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

 

index는 그냥 페이지를 구성하는 내용들이다.

 

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

전체코드이다.

시작부분을 보면 저장명부터 배열의 내용이 포함되면 거부될 것 같은 느낌이 든다.

파일이 입력되었다면 file, error, name, tmp_name 각각에 해당 내용들을 저장한다.

만약 에러가 있으면 Error :와 에러 내용출력

그게 아니면 temp에 name을 . 기준으로 나눠서 저장하고 extension에 마지막 배열값을 저장한다.(확장자)

만약 확장자에 upload.php 젤 처음에 나왔던 deniedExts 내용이 포함될 경우 확장자 파일 업로드를 허락할 수 없다고

출력되고 만약 deniedExts 내용이 없다면 해당 파일을 upload/[파일명]에 업로드 됐다고 출력한다.

그게 아니면 그냥 파일이 선택되지 않았다고 출력된다. 해당 내용을 공백으로 치환하는 거도 아니라서

php를 phphpp와 같이 바꿀 순 없다. 제목에서 볼 수 있듯이 .htaccess를 이용해보자

.htaccess를 이렇게 작성해서 webshell.txt가 업로드되면 php로 핸들러가 처리돼서 php로 적용된다.

근데 이렇게 하려면 실험할 때 계속 webshell.txt 파일 하나만 이용해야 해서 아래의 코드를 하나 더 추가해줬다.

이건 .phpp확장자가 입력되면 php로 자동으로 인식해주는 코드이다.


.htaccess 내용은 아래 블로그의 내용을 참고해서 썼다.

 

Apache .htaccess 취약점

1. 특정 확장자를 php로 인식 시킬 수 있다. 즉, php 확장자에 대한 필터링을 우회할 수 있다는 뜻.  ...

blog.naver.com


 

파일명이 phpp인데 ifconfig가 잘 작동하는 걸 볼 수 있다.

ls -al /을 하는 php파일을 하나 만들었고 업로드 해보자.

업로드하면 서버의 파일들을 볼 수 있고 실행권한이 있는 flag도 있는 걸 볼 수 있다. 실행해보자.

php파일을 이렇게 작성했고 업로드 해서 해당 주소로 이동해보자.

제목에서 힌트를 주긴 해서 난이도가 그렇게 막 엄청 높진 않았다!