Command Injection [6]

DATE : 2023/10/06

OS Command Injection - Prevent

Command injection[1] ~ [5]에 걸쳐 Command Injection에 대해서 알아보았다.

이번 POST에서는 지금까지의 POST와 반대로 Command Injection attack을 어떻게 예방할 수 있을 지에

대해서 다루어볼 것이다.


Command injection 공격이 이루어진 과정을 다시 떠올려보면

사용자로부터 어떤 정보를 입력 받는 interface를 활용하였다. (ex. check inventory, submit feedback)

서버에서 interface로 입력 받은 값을 어떻게 사용하는 지 파악해서 (ex. mail command)

명령어를 어떤 형태로 주입할지 판단했다. (ex. 4개 parameter 중 email or message에 주입)

이 과정에서 사용된 중요한 요소는 바로, separator

이전 글에서도 언급한 바 있지만 [ | , ||, &, && ] 이 문자들이 separator로 사용할 수 있는 문자로

separator는 앞 뒤에 위치한 명령어를 독립적으로 수행할 수 있도록 구분해주는 역할이라 정의했다.

추가적으로 [ ; ] 같은 경우는 Unix 기반의 운영체제에서만 사용할 수 있으며

명령어 안의 명령어를 주입하기 위해서는 inline execution을 실행할 수 있는 [ `` or $() ]

사용해야 한다.


이렇게 정리해봤을 때, Command injection을 예방하기 위한 필수 요소는

"사용자로부터 입력된 값을 검증하는 과정"이다.

대부분 서버에서 실행하고자 하는 명령어가 아닌 새로운 명령어를 주입하는 형태이기 때문에

이들을 구분할 목적으로 separator를 사용한다.

사용자로부터의 input에 포함되면 안되는 요소를 확인하거나,

걸려내는 과정을 실행한다면 이런 separator를 어느 정도 차단할 수 있다.

이때포함되면 안되는 요소를 blacklist로 구현하기 보다는

포함해도 되는 요소를 whitelist로 구현하는 것이 더 좋다고 한다.

그 밖에도 input이 모두 유효한 문자로만 구성이 되어있는 지, (ex. 알파벳 and 숫자 )

공백을 포함하는 지 등의 검증 과정이 추가적으로 실행된다면

Command injection을 예방할 수 있는 확률이 조금이나마 올라가지 않을까 싶다.

이렇게 Command injection과 관련된 내용은 마무리! 😎👍

Last updated