OS Command Injection(OS 명령 인젝션) 또는 Sheel Injection은 웹 애플리케이션이 구동중인 서버의 운영체제상에서 임의의 명령을 실행하도록 하는 웹 취약점입니다. 웹 어플리케이션은 HTML Form, HTTP Header, Coodie, Get parameter 등에서 사용자로부부터 데이터를 입력받아 시스템 셸(Shell)에 제공할 수 있습니다. Command Injection 공격은 주로 응용 프로그램에 의해 실행되며, 불충분한 입력 검증으로 가능합니다.
Command Injection의 예
<?PHP>
@address = $_GET["address"];
$output = shell_exec("ping -n 3 $address");
echo "<pre>$output</pre>"
?>
invicti formerly Netsparker
작동 방법
1단계
- 악의적인 운영 체제 명령을 실행할 수 있는 애플리케이션 취약점 찾기
2단계
- 응용 프로그램이 호스트 운영 체제에서 원하는 작업을 실행하도록 명령을 설계
- 일반적으로 HTML 코드, 쿠키 등의 입력 매커니즘을 사용해 애플리케이션에 삽입
3단계
- 브라우저는 명령을 해석하고 호스트의 운영체제 명령으로 변환
- 위협 행위자는 호스트 시스템과 감염된 시스템의 네트워크에서 특정 명령 실행 가능
OS Injection의 유형
직접 명령 인젝션(Direct Command Injection)
- 사용자가 입력한 데이터가 OS 명령의 인자로 직접 포함되는 경우
간접 명령 인젝션(Indirect Command Injection)
- 파일이나 환경변수를 통해 웹 애플리케이션의 시스템 셸로 OS 명령이 전달되는 경우
- 보통 윈도우 시스템에서 나타남
- Forfiles, pcalue.exe 등 CMD를 사용하지 않고 명령을 호출할 수 있도록 지원하는 유틸리티 사용 가능
블라인드 명령 인젝션 (Blind Command Injection)
- 사용자의 입력 데이터가 OS 명령에 포함돼 시스템 셸로 전달되는 것은 겉으나 HTTP 응답 메시지에 명령의 실행 결과가 표시되지 않는 경우
Blind OS Commend injection을 위한 기술들
시간 지연
- SLEEP(리눅스/유닉스만 해당) 명령 또는 루프백(Loopback) PING 사용 가능
- SLEEP 명령이나 PING 명령을 통해 웹 애플리케이션의 응답 시간을 의도적으로 지연
- 속도 저하에는 다양한 원인이 있을 수 있으므로 반복적으로 확인해야 함
- HTTP 응답이 의도한 만큼 일정하고 반복적으로 지연된다면 명령 인젝션 공격에 취약한 것임
출력 리다이렉팅
- 실행 결과를 웹루트 또는 그 하위의 경로에 파일로 생성(리다이렉팅)하고 해당 파일의 URL을 통해 파일을 조회해 주입된 임의의 명령이 실행됐는지 판단하는 기술
- 해당 디렉토리에 대한 읽기와 쓰기 권한이 있어야 함
대역 외(Out Of Band) 채널
- 대역 외(Out Of Band) 채널을 이용한 기술
- 취약한 서버를 공격자 또는 테스터가 제어할 수 있는 외부의 서버와 통신을 하도록 유도하고 통신 기록을 확인함으로써 주입된 임의의 명령이 실행됐는지 확인할 수 있는 기술
- nslookup 또는 curl 명령을 이용할 수 있음
Command Injection의 공격 위치
응용 프로그램에서 일반적으로 Command Injection에 잠재적으로 노출시킬 수 있는 취약점
임의 명령 주입(Arbitrary Command Injection)
- 최종 사용자로부터 직접 임의의 시스템 명령 수신 가능
- 애플리케이션이 명령을 수신하면 호스트에서 명령 실행
- 명령 삽입을 허용하는 일반적인 취약점
임의 파일 업로드(Arbitrary File Uploads)
- 애플리케이션은 최종 사용자가 임의의 파일 확장자를 포함하는 파일을 업로드하도록 허용할 수 있음
- 이 취약점으로 업로드 된 파일이 웹루트에 추가되면 명령 주입 가능
서버측 템플릿 주입(Server-side Template Injection)
- 웹 어플리케이션은 때때로 동적 HTML 응답을 생성할 때 Jinja2와 같은 서버측 템플릿 도구를 사용함
- SSTI(서버측 템플릿 주입) 취약점은 행위자가 원격으로 코드를 실행할 수 있는 방식
- 사용자 입력이 템플릿 내에 안전하지 않게 삽입될 때 발생
XML 외부 엔티티 주입(XML External Entity Injection)
- 사용자 제어 XML 입력 구문을 분석하기 위해 XML 분석기를 이용하는 응용 프로그램에서 발생
- XXE 취약점으로 공격자는 임의의 파일을 읽고 서비스 거부(Dos) 공격을 일으킬 수 있음
방지 방법
- 사용자 입력에서 시스템 명령 실행 금지( Ex. system(), exec() )
- 명령으로 전달되는 입력에 강한 입력 유효성 검사 사용(특정 명령 화이트리스트 추가)
- 최소 권한 사용
- 애플리케이션을 자주 업데이트하고 패치하기
- 동적 애플리케이션 보안 테스트(DAST) 도구로 애플리케이션 검사 (Ex. Bright)
- 운영체제 종류에 따른 특수문자 이스케이프 처리 또는 요청 차단
- 윈도우: 특수문자 앞에 '^'를 추가해 이스케이프 요청 또는 차단
- 리눅스/유닉스: 특수문자 앞에 '\'를 추가하여 이스케이프 요청 또는 차단
OS Injection의 영향
OS Command Injection 공격은 웹 애플리케이션이 구동되는 계정의 권한에 따라 매우 다릅니다. 데이터베이스에 접근할 수도, 서버 또는 시스템을 제어하여 웹 애플리케이션의 모든 기능을 악용할 수도 있습니다.
출처
https://www.bugbountyclub.com/pentestgym/view/58
https://www.bugbountyclub.com/pentestgym/view/59
https://www.invicti.com/learn/os-command-injection/
https://brightsec.com/blog/os-command-injection/