김승현
[Dreamhack : Web] Apache htaccess 본문
문제
파일 취약점을 이용해서 서버의 권한을 획득하는 문제이다.
풀이
접속하면 이렇게 파일을 선택할 수 있게 되어있다. 아무 파일이나 업로드 해보자.
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파일을 이렇게 작성했고 업로드 해서 해당 주소로 이동해보자.
짠
제목에서 힌트를 주긴 해서 난이도가 그렇게 막 엄청 높진 않았다!
'Web > Dreamhack : Web' 카테고리의 다른 글
[Dreamhack : Web] XSS Filtering Bypass Advanced (0) | 2023.03.01 |
---|---|
[Dreamhack : Web] XSS Filtering Bypass (0) | 2023.03.01 |
[Dreamhack : Web] File Vulnerability Advanced for linux (0) | 2023.02.26 |
[dreamhack : Web] Command Injection Advanced (0) | 2023.02.26 |
[Dreamhack : Web] phpMyRedis (0) | 2023.02.26 |