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中,能够使用以下写法:
1 | echo aaa ; echo bbb #利用分号;连续执行多条命令 |
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命令参数进行转义。
学习过程中笔记的记录与资料整理。