您的位置:首页 > 其它

Web应用安全之OS命令安全隐患

2017-05-18 20:07 190 查看

概要

Web应用开发使用的编程语言大多提供了通过Shell调用OS命令的功能,如果调用方法不当,就可能导致意料之外的OS命令被执行。称为OS命令注入。

典型攻击流程

1.从外部下载专门用来攻击软件。
2.对下载的软件授予执行权限。
3.从内部攻击OS漏洞以取得管理员权限(Local Exploit)
4.攻击者在服务器上为所欲为

可进行的恶意行为

1.浏览、篡改或删除Web服务器内的文件。
2.对外发送邮件。
3.攻击其他服务器。

例子1

发送邮件时,接收页面脚本如下system("/usr/sbin/sendmail -i <template.txt> $mail");

当我们实施OS命令注入时,在表单的邮箱地址输入123@qq.com;cat /etc/passwd
页面上会显示 /etc/passwd/的内容

安全隐患产生原因

因为shell提供了一次启动多个命令的语法,因此外界就可以在参数中做手脚,使在原有命令的基础上执行其它的命令。
还有一种情况是虽然开发者没想要调用OS命令,但在无意中使用了内部会启动Shell的函数,典型例子为Perl的open函数。
综上所述:
1.通过Shell调用OS命令时,没有转义Shell的元字符。
2.使用了内部调用Shell的函数

$ echo aaa ; echo bbb #连续执行命令
aaa
bbb
$ echo aaa & echo bbb #在后台和前台执行
aaa
bbb
[1] + Done                    echo aaa
$ echo aaa && echo bbb #如果第一个命令执行成功就执行第二个命令
aaa
bbb
$ cat aaa || echo bbb      #如果第一个命令执行失败就执行第二个命令
cat : aaa : No such file or direction
bbb
$ wc ' ls '                            #将倒引号(')中的字符串作为命令执行
13 34 350 oscom001.php
40 99 839 sqlo001.php
53 133 1189 total
$ echo aaa | wc               #将第一个命令的输出作为第2个命令的输入
      1              1                               4
windos的cmd.exe 中能够使用&来连续执行多条命令,另外|(管道功能)、&&或||的用法也和Unix一样。

Shell中拥有特殊意义字符被称为元字符,把元字符当作普通字符使用时需要考虑转义。参考Shell相关手册。

而在指定OS命令参数的字符串中混入了Shell的元字符,就会使攻击着添加的OS命令被执行。

如Perl的open函数,是用于打开文件的函数,然而根据open的调用方法的不同,有些情况下会通过Shell执行OS命令。例如通过open函数启动Linux的pwd命令(显示当前目录名的命令)只要像下面的CGI脚本一样,调用open函数时在命令名后面加上管道符号|即可。

#! /usr/bin/perl
print "Content-Type: text/plain\n\n<body>";
open FL, ' /bin/pwd | ' or die $!;
print <FL>
close FL;
print "</body>";

当前目录名就会通过pwd命令显示出来。
但是如果外界能指定文件名,就通过在文件名的前后加上管道符号 | 来实施OS命令注入攻击。
例如
file = ls + /sbin|

原因总结

需要同时满足以下三项条件
1.使用了内部调用Shell的函数(system、open等)
2.将外界传入的参数传递给内部调用Shell的函数
3.参数中Shell的元字符没有被转义

对策

推荐度由高到低
1.选择不调用OS命令的实现方法。
2.避免使用内部调用Shell的函数。
3.不将外界输入的字符串传递给命令行参数。
4.使用安全的函数对传递给OS命令的参数进行转义、

在设计阶段决定对策方针

总体设计阶段
1.决定主要功能的代码实现方针。
2.尽量利用专门的程序库,迫不得已时再使用OS命令来实现。
详细设计阶段
1.设计各功能的详细的实现方式时,极力避免使用内部调用Shell的函数。
2.只要使用内部调用Shell的函数时,讨论决定是将参数固定,还是由标准输入来指定参数。

关于内部调用Shell的函数

PHP
system()       exec()       passthru()            proc_open()           popen()           shell_exec()         ',,,'

Perl
exec()            system()        '...'          qx/.../           open()

Ruby
exec()             system()         '...'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: