dvwa. 커맨드인젝션 공격#2-1(low)
커맨드 인젝션 공격(command injection)이란?
: 말그대로 취약한 운영체제에서 임의의 명령을 실행하는 공격이다.
- 주로 웹 응용 프로그램이 사용자 입력을 받아 서버에서 실행되는 명령어에 대한 검증 없이 직접 실행하는 경우 발생하며 시스템 명령을 실행하거나 시스템의 제어권을 획득할 수 있다.
커맨드 인젝션 공격이 발생 가능한 상황
- 입력에서 필터링이나 검증이 없을 때
- 취약한 명령어 문자열 조립 : 웹 응용 프로그램에서 명령어 문자열을 사용자 입력과 결합하여 실행하는 경우, 입력값을 적절하게 이스케이프하지 않고 그대로 사용할 경우 공격자는 입력에 악의적인 명령어를 포함시켜 실행될 수 있다.
- 에러 메시지 노출 : 웹 응용 프로그램에서 명령어 실행 시 발생하는 에러 메시지를 화면에 노출하는 경우, 공격자는 에러 메시지를 통해 시스템 정보를 얻거나 명령어 실행 결과를 확인할 수 있다.
예시)
ping -c 4 + domain
www.google.com; cat /etc/passwd;//위 입력으로 구글 도메인에 핑을 실행하고 ";"특수문자로 앞 명령어 실행후 뒤 명령어가 실행하게 만든 다음 cat /etc/passwd명령을 사용하여 passwd파일을 확인하여 계정 및 비밀번호를 확인할 수 있다.
커맨드 실행 공격과의 차이
- 커맨드 인젝션 공격은 커맨드 실행 공격의 하위 집합으로 볼 수 있다.
커맨드 인젝션 공격은 사용자 입력을 통해 서버에서 명령어를 실행하는 부분에 취약점이 존재할 때 발생하는 공격이고,
커맨드 실행 공격은 웹 응용 프로그램 외부에서 직접 명령어를 실행하는 경우에 해당한다.
공격 실습)
- 127.0.0.1로 ip 주소를 입력해보면 ping명령어가 실행된다.
- view-source를 보면 ip주소를 받아 핑 명령어를 수행한다.
ping -c(count)는 전송할 요청 패킷의 횟수를 정하는 옵션
shell_exec : php에서 쉘을 통해 명령을 실행하고 전체 출력을 문자열로 반환
윈도우일때, 리눅스일때에 맞춰서 코드가 실행된다.
$target의 값은 위에서 사용자로부터 입력 받은 ip이다. 즉, 이렇게 코드를 만들면 터미널에서 만드는 것과 같다.
;뒤에 리눅스 명령어를 입력하여 명령을 연속해서 입력하면 결과가 나온다.
대응방안
- 입력의 필터링 및 검증 : 사용자 입력에 대해 적절한 필터링과 검증을 수행하여 예상치 않은 문자나 명령어가 포함되지 않도록 한다.
- 입력의 이스케이프기법 : 사용자 입력이 명령어 문자열과 결합될때 문자열 이스케이프 기법을 사용하여 사용자 입력의 특수 문자를 제거한다.
- 원격 명령 실행 제한 : 시스템에서 원격으로 명령을 실행하는 기능을 최소한으로 제한하거나 사용하지 않도록 해야 한다.
- 에러 메시지 관리 : 에러 미시지를 최소화해서 공격자에게 유용한 정보가 노출되지 않도록 해야 한다.
- 요약
sk쉴더스 EQST 2023보안 위협 전망 보고서에 따르면 2022년 공격 이벤트 통계에서 command execution 공격이 18만건으로 가장 많이 집계되었고, command injection이 7만건으로 여전히 위협적이다.
커맨드 인젝션 공격 ⊂ 커맨드 실행 공격
막상 실습으로 공격해보면 뚫기 쉽지 않다.
- 참고
chatGPT
https://owasp.org/www-community/attacks/Command_Injection
https://cybersecuritykong.tistory.com/10