내 게시물 중 하나(잊었음)에 대한 누군가의 답글에서 나는 기억했습니다.
bash -c "somecommand \$1" bash $somevariable
바꾸다
bash -c "somecommand $somevariable"
나findutils 매뉴얼에서 이 예를 다시 참조하세요.
find -exec sh -c 'something "$@"' sh {} \;
바꾸다
find -exec sh -c "something {}" \;
두 예제 모두 다른 솔루션보다 첫 번째 솔루션을 사용하는 동일한 이유가 있습니까? 그렇다면 무엇입니까?
고무하다이 예에서 명령 주입이 작동하지 않는 이유는 무엇입니까? 그리고다음은 bash에서 명령 주입의 유일한 형태입니까?
답변1
예. 두 예제 모두 인수를 bash -c
or sh -c
로 전달해야 합니다 .논쟁(인용 가능) 코드에 문자열로 삽입하는 대신.
인라인 셸 스크립트에 문자열로 코드를 삽입하면 삽입된 문자열이 제어 구조를 벗어나 임의 명령을 실행하거나 셸이 텍스트로 처리되어야 하는 확장을 실행할 수 있습니다.
예:
bash -c "echo $arg"
$arg
문자열로 설정합니다 ; ls -la
.
예제 에서는 find
파일 이름이나 경로 이름이 삽입된 셸 스크립트의 구문을 깨뜨리거나 제어 흐름을 수정하여 잠재적으로 원하지 않는 결과를 초래할 때 문제가 됩니다.
추가 참고자료: