PHP 코드 및 명령 실행
1. 코드 실행
PHP 코드 실행은 PHP가 제공하는 함수를 통해 직접 또는 간접적으로 PHP 코드를 실행하는 것을 의미합니다. 코드 실행을 유발할 수 있는 주요 함수로는 eval(), assert(), preg_replace(), create_function() 등이 있습니다.
직접 코드 실행 함수
eval() 함수
eval() 함수는 전달된 문자열을 PHP 코드로 실행합니다.
<?php
// 전달된 문자열을 PHP 코드로 실행
$input = $_GET['code'];
eval($input);
// 예시: http://example.com/test.php?code=phpinfo();
?>
assert() 함수
assert() 함수는 주로 디버깅에 사용되지만 코드 실행에도 활용될 수 있습니다.
<?php
// 전달된 문자열을 PHP 코드로 실행
$command = $_GET['cmd'];
assert($command);
// 예시: http://example.com/test.php?cmd=system('calc');
?>
간접 코드 실행 함수
preg_replace() 함수
preg_replace() 함수는 정규 표현식 검색 및 교체를 수행합니다. /e 수정자를 사용하면 교체 결과를 다시 eval()로 실행합니다. (PHP 5.6까지 유효, PHP 7에서 수정됨)
<?php
// 정규 표현식 패턴
$pattern = "/test/e";
$replacement = "system('calc');";
$subject = "Hello test!";
$result = preg_replace($pattern, $replacement, $subject);
?>
create_function() 함수
create_function() 함수는 코드 문자열을 통해 동적 함수를 생성합니다. PHP 7.2.0부터 폐기되었습니다.
<?php
// 동적 함수 생성 (PHP 7.2 이전 버전에서 동작)
$func = create_function('', 'system("ls -la");');
$func(); // 생성된 함수 호출
?>
2. 명령 실행
명령 실행은 PHP 함수를 통해 시스템 명령을 직접 또는 간접적으로 실행하는 것을 의미합니다. 시스템 명령은 운영체제 터미널(Windows의 cmd, Linux의 bash 등)에서 실행할 수 있는 명령을 말합니다.
system() 함수
system() 함수는 외부 프로그램을 실행하고 그 출력을 표시합니다.
<?php
// 외부 명령 실행 및 출력 표시
system($_GET['cmd']);
// 예시: http://example.com/test.php?cmd=whoami
?>
exec() 및 passthru() 함수
exec() 함수는 외부 프로그램을 실행하고 마지막 줄 결과를 반환합니다. passthru() 함수는 모든 실행 결과를 반환합니다.
<?php
// exec() - 마지막 줄 결과 반환
echo exec($_GET['cmd']);
// 예시: http://example.com/test.php?cmd=ipconfig
// passthru() - 모든 결과 반환
echo passthru($_GET['cmd']);
// 예시: http://example.com/test.php?cmd=whoami
?>
popen() 및 proc_open() 함수
popen()과 proc_open() 모두 명령 실행 함수입니다. proc_open()은 popen()보다 프로그램 실행을 더 강력하게 제어할 수 있습니다.
<?php
// popen() - 프로세스 파일을 지정된 모드로 열고 파일 포인터 반환
$handle = popen('whoami', 'r');
echo fread($handle, 4096);
pclose($handle);
// proc_open() - 더 강력한 제어 기능 제공
$descriptors = array(
0 => array("pipe", "r"), // 표준 입력
1 => array("pipe", "w"), // 표준 출력
);
$process = proc_open('whoami', $descriptors, $pipes);
echo fread($pipes[1], 4096);
proc_close($process);
?>
shell_exec() 및 역따옴표(`)
shell_exec() 함수는 명령을 실행하고 출력 결과를 반환합니다. 역따옴표(`)는 shell_exec()와 동일한 효과를 가집니다.
<?php
// shell_exec() 사용
echo shell_exec($_GET['cmd']);
// 예시: http://example.com/test.php?cmd=whoami
// 역따옴표 사용
$command = $_GET['cmd'];
echo `$command`;
// 위와 동일한 효과
?>
이러한 코드 및 명령 실행 함수들은 전달된 파라미터가 사용자 입력에 의해 조작될 경우 원격 코드 실행(RCE) 취약점을 유발할 수 있습니다.