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中,能够使用以下写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ 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命令参数进行转义。


学习过程中笔记的记录与资料整理。


坚持原创技术分享,您的支持将鼓励我继续创作!