이 예에서 명령 주입이 작동하지 않는 이유는 무엇입니까?

이 예에서 명령 주입이 작동하지 않는 이유는 무엇입니까?

명령 주입이 작동하지 않는 이유

$ bash -c "ls \$1" bash '.; echo hello'
ls: cannot access '.;': No such file or directory
ls: cannot access 'echo': No such file or directory
ls: cannot access 'hello': No such file or directory

하지만

$ bash -c "eval ls \$1" bash '.; echo hello'

일하다?

첫 번째 명령에서는 먼저 bash매개변수 확장을 수행하고 $1확장 결과를 분할한 $1다음 명령을 실행합니까?

감사해요.

에서"bash -c"로 실행되는 명령에 인수를 제공하는 방법

관련된이 코드 삽입이 작동하지 않는 이유는 무엇입니까?

답변1

이는 에서와 동일한 과정입니다."인수를 명령으로 해석하는 명령에 신뢰할 수 없는 데이터를 전달하는 명령을 실행하십시오.".

첫 번째 명령,

bash -c "ls \$1" bash '.; echo hello'

다음과 같이 처리합니다:

  • bash-c매개변수 , ls $1, 로 bash실행합니다 .; echo hello. bash는 인수를 읽고, -c명령을 사용하여 옵션을 기록하고 ls $1, 추가 인수 bash.; echo hello;

  • bash가 확장되면 인수를 ls $1사용하여 확장되고 실행 됩니다 .ls.;echohello

bash가 두 가지 다른 명령을 실행하려면 변수를 확장하기 전에 세미콜론을 처리해야 합니다.

두 번째 명령은

bash -c "eval ls \$1" bash '.; echo hello'

다음과 같이 처리합니다:

  • bash-c매개변수 , eval ls $1, 로 bash실행합니다 .; echo hello. bash는 인수를 읽고 -c명령으로 옵션을 기록합니다 eval ls $1.

  • 확장 후에는 , , , ; eval인수를 사용하여 실행됩니다.ls.;echohello

  • eval그런 다음 인수가 다시 구문 분석되어 ls .다음이 실행됩니다 echo hello.

관련 정보