본문 바로가기

카테고리 없음

웹해킹 8주차


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부분을 없앱니다

플래그를 찾아냅니다