설명
사용자 입력이 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같은 값이 실행 파일의 옵션으로 해석될 수 있으므로 허용 목록 검증도 함께 적용해야 합니다.