Command Injection 정리
💡Injection?
악의적인 데이터를 프로그램에 입력하여 이를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행되게 하는 기법, 웹 애플리케이션을 대상으로 하는 인젝션 공격은 SQL Injection, Command Injection등이 있다.
Command injection은 이용자의 입력을 시스템 명령어로 실행하게 하는 취약점
- 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생
- 입력한 임의 IP에 ping을 전송(in pyhton application)
os.system(“ping [user-input]”)
- 임의 파일을 읽기
os.system(“cat [user-input]”)
💡이런 방식으로 함수를 사용할 때 이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행가능‼️
리눅스 셸 프로그램이 지원하는 메타문자를 통해 임의 명령어를 실행하여 셸을 획득할 수 있게 됨
&&, ;, | 등을 사용하면 여러개의 명령어를 연속으로 실행시킬 수 있음.
메타인지만 알고 있었는데 메타문자??
이건 또 뭐람 ㅋ
메타문자 종류
- `` = 명령어 치환, ``안에 들어있는 명령어를 실행한 결과로 치환됨.
- $( ) = 명령어 치환, $( ) 안에 들어있는 명령어를 실행한 결과로 치환됨. 이 문자는 중복 사용가능 (echo $(echo $(echo theori)))
- && = 명령어 연속 실행, 한 줄에 여러 명령어를 사용하고 싶을 때 사용, 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행
- || = 명령어 연속 실행, 한 줄에 여러 명령어를 사용하고 싶을 때 사용, 앞 명령어에서 에러가 발생해야 뒷 명령어를 실행
- ; = 명령어 구분자, 한 줄에 여러 명령어를 사용하고 싶을 때 사용, 단순히 명령어를 구분하기 위해 사용, 에러 유무와 상과없음
- | = 앞 명령어의 결과가 뒷 명령어의 입력으로 들어감
@app.route('/ping')
def ping():
ip = request.args.get('ip')
return os.system(f'ping -c 3 {ip}')
⏩127.0.0.1을 입력하면 의도한대로 프로그램이 작동하는 것을 확인가능, 공격자는 입력값이 명령어의 일부로 실행되는 것을 확인하고, Command Injection을 시도가능

실습을 통해 익히기
https://dreamhack.io/wargame/challenges/44
command-injection-1
특정 Host에 ping 패킷을 보내는 서비스입니다. Command Injection을 통해 플래그를 획득하세요. 플래그는 flag.py에 있습니다. Reference Introduction of Webhacking
dreamhack.io
코드 분석

ping -c 3 {host}의 형태로 들어가는 것 같다.


이렇게 나옴 따라서 플래그는 flag.py에 있으니까 다음과 같이 실행


형식에 맞게 실행시켜야한다고 함. 근데 command injection을 할려면 메타문자를 사용해서 해야한다.
따라서 f12 개발자도구를 열어서 pattern="어쩌구"를 지워준다!


똑같이 실행시켜주면 플래그가 나온다!