프로그래밍 언어에서는 잠재적으로 위험한 함수나 라이브러리의 사용을 최소화하는 기능이나 가이드가 존재하고, 사용자의 입력에 의존하지 않고 입력을 필터링하는 것과 같이 명령어 삽입을 방지하는 방법이 있다.
PHP에서 쉘을 통해 명령을 실행하려면 운영체제와 상호작용해야 하는 많은 함수가 존재한다.
Exec, Passthru, System과 같은 함수이다.

위 스니펫은 애플리케이션이 폼에 입력된 숫자만 받고, 명령어는 처리되지 않도록 짜여져있다.
적절한 입력 필터링이라고 생각할 수 있지만 validation이 없는 함수를 사용하면 명령어 삽입에 매우 취약하다.
입력 정화,, 라고도 할 수 있는 처리방법이다. 사용자가 제출할 수 있는 데이터의 형식이나 유형을 지정하는 과정으로, 예를 들어 >, &, /같은 특수 문자를 제거하는 입력 필드를 만드는 것이다.

위 스니펫은 PHP의 filter_input 함수를 사용해 제출된 데이터가 숫자인지 확인하고 숫자가 아니라면 유효하지 않은 입력으로 간주한다.
애플리케이션은 사용자의 입력에서 데이터를 필터링하고 정화작업을 위해 많은 기술을 사용한다.
그런 필터는 특정 페이로드로 제한하지만 공격자는 로직을 악용해서 우회할 수 있다.
예를 들어 애플리케이션이 ""문자를 제거할 수 있는데, 공격자는 이에 해당되는 hexa값을 통해서 같은 결과를 얻을 수 있다. 예상 형식과 다른 입력 데이터도 실행될 때 여전히 같은 의미로 해석되어 동일한 실행 결과를 불러온다.

페이로드를 테스트해서 명령어 삽입 취약점을 확인해보자.
/home/tryhackme/flag.txt에 플래그가 있다고 한다.
일단 예와 같이 내 IP를 입력해보자

그랬더니 PING 결과를 출력했다. 그렇다면 whoami가 실행되는지 확인해보자.

사용자를 뱉는 것을 보니 ; 연산자는 필터링되지 않는 것으로 보인다.
cat 명령어를 사용하면 바로 파일을 읽을 수 있을 것 같다.

너무나도 쉽게 파일을 읽을 수 있었다.

& 연산자도 필터링하지 않았다.