shell_exec()`와 `system()

agnusdei·2025년 11월 23일

CTF

목록 보기
169/185
post-thumbnail

🧐 shell_exec()system() 함수의 차이

제공해주신 두 PHP 웹 셸 코드에서 사용된 shell_exec()system() 함수는 모두 운영체제 명령을 실행하는 데 사용되지만, 결과를 처리하고 출력하는 방식에 중요한 차이가 있습니다.

두 함수는 모두 웹 셸에서 원격 코드 실행 (Remote Code Execution, RCE)에 사용될 수 있습니다.


1. shell_exec() 함수

특징설명
출력 방식실행된 명령어의 전체 출력 결과문자열반환(Return)합니다.
반환값실행 결과 전체를 포함하는 문자열. 명령어 실행에 실패하면 NULL을 반환합니다.
출력 흐름명령어 실행 중 실시간으로 출력하지 않습니다. 명령 실행이 완료된 후에 결과를 한 번에 PHP 스크립트로 가져와 echo 등으로 출력해야 합니다.
코드 예시echo shell_exec($_GET['cmd']);

💡 장점: 결과를 변수에 저장하여 다른 PHP 코드에서 재처리하거나 조작하기에 용이합니다.

2. 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 명령의 결과를 웹 브라우저에 보여주게 됩니다.

profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글