OS命令注入
調用OS命令引起的安全隱患:
Web開發所使用的編程語言中,大多數都能通過Shell執行OS(操作系統)命令。通過Shell執行OS命令時,或者開發中用到的某個方法其內部利用了Shell時,就有可能出現OS命令被任意執行的情況。這種現象被稱爲OS命令注入。
安全隱患產生的原因:
內部調用OS命令的函數以及系統調用(System Call)中,多數都通過Shell來啓動命令。Shell是用來操作OS的命令行界面,如Windows中的cmd.exe、Unix系的OS中的sh、bash、csh等。通過Shell來啓動命令,能夠使用管道命令(Pipe)或重定向等功能的使用變的更加便捷。
system(“echo hell > a.txt”); PHP中調用system函數。
實際啓動的命令,通過sh調用命令。 sh -c echo hello > a.txt
然而,Shell提供的便利功能卻會稱爲OS命令注入漏洞產生的根源。Shell提供了一次啓動多個命令的語法,因此外界就可以在參數中做手腳,使得在原來的命令的基礎上又有其他的命令被啓動。這就是OS命令注入。
在Shell中執行多條命令:
shell提供了通過制定1行來啓動多個程序的方法。而OS命令注入攻擊就惡意利用了Shell能夠啓動多個程序的特性。比如,在Unix的Shell中,能夠使用以下寫法:
$ echo aaa ; echo bbb #利用分號;連續執行多條命令
aaa
bbb
$ echo aaa & echo bbb #在後臺和前臺執行多條命令
aaa
bbb
[1] + Done echo aaa
$echo aaa && echo bbb #利用&&,如果第1個命令執行成功就執行第2個命令。
aaa
bbb
$ cat aaa || echo bbb #利用||,如果第1個命令執行失敗就執行第2個命令。
cat: aaa:NO such file or directory
bbb
$wc `ls` #將倒引號中的字符作爲命令執行
$ echo aaa | wc #利用管道符,將第一個命令的輸出作爲第二個命令的輸入。
Shell中的元字符:
Windows的cmd.exe中能夠使用&來連續執行多條命令。另外|(管道功能)、&&或||的用法也和Unix、Linux一樣。
Shell中擁有特殊意義的字符(如;、|等)被稱爲shell的元字符。把元字符當做普通字符使用時需要對其進行轉義。
而如果在指定OS命令參數的字符串中混入了SHell的元字符,就會使得攻擊者添加的OS命令被執行,這也就是OS命令注入漏洞產生的原因。
安全隱患的產生的原因總結:
Web應用的開發語言中,有些函數的內部實現利用了Shell。如果開發者使用了這些內部調用Shell的函數,就可能會使得意料之外的OS命令被執行。這種狀態被稱爲OS命令注入漏洞。
OS命令注入漏洞的形成需要同時滿足一下三個條件:
- 使用了內部調用Shell的函數(system、open等)
- 將倍加傳入的參數傳遞給內部調用的shell的函數
- 參數中shell的元字符沒有被轉義
解決對策:
爲了防範OS命令注入漏洞,有以下三種推薦方式。從高到低。
-
選擇不調用OS命令的實現方法。
不調用利用shell的功能,既能杜絕了OS命令注入漏洞混入的可能性,又消除了調用OS命令的而系統開銷,能夠從多方面提高應用的性能。
-
不將外界輸入的字符串傳遞給命令行參數。
-
使用安全的函數對傳遞給OS命令參數進行轉義。
學習過程中筆記的記錄與資料整理。