'll Hacker

Command Injection 정리 본문

Hacking/WebHacking

Command Injection 정리

씨이오가 되자 2024. 2. 1. 20:05
Contents
728x90

💡Injection?

악의적인 데이터를 프로그램에 입력하여 이를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행되게 하는 기법, 웹 애플리케이션을 대상으로 하는 인젝션 공격은 SQL Injection, Command Injection등이 있다.
 
Command injection은 이용자의 입력을 시스템 명령어로 실행하게 하는 취약점

  • 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생

- 입력한 임의 IP에 ping을 전송(in pyhton application)

os.system(“ping [user-input]”)

 
- 임의 파일을 읽기

os.system(“cat [user-input]”)

 
💡이런 방식으로 함수를 사용할 때 이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행가능‼️ 
리눅스 셸 프로그램이 지원하는 메타문자를 통해 임의 명령어를 실행하여 셸을 획득할 수 있게 됨
&&, ;, | 등을 사용하면 여러개의 명령어를 연속으로 실행시킬 수 있음.


메타인지만 알고 있었는데 메타문자??
이건 또 뭐람 ㅋ
메타문자 종류

  1. ``         = 명령어 치환, ``안에 들어있는 명령어를 실행한 결과로 치환됨.
  2. $( )      = 명령어 치환, $( ) 안에 들어있는 명령어를 실행한 결과로 치환됨. 이 문자는 중복 사용가능 (echo $(echo $(echo theori)))
  3. &&       = 명령어 연속 실행, 한 줄에 여러 명령어를 사용하고 싶을 때 사용, 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행
  4. ||          = 명령어 연속 실행, 한 줄에 여러 명령어를 사용하고 싶을 때 사용, 앞 명령어에서 에러가 발생해야 뒷 명령어를 실행
  5. ;           = 명령어 구분자, 한 줄에 여러 명령어를 사용하고 싶을 때 사용, 단순히 명령어를 구분하기 위해 사용, 에러 유무와 상과없음
  6. |           = 앞 명령어의 결과가 뒷 명령어의 입력으로 들어감

@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="어쩌구"를 지워준다!

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

728x90