인젝션(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*; "
'소학회 > Dreamhack' 카테고리의 다른 글
| [Dreamhack_워게임] image-storage 문제풀이 (2) | 2023.11.18 |
|---|---|
| [Dreamhack] ServerSide: File Vulnerability (0) | 2023.11.14 |
| [Dreamhack_워게임] simple_sqli 문제풀이 (0) | 2023.11.10 |
| [Dreamhack_워게임] Carve Party 문제풀이 (0) | 2023.11.10 |
| [Dreamhack]NoSQL Injection (0) | 2023.11.08 |