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

来源:互联网 发布:淘宝为什么没有比价了 编辑:程序博客网 时间:2024/06/01 21:44

概要

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()         '...'
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在电脑上玩英雄联盟没有声音怎么办 梦幻西游新区抢不到副本积分怎么办 倒车时遇上机动车碰瓷的怎么办 电瓶车相撞对方全责但不赔偿怎么办 轻微刮蹭逃逸对方想多要钱怎么办 正常开车撞伤了闯红灯的人怎么办 发现小事故要保持现场堵车怎么办 私处刮毛外面皮肤不小心弄伤怎么办 老婆骂孩子不准老公带饿小孩怎么办 结婚3年妻子不让丈夫碰怎么办 老婆出轨现在没证据他要离婚怎么办 结婚后老婆不让碰分房睡离婚怎么办 电动车调速把手变速挡坏了怎么办 路边车辆贴条了超过15天了怎么办 违停交警拍照了没贴条 照片怎么办 支付宝违章缴费罚单输错了怎么办 交警查酒驾跑了把警车撞了怎么办 禁止进入待行区的时候进入了怎么办 今天开车把72岁老太婆撞了怎么办 在这种路口遇到行人突然横穿怎么办 在左拐车道却直行了怎么办 路边简易房让拆除不想拆怎么办 英国护照的名和姓印颠倒了怎么办 加热圈功率小加不到设定温度怎么办 本田飞度05年车尾气不好怎么办 文件在lr中打开后找不到了怎么办 手机安装软件成功屏幕上没有怎么办 脸过敏发红痒怎么办用什么药膏 脸上又红又肿又痒怎么办 宝宝把皮革咬烂吃掉了怎么办 自动档皮革挡把防尘套烂了怎么办 pu包用酒精擦坏了怎么办 白色的面料被84弄黄了怎么办 要账的人赖在家不走怎么办 两塔吊的安全距离不够2米怎么办 腿上被蚊子咬后留下的黑疤怎么办 携程订的酒店酒店一直没确认怎么办 客斤的无窗挨着厨房怎么办 餐桌和墙紧挨着容易脏怎么办 vivo手机被设置成英文该怎么办 电脑开机后显示英文字该怎么办?