OS命令注入學習筆記

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命令注入漏洞的形成需要同時滿足一下三個條件:

  1. 使用了內部調用Shell的函數(system、open等)
  2. 將倍加傳入的參數傳遞給內部調用的shell的函數
  3. 參數中shell的元字符沒有被轉義

解決對策:

爲了防範OS命令注入漏洞,有以下三種推薦方式。從高到低。

  1. 選擇不調用OS命令的實現方法。

    不調用利用shell的功能,既能杜絕了OS命令注入漏洞混入的可能性,又消除了調用OS命令的而系統開銷,能夠從多方面提高應用的性能。

  2. 不將外界輸入的字符串傳遞給命令行參數。

  3. 使用安全的函數對傳遞給OS命令參數進行轉義。


學習過程中筆記的記錄與資料整理。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章