env USER=..some code... ./script.sh
스크립트 자체가 사용 echo $USER
하거나 설정을 통해 일부 실행 가능한 셸 코드를 전달할 수 있다는 점을 고려하면tmpdir=/var/tmp/log-$USER
답변1
환경 변수의 셸 코드를 문제 없이 스크립트에 전달할 수 있지만 스크립트는 변수의 셸 코드를 예상하고 다음과 같이 평가해야 합니다.
예를 들어
$ env USER='$(echo hello)' bash -c 'echo "$USER"'
$(echo hello)
그리고
$ env USER='$(echo hello)' bash -c 'eval "echo \"$USER\""'
hello
위의 두 명령 모두에서 코드 조각이 $USER
스크립트에 전달됩니다 bash -c
. 코드는 평가된 경우 문자열을 출력하는 간단한 명령 대체 hello
이며 쉘을 호출하면아니요명령 대체는 작은따옴표 안의 문자열이므로 평가됩니다. 첫 번째 bash -c
스크립트는 문자열을 평가하지 않으므로 쉘 코드를 인쇄합니다. 두 번째 bash -c
스크립트는 전달된 문자열을 호출의 일부로 평가하여 echo
인쇄합니다 echo
(기본적으로 echo "$(echo hello)"
.
이 문제에 대한 해결책은 사용자가 임의의 셸 코드를 스크립트에 전달할 수 있기 때문에 취약하고 위험합니다.의존하다코드를 패스하고 무조건 실행하세요.) 이는 전형적인 코드 주입 취약점입니다.
내 생각엔 네가 하고 싶은 일은 합격인 것 같아끈, 쉘 코드가 아님:
$ env USER="$(echo hello)" bash -c 'echo "$USER"'
hello
여기서 변수는 스크립트를 호출하기 전에 문자열로 설정됩니다 USER
(셸이 큰따옴표 내에서 명령 대체를 확장하기 때문입니다). 그런 다음 스크립트는 해당 문자열을 가져와서 에코합니다. 귀하의 경우 스크립트는 해당 문자열을 가져와 경로 이름의 일부로 사용합니다.hello
bash -c
중요한 점은 스크립트가 문자열을 가져오기 전에 사용자가 문자열을 계산한다는 것입니다.