
shell_exec()와 system() 함수의 차이제공해주신 두 PHP 웹 셸 코드에서 사용된 shell_exec()와 system() 함수는 모두 운영체제 명령을 실행하는 데 사용되지만, 결과를 처리하고 출력하는 방식에 중요한 차이가 있습니다.
두 함수는 모두 웹 셸에서 원격 코드 실행 (Remote Code Execution, RCE)에 사용될 수 있습니다.
shell_exec() 함수| 특징 | 설명 |
|---|---|
| 출력 방식 | 실행된 명령어의 전체 출력 결과를 문자열로 반환(Return)합니다. |
| 반환값 | 실행 결과 전체를 포함하는 문자열. 명령어 실행에 실패하면 NULL을 반환합니다. |
| 출력 흐름 | 명령어 실행 중 실시간으로 출력하지 않습니다. 명령 실행이 완료된 후에 결과를 한 번에 PHP 스크립트로 가져와 echo 등으로 출력해야 합니다. |
| 코드 예시 | echo shell_exec($_GET['cmd']); |
💡 장점: 결과를 변수에 저장하여 다른 PHP 코드에서 재처리하거나 조작하기에 용이합니다.
system() 함수| 특징 | 설명 |
|---|---|
| 출력 방식 | 실행된 명령어의 결과를 표준 출력 (Standard Output)으로 직접 출력합니다. |
| 반환값 | 명령어 실행 후의 마지막 줄을 반환하며, 일반적으로 외부 명령어의 종료 상태 코드 (Exit Status)를 정수로 반환합니다. (이는 웹 셸에서는 크게 중요하지 않습니다.) |
| 출력 흐름 | 명령어 실행 중 결과를 실시간으로 브라우저 화면에 출력합니다. |
| 코드 예시 | <?php system($_GET["cmd"]); ?> |
💡 장점: 결과를 별도로
echo할 필요 없이 바로 출력되므로 코드가 더 간결하며, 실시간 출력이 필요한 경우에 유용합니다.
| 웹 셸 코드 | 출력 함수 | 추가 echo 필요 여부 | 결과 출력 방식 |
|---|---|---|---|
<?php echo shell_exec($_GET['cmd']); ?> | shell_exec() | 필요 (echo가 함수를 감쌈) | 명령어 실행 후, 전체 결과를 문자열로 받아와서 한 번에 출력. |
<?php system($_GET["cmd"]); ?> | system() | 불필요 | 명령어 실행 중, 결과를 직접 표준 출력으로 브라우저에 출력. |
결론:
침투 테스트 (Penetration Testing) 환경에서 웹 셸을 사용할 때는 두 함수 모두 동일한 명령 실행 결과를 얻을 수 있습니다.
system()은 더 간결하며 (추가 echo가 필요 없음) 결과가 더 빠르게 보일 수 있습니다.shell_exec()는 명시적으로 echo를 사용하여 출력해야 하지만, 결과를 PHP 변수에 저장할 수 있다는 유연성이 있습니다.두 함수 모두 curl http://10.64.144.72/ftp/web.php?cmd=id와 같은 방식으로 사용할 때 id 명령의 결과를 웹 브라우저에 보여주게 됩니다.