셸을 다뤄본 사람이라면 변수를 입력할 수 있다는 것을 알거임. 그러나 셸 변수를 참조해서 명령어를 실행할 수 있다는 사실은 잘 모를거임. 예를 들면,

$ a='Hello, world!'

$ echo $a

같은 방식으로 사용하는게 일반적이지만.

$ a='echo Hello, world!'

$ $a

위처럼 셸 변수에 명령어 이름이 들어가면 명령어 입력 없이 셸 변수를 참조하는 것 만으로도 실행이 가능함.


윈도우에서도 비슷한 특징이 있는데.

> set a=cls

> %a%

같은 방식으로 실행 가능한데


> set a=echo

> set b=Hello

> %a% %b%

로는 실행이 불가능하고 바로 스크립트가 종료됨.


문제는 리눅스에서 사용하는 셸은 이게 가능하다는 건데 위의 문법을 Bash 스타일로만 바꿔도 정상 실행됨.

$ a=echo

$ b='so mvidia, fsck you!'

$ $a $b


그러면 echo $INPUT; 같은 형식으로 실행되는 명령어가(INPUT은 임의의 사용자 입력) ; <다른 조금 위험한 명령어, 예를 들면 rm -rf *;라던가> 와 같은 꼴로 입력되면 어떤 일이 일어날지 예측해볼려고 했는데...

$ INPUT='; echo go fsck yourself!'

$ echo $INPUT

세미콜론(셸에서 한 줄에 여러 명령어를 실행시킬때 사용함.)을 명령어의 끝으로 인식하지 못하고 뒤따라오는 문자열들을 명령어 실행이 아닌 일반 문자열로 인식해버렸다.


혹시 Ctrl+V로 개행 문자를 직접 입력한다면 개행이 명령어의 끝으로 인식되니까 가능하지 않을까?

는 불가능한게 애초에 세미콜론은 셸에서 처리되는 개념이라 셸이 따옴표로 감싼 시점에서 셸은 세미콜론을 일반적인 문자열의 일부로 인식하기 때문에 그냥 echo 명령어의 인자로 해석되어버림... 그래서 이걸로 임의 코드 실행같은 취약점이 나오기는 어려울 듯 하다...


다만 글을 다 쓰고 나니 문뜩 드는 생각은 셸 스크립트는 본연의 기능에 충실해야 한다는 결론에 이른 것 같다. (대체 왜 이러시는 겁니까?)