Nmap 을 이용한 파일 업로드 취약점 공격

NmapBeginner
지금 연습하기

소개

본 랩은 웹 애플리케이션에서 흔히 발생하는 보안 문제인 파일 업로드 취약점에 초점을 맞춥니다. 이러한 취약점을 식별하고, 잠재적인 영향을 이해하며, 이를 악용하는 방법을 탐구하는 방법을 배우게 됩니다. 이 랩은 실용적인 예제를 통해 실습 경험을 제공하여 웹 애플리케이션 보안 개념과 방어 조치를 더 잘 이해할 수 있도록 합니다.

파일 업로드 취약점 이해

파일 업로드 취약점은 웹 애플리케이션이 업로드된 파일을 제대로 검증하지 못할 때 발생합니다. 이는 공격자가 악성 파일을 업로드하도록 허용하여 잠재적으로 서버에서 원격 코드 실행 (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에서 접근 가능한지 확인합니다.

서버 측 언어를 식별하는 방법:

  1. URL 파일 확장자:

    • .php 확장자는 PHP 를 나타냅니다.
    • .asp 또는 .aspx 확장자는 ASP.NET 을 나타냅니다.
    • .jsp 확장자는 Java Server Pages 를 나타냅니다.
  2. 서버 헤더:

    • 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
  1. /home/labex/project 디렉토리에 테스트 파일 phpinfo.php를 생성합니다.
<?php phpinfo(); ?>
  1. 파일을 업로드합니다.

  2. 업로드를 확인합니다.

  3. 명령 실행 쉘 shell.php를 생성합니다.

<?php echo "Shell"; system($_GET['cmd']); ?>
  1. 쉘을 업로드하고 테스트합니다.

  2. 명령을 실행합니다.

참고: 이 랩은 기본적인 웹 쉘 기능을 보여줍니다. 리버스 쉘 (reverse shell) 및 권한 상승 (privilege escalation) 과 같은 고급 주제는 더 고급 과정에서 다룹니다.

서버 제한 우회 (선택 사항)

일부 웹 애플리케이션은 악성 파일 업로드를 방지하기 위해 파일 확장자 제한을 구현합니다. 이 섹션에서는 이러한 제한을 우회하는 방법을 살펴봅니다.

.php 확장자가 차단된 경우, 실행 가능할 수 있는 대체 PHP 확장자를 시도해 보십시오.

  1. .php3 확장자로 업로드해 봅니다.

  2. 실패하면 .phar 확장자를 시도해 봅니다.

시도해 볼 일반적인 우회 확장자:

  • .php3
  • .php4
  • .php5
  • .phar
  • .phtml

참고: 성공 여부는 서버 구성에 따라 다릅니다. 서버마다 PHP 코드로 실행할 수 있는 확장자가 다를 수 있습니다.

요약

이 랩에서는 파일 업로드 취약성의 필수적인 측면을 다루었습니다.

핵심 개념:

  • 파일 업로드 취약성 메커니즘 이해
  • 서버 측 프로그래밍 언어 식별
  • 웹 쉘 업로드 및 실행
  • 파일 확장자 제한 우회

획득한 기술:

  • 서버 측 언어 감지
  • 웹 쉘 생성 및 배포
  • 업로드된 파일을 통한 명령 실행
  • 확장자 우회 기술

보안 영향:

  • 부적절한 파일 유효성 검사의 영향
  • 적절한 업로드 제한의 중요성
  • 서버 측 실행 위험

이 기본적인 지식은 후속 과정에서 다루는 고급 웹 애플리케이션 보안 주제를 위한 준비를 제공합니다.