| 커맨드 인젝션 공격
- 이 공격을 통해 호스트 내부의 명령어 실행이 가능해짐
커맨드 인젝션 공격 개요
- Command Injection은 명령어를 삽입한다는 뜻
- 웹 요청 메시지에 임의의 시스템 명령어를 삽입하고 전송하여 웹 서버에서 해당 명령어 실행하도록 함
- ;(세미콜론)을 입력해 다른 시스템 명령어를 추가함 (;는 리눅스에서 복수 명령어 실행 시 사용하는 문자)
ㄴ ping 127.0.0.1; cat etc/passwd 사용시 ping명령어와 cat명령어 동시 실행
커맨드 인젝션 공격 실습
- 아래의 실습 화면은 low level의 실습페이지로 IP입력시 해당 주소로 ping 명령어를 실행한 내용을 보여줌
ㄴ 소스코드를 보면 다음과 같음(shell_exec() 함수를 호출하며, 사용자가 입력한 IP를 target으로 받아와 -c 옵션으로 네 번 ping을 보냄
ㄴ 아래와 같이 ;를 사용해 여러 개의 명령어 사용
ㄴ ping -c 2 127.0.0.1; ls
- 앞의 명령이 실패해도 뒤의 명령어는 실행됨 (cat /etc/passwd같은 중요 파일을 열 수 있음)
ㄴ 윈도우 경우 &&을 사용해 여러 명령어를 실행
- ;id를 사용해 현재 명령어가 실행되는 사용자도 알 수 있음
ㄴ DVWA가 www-data 사용자 권한으로 실행되고 있음
ㄴ 그러나 이 사용자 권한으로는 관리자 권한이 필요한 명령은 사용이 불가
ㄴ 추가 루트 권한을 획득하고자 권한 상승 공격을 시도함
커맨드 인젝션 공격 대응
- 시스템 명령어를 호출하지 않음
- 소스코드에서 스exec()나 system()같은 직접적으로 명령어를 실행하지 않고 프로그래밍 언어 및 라이브러리 제공 함수 사용
ㄴ 예시로 디렉터리 생성할 경우 system("mkdir $dir_name")이 아닌 mkdir($dir_name)과 같이 구현
- 입력값 검증, 가급적 화이트리스트 방식을 권장
+Medium Level 실습
- 소스코드를 보면 여러 명령어를 실행 시키도록 하는 &&과 ;를 무력화 시키는 코드가 있음
- 하지만 두 가지 이상의 명령어를 연결하는 방법은 더 있음 (|과 &을 사용하여 명령어를 입력하면 결과가 뜸)
+High Level 실습
- 위와 마찬가지로 |은 실행이 되었다.
- 소스코드를 확인해보니 | (| + 스페이스)은 막혀있으나 일반 |은 막혀있지 않아서 실행이 가능한 것이었다.