Command Injection
인젝션(Injection)은 악의적인 데이터를 프로그램에 입력하여 이를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행되게 하는 기법을 말합니다. Command Injection은 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생합니다.
`` - 명령어 치환은 ``안에 들어있는 명령어를 실행한 결과로 치환됩니다.
$ echo `echo theori`
theori
$() - 명령어 치환은 $()안에 들어있는 명령어를 실행한 결과로 치환됩니다. 이 문자는 위와 다르게 중복 사용이 가능합니다.
$ echo $(echo theori)
theori
&& - 명령어 연속 실행은 한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행합니다. and의 원리와 같습니다.
$ echo hello && echo theori
hello
theori
|| - 명령어 연속 실행은 한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. 앞 명령어에서 에러가 발생해야 뒷 명령어를 실행합니다. or의 원리와 비슷합니다.
$ cat / || echo theori
cat: /: Is a directory
theori
; - 명령어 구분자는 한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. ;은 단순히 명령어를 구분하기 위해 사용하며, 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행합니다.
$ echo hello ; echo theori
hello
theori
| - 파이프는 앞 명령어의 결과가 뒷 명령어의 입력으로 들어갑니다.
$ echo id | /bin/sh
uid=1001(theori) gid=1001(theori) groups=1001(theori)
실습
A. "; cat /fl*; "
Q2. 메타 문자와 그에 대한 설명이 올바르게 짝지어진 것을 모두 고르세요.
A. ;: 명령어 구분자, ``: 명령어 치환
Q3. 커맨드 인젝션(Command Injection)의 설명으로 올바른 것은?
A. 인젝션의 종류 중 하나. 시스템 명령어에 대한 인젝션을 의미함. 취약점이 발생하는 원인은 단순하지만, 매우 치명적인 공격으로 이어질 수 있음. 개발자는 이용자의 입력을 반드시 검사해야 하며, 되도록 system 함수의 사용을 자제해야 함.
엔드포인트: /ping
@APP.route('/ping', methods=['GET', 'POST'])
def ping():
if request.method == 'POST':
host = request.form.get('host')
cmd = f'ping -c 3 "{host}"'
try:
output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
return render_template('ping_result.html', data=output.decode('utf-8'))
except subprocess.TimeoutExpired:
return render_template('ping_result.html', data='Timeout !')
except subprocess.CalledProcessError:
return render_template('ping_result.html', data=f'an error occurred while executing the command. -> {cmd}')
return render_template('ping.html')
취약점 분석
cmd 변수는 사용자로부터 입력받은 host 값을 포함하고 있습니다. 하지만 사용자의 입력을 그대로 명령어로 실행하기 때문에, 사용자가 악의적인 공격 코드를 주입할 수 있습니다. 이를 Command Injection 공격이라고 부릅니다.
pattern부분을 없앱니다
플래그를 찾아냅니다