서버 생성 / 문제 파일 다운로드
페이지를 살펴보면 지난 시간에 푼 image-storage 와 동일하게 파일을 업로드할 수 있는 화면이 등장하게 됩니다
지난 시간에 제작한 test.php을 업로드해 봤는데 이번에는 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";
}
?>
다운로드한 소스 코드에서 upload.php 코드 내부를 살펴보면 $deniedExts 변수에 php, php3, php4, php5, pht, phtml 확장자를 넣어두고 업로드된 파일의 확장자와 일치하면 업로드가 불가능하게 짜여 있습니다
그래서 php 파일 확장자를 inc 파일로 우회하여 업로드해 보겠습니다
inc 파일로 교체했을 때는 업로드는 가능하지만 내부에서 문자열로 출력되기 때문에 코드 실행이 불가능했습니다
따로 널(%00)문자를 이용하여 php 확장자를 우회하면 페이지 접근이 불가능해서 WebShell을 실행하지 못했습니다
다른 방법을 생각하는 도중 문제 제목이 Apache htaccess 이여서 htaccess관한 내용을 찾아봤습니다
.htaccess이란?
Hypertext access의 약자로 파일명 앞의 .을 숨긴 파일을 의미하고, htaccess을 사용하면 디렉터리에 대한 설정 옵션을 변경할 수 있습니다
즉 아파치 같은 웹 서버에서 웹 브라우저에 접근할 때 어떤 식으로 서비스를 제공할지 apace2.conf와 sites-enabled 가상 호스트 설정 파일을 통해 결정된다고 합니다
이를 통해 .htaccess 파일 내부에 우리가 사용할 특정 확장자를 php로 실행시키게 설정할 수 있습니다
.musa라는 특정 확장자를 php로 실행시킬 수 있게 .htaccess 파일을 작성해 줍니다
이후 해당 파일을 업로드하고 .musa라는 확장자 파일을 다시 업로드해 주면 .htaccess로 인해 .musa 파일이 php로 실행되게 됩니다(test.musa 파일은 image-storage 때 사용한 test.php 내용과 동일합니다)
그다음 test.musa 파일을 업로드하여 제대로 작동하는지 확인하기 위해 파라미터를 입력해 봅시다
'ls /' 명령어를 입력하여 루트 경로에 있는 디렉터리를 살펴보니 flag 파일이 있습니다
하지만 'cat /flag' 명령어를 작동시켜도 아무런 반응이 없어 루트(/) 디렉터리로 이동 후 flag 파일을 실행시켜야 됩니다
cd / 명령어와 flag 파일을 실행시키기 위해 2개의 명령어를 사용해야 하는데 WebShell에서 2개 이상의 연속 명령어를 사용하기 위해서는 [command1];[commad2] 방식으로 루트 디렉터리 이동 후 현재 경로에 있는 flag 파일을 실행시킬 수 있습니다
[ 선수 학습 내용 ]
[ 참고 자료 ]