소학회/Dreamhack

[Dreamhack]ServerSide: Command Injection

도아돵 2023. 11. 14. 00:46

인젝션(Injection): 악의적인 데이터를 프로그램에 입력하여 이를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행되게 하는 기법

Command Injection:  이용자의 입력을 시스템 명령어로 실행하게 하는 취약점
->명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생

&&, ;, | : 여러 개의 명령어를 연속으로 실행시킬 수 있음

시스템 함수들을 사용할 때 이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수 있다!!

 

Figure 1. 메타 문자
`` 명령어 치환
``안에 들어있는 명령어를 실행한 결과로 치환됩니다.
 
$() 명령어 치환
$()안에 들어있는 명령어를 실행한 결과로 치환됩니다. 이 문자는 위와 다르게 중복 사용이 가능합니다. (echo $(echo $(echo theori)))
 
&& 명령어 연속 실행
한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행합니다. (Logical And)
 
|| 명령어 연속 실행
한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. 앞 명령어에서 에러가 발생해야 뒷 명령어를 실행합니다. (Logical Or)
 
; 명령어 구분자
한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. ;은 단순히 명령어를 구분하기 위해 사용하며, 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행합니다.
 
| 파이프
앞 명령어의 결과가 뒷 명령어의 입력으로 들어갑니다.
 

 

 


Command Injection 간단 실습

-id 명령어를 실행하기 위해서는 앞서 알아본 메타 문자를 사용해야함

 

아래와같이 사용가능!!

$ ping -c 3 1.1.1.1; id
$ ping -c 3 1.1.1.1 && id
$ ping -c 3 1.1.1.1 | id

 

 

-> ip는 아무거나 입력해도 상관없어 보이고 ..  메타문자와 id를 입력하면 된다!!

 


 

->이번 시간은 이용자의 입력을 적절한 검사 없이 명령어로 사용할 때 발생하는 Command Injection에 대해 배웠다

취약점 막기위해서, 개발자는 입력 값에 대해 메타 문자의 유무를 철저히 검사하거나 시스템 메타 문자를 해석 하지 않고 그대로 사용하는 함수를 사용해야 한다.

*커맨드 인젝션(Command Injection): 인젝션의 종류 중 하나. 시스템 명령어에 대한 인젝션을 의미함. 취약점이 발생하는 원인은 단순하지만, 매우 치명적인 공격으로 이어질 수 있음. 개발자는 이용자의 입력을 반드시 검사해야 하며, 되도록 system 함수의 사용을 자제해야 함.

*메타 문자(Meta Character): 특수한 의미를 가진 문자. 예를 들어, 셸 프로그램에서 ;를 사용하면 여러 개의 명령어를 순서대로 실행시킬 수 있음.


 

Q2. 다음은 Command Injeciton이 발생하는 코드이다. 어떠한 입력값을 넣어야 "/flag" 파일을 읽을 수 있을까?
@app.route('/ping')
def ping():
ip = request.args.get('ip')
return os.system(f'ping -c 3 "{ip}"')

-> "; cat /fl*; "