명령 주입이 작동하지 않는 이유
$ 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
다음 명령을 실행합니까?
감사해요.
답변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
.;
echo
hello
bash가 두 가지 다른 명령을 실행하려면 변수를 확장하기 전에 세미콜론을 처리해야 합니다.
두 번째 명령은
bash -c "eval ls \$1" bash '.; echo hello'
다음과 같이 처리합니다:
bash
-c
매개변수 ,eval ls $1
, 로bash
실행합니다.; echo hello
. bash는 인수를 읽고-c
명령으로 옵션을 기록합니다eval ls $1
.확장 후에는 , , , ;
eval
인수를 사용하여 실행됩니다.ls
.;
echo
hello
eval
그런 다음 인수가 다시 구문 분석되어ls .
다음이 실행됩니다echo hello
.