명령어 주입

명령어 주입

설명

사용자 입력이 shell_exec, exec, system, passthru, proc_open 같은 OS 명령 실행 API로 전달되면 명령어 주입이 발생할 수 있습니다.

잠재적 영향

임의 명령 실행, 파일 유출, 권한 상승, 서비스 장악으로 이어질 수 있습니다.

해결 방법

가능하면 셸 호출을 제거하고, 불가피한 경우 허용 목록 검증과 escapeshellarg를 함께 적용합니다.

예시

변경 전

php
<?php
$target = $_REQUEST['ip'];
shell_exec('ping -c 4 ' . $target);

변경 후

php
<?php
$target = $_REQUEST['ip'] ?? '';
if (filter_var($target, FILTER_VALIDATE_IP) === false) {
    http_response_code(400);
    exit;
}

shell_exec('ping -c 4 -- ' . escapeshellarg($target));

설명:

  • 변경 전: 사용자가 제어하는 값이 shell_exec의 명령 문자열에 직접 연결되어 ;, &&, 백틱 같은 셸 메타문자가 추가 명령으로 해석될 수 있습니다.
  • 변경 후: 입력을 IP 주소 형식으로 제한하고, --로 옵션의 끝을 표시한 뒤 개별 인자를 escapeshellarg로 감쌉니다. escapeshellarg만 사용하면 셸 메타문자는 차단되지만 -f 같은 값이 실행 파일의 옵션으로 해석될 수 있으므로 허용 목록 검증도 함께 적용해야 합니다.

참조