영웅 배경, 구분선 없음
가이드라인

명령어 인젝션

지금은 커맨드 인젝션 자체를 살펴보겠습니다.실제로 어떻게 보이는지 더 쉽게 볼 수 있도록 주로 몇 가지 다른 예제에 초점을 맞출 것입니다.간단히 설명하자면, 사용자 입력에서 운영 체제 명령의 일부 (예: 다음 함수) 를 사용할 때 Command Injection 취약성이 발생합니다.

ip = 요청.params.IP 주소라고 가정해 봅시다.

시스템 (“핑”+ ip);

사용자가 IP 주소를 제공하면 `8.8.8.8'을 예로 들 것입니다. 실행되는 명령은 `ping 8.8.8.8`이며, 이는 예상한 것과 정확히 일치합니다.하지만 사용자가 `8.8.8.8 && ls /etc/ `을 제공한다면 이 명령은 그렇지 않을 것입니다. 다만 IP 8.8.8.8을 ping하지만 `/etc/ 폴더에서도 `ls`가 실행됩니다.

완화

명령 삽입 공격의 심각도를 고려할 때 시스템 명령을 사용할 때 먼저 물어봐야 할 몇 가지 중요한 질문이 있습니다.

  • 정말로 그 명령을 호출해야 합니까?최선의 방어 수단은 시스템 명령을 절대 호출하지 않는 것입니다.
  • 시스템 명령을 사용하지 않고도 동일한 효과를 얻을 수 있는 라이브러리/바인딩이 있습니까?
  • 명령 자체 대신 Standard In을 통해 프로세스에 데이터를 전달할 수 있습니까?

이러한 작업이 가능하지 않은 경우 매개변수화가 중요합니다.

예시

다음은 이것이 실제로 어떻게 보이는지 보여주기 위해 다양한 언어로 된 몇 가지 예제입니다.

파라미터화를 사용하지 않으면 커맨드 인젝션에 취약합니다.

문자열 폴더 = “/tmp/ && ifconfig”;
문자열 cmd = “\”ls”+ 폴더 + "\"””;

//안전하지 않음: `ls`와 `ifconfig` 명령을 모두 실행합니다.
시스템. 진단. 프로세스 시작 (“bash”, “-c”+ cmd);

C# - 보안

명령을 매개 변수 목록으로 제공하면 명령이 매개 변수화되고 명령 삽입으로부터 보호됩니다.

문자열 폴더 = “/tmp/ && ifconfig”;
목록 <string>인수 = 새 목록 <string>() {” -c”, “ls”, 폴더};

//보안: ifconfig 명령을 실행하지 않습니다
시스템. 진단. 프로세스 시작 (“bash”, 인수);

자바 - 안전하지 않음

파라미터화를 사용하지 않으면 커맨드 인젝션에 취약합니다.

문자열 폴더 = “/tmp/ && ifconfig”;

//안전하지 않음: `ls`와 `ifconfig` 명령을 모두 실행합니다.
프로세스빌더 b = 새 프로세스빌더 (“bash -c ls”+ 폴더);

프로세스 p = pb.start ();

자바 - 시큐어

명령을 매개 변수 목록으로 제공하면 명령이 매개 변수화되고 명령 삽입으로부터 보호됩니다.

문자열 폴더 = “/tmp/ && ifconfig”;

//보안: ifconfig 명령을 실행하지 않습니다
프로세스 빌더 b = 새 프로세스 빌더 (“bash”, “-c”, “ls”, 폴더);

프로세스 p = pb.start ();

자바스크립트 - 안전하지 않음

파라미터화를 사용하지 않으면 커맨드 인젝션에 취약합니다.

const {exec} = 요구 (“자식_프로세스”);

const 폴더 = “/tmp/ && ifconfig”;

//안전하지 않음: `ls`와 `ifconfig` 명령을 모두 실행합니다.
const ls = exec (“bash -c ls”+ 폴더, (오류, 표준 출력, stderr) => {
console.log (`stdout: $ {stdout} `);
});

자바스크립트 - 보안

const {spawn} = 요구 (“어린이_프로세스”);

const 폴더 = “/tmp/ && ifconfig”;

//보안: ifconfig 명령을 실행하지 않습니다
상수 ls = 스폰 (“배시”, [” -c”, “ls”, 폴더]);

ls.stdout.on (“데이터”, 데이터 => {
console.log (`stdout: $ {data} `);
});

파이썬 - 안전하지 않음

파라미터화를 사용하지 않으면 커맨드 인젝션에 취약합니다.

가져오기 하위 프로세스

폴더 = “/tmp/ && ifconfig”

# 안전하지 않음: `ls`와 `ifconfig` 명령을 모두 실행합니다.
하위 프로세스.run (“bash -c ls”+ 폴더, 셸=참)

파이썬 - 시큐어

명령을 매개 변수 목록으로 제공하면 명령이 매개 변수화되고 명령 삽입으로부터 보호됩니다.

가져오기 하위 프로세스

폴더 = “/tmp/ && ifconfig”

# 보안: ifconfig 명령을 실행하지 않습니다
서브 프로세스.run (["bash”, “-c”, “ls”, 폴더])