셸을 다뤄본 사람이라면 변수를 입력할 수 있다는 것을 알거임. 그러나 셸 변수를 참조해서 명령어를 실행할 수 있다는 사실은 잘 모를거임. 예를 들면,
$ 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 명령어의 인자로 해석되어버림... 그래서 이걸로 임의 코드 실행같은 취약점이 나오기는 어려울 듯 하다...
다만 글을 다 쓰고 나니 문뜩 드는 생각은 셸 스크립트는 본연의 기능에 충실해야 한다는 결론에 이른 것 같다. (대체 왜 이러시는 겁니까?)
쉘 뉴비 커엽노
아직 모르는게 많고 산더미이지만 열심히 노력해서 거장이 되겠읍니다
"그러나 셸 변수를 참조해서 명령어를 실행할 수 있다는 사실은 잘 모를거임" 너만 몰랐음 ㅇㅇ
난 아주 옛날에 배치 스크립트로 게임 만들던 시절부터 사용했는데 셸 스크립트처럼 명령어 인자를 넣을 순 없어서 그냥 그런게 있다 정도로만 알았어. 그때가 C 프로그래밍도 제대로 접하기 이전이라 5~6년은 다 되어 가는거 같은데 유용하게 쓰일수는 있지만 사실 이게 보안상 그렇게 우수한 점은 아니기에 문제 있다는 요지에서 작성한 글이야. (배시는 이미 셸 쇼크라는 취약점이 발견되었기도 하고 마찬가지로 셸 변수를 이용한 취약점임.)