OS命令注入學習筆記
OS命令注入
調(diào)用OS命令引起的安全隱患:
Web開發(fā)所使用的編程語言中,大多數(shù)都能通過Shell執(zhí)行OS(操作系統(tǒng))命令。通過Shell執(zhí)行OS命令時,或者開發(fā)中用到的某個方法其內(nèi)部利用了Shell時,就有可能出現(xiàn)OS命令被任意執(zhí)行的情況。這種現(xiàn)象被稱為OS命令注入。
安全隱患產(chǎn)生的原因:
內(nèi)部調(diào)用OS命令的函數(shù)以及系統(tǒng)調(diào)用(System Call)中,多數(shù)都通過Shell來啟動命令。Shell是用來操作OS的命令行界面,如Windows中的cmd.exe、Unix系的OS中的sh、bash、csh等。通過Shell來啟動命令,能夠使用管道命令(Pipe)或重定向等功能的使用變的更加便捷。
system(“echo hell > a.txt”); PHP中調(diào)用system函數(shù)。
實際啟動的命令,通過sh調(diào)用命令。 sh -c echo hello > a.txt
然而,Shell提供的便利功能卻會稱為OS命令注入漏洞產(chǎn)生的根源。Shell提供了一次啟動多個命令的語法,因此外界就可以在參數(shù)中做手腳,使得在原來的命令的基礎上又有其他的命令被啟動。這就是OS命令注入。
在Shell中執(zhí)行多條命令:
shell提供了通過制定1行來啟動多個程序的方法。而OS命令注入攻擊就惡意利用了Shell能夠啟動多個程序的特性。比如,在Unix的Shell中,能夠使用以下寫法:
復制
Shell中的元字符:
Windows的cmd.exe中能夠使用&來連續(xù)執(zhí)行多條命令。另外|(管道功能)、&&或||的用法也和Unix、Linux一樣。
Shell中擁有特殊意義的字符(如;、|等)被稱為shell的元字符。把元字符當做普通字符使用時需要對其進行轉(zhuǎn)義。
而如果在指定OS命令參數(shù)的字符串中混入了SHell的元字符,就會使得攻擊者添加的OS命令被執(zhí)行,這也就是OS命令注入漏洞產(chǎn)生的原因。
安全隱患的產(chǎn)生的原因總結(jié):
Web應用的開發(fā)語言中,有些函數(shù)的內(nèi)部實現(xiàn)利用了Shell。如果開發(fā)者使用了這些內(nèi)部調(diào)用Shell的函數(shù),就可能會使得意料之外的OS命令被執(zhí)行。這種狀態(tài)被稱為OS命令注入漏洞。
OS命令注入漏洞的形成需要同時滿足一下三個條件:
使用了內(nèi)部調(diào)用Shell的函數(shù)(system、open等)
將倍加傳入的參數(shù)傳遞給內(nèi)部調(diào)用的shell的函數(shù)
參數(shù)中shell的元字符沒有被轉(zhuǎn)義
解決對策:
為了防范OS命令注入漏洞,有以下三種推薦方式。從高到低。
選擇不調(diào)用OS命令的實現(xiàn)方法。
不調(diào)用利用shell的功能,既能杜絕了OS命令注入漏洞混入的可能性,又消除了調(diào)用OS命令的而系統(tǒng)開銷,能夠從多方面提高應用的性能。
不將外界輸入的字符串傳遞給命令行參數(shù)。
使用安全的函數(shù)對傳遞給OS命令參數(shù)進行轉(zhuǎn)義。