php使用exec shell命令注入的方法讲解


Posted in PHP onNovember 12, 2013

使用系统命令是一项危险的操作,尤其在你试图使用远程数据来构造要执行的命令时更是如此。如果使用了被污染数据,命令注入漏洞就产生了。
exec()是用于执行shell命令的函数。它返回执行并返回命令输出的最后一行,但你可以指定一个数组作为第二个参数,这样输出的每一行都会作为一个元素存入数组。使用方式如下:

<?php
$last = exec('ls', $output, $return);
print_r($output);
echo "Return [$return]";
?>

假设ls命令在shell中手工运行时会产生如下输出:
$ ls
total 0
-rw-rw-r--  1 chris chris 0 May 21 12:34 php-security
-rw-rw-r--  1 chris chris 0 May 21 12:34 chris-shiflett

当通过上例的方法在exec()中运行时,输出结果如下:
Array
(
  [0] => total 0
  [1] => -rw-rw-r--  1 chris chris 0 May 21 12:34 php-security
  [2] => -rw-rw-r--  1 chris chris 0 May 21 12:34 chris-shiflett
)
Return [0]

这种运行shell命令的方法方便而有用,但这种方便为你带来了重大的风险。如果使用了被污染数据构造命令串的话,攻击者就能执行任意的命令。
我建议你有可能的话,要避免使用shell命令,如果实在要用的话,就要确保对构造命令串的数据进行过滤,同时必须要对输出进行转义:
<?php
$clean = array();
$shell = array();
/* Filter Input ($command, $argument) */
$shell['command'] = escapeshellcmd($clean['command']);
$shell['argument'] = escapeshellarg($clean['argument']);
$last = exec("{$shell['command']} {$shell['argument']}", $output, $return);
?>

尽管有多种方法可以执行shell命令,但必须要坚持一点,在构造被运行的字符串时只允许使用已过滤和转义数据。其他需要注意的同类函数有passthru( ), popen( ), shell_exec( ),以及system( )。我再次重申,如果有可能的话,建议避免所有shell命令的使用。
PHP 相关文章推荐
如何在PHP中使用Oracle数据库(4)
Oct 09 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
php中require和require_once的区别说明
Feb 27 PHP
thinkphp配置连接数据库技巧
Dec 02 PHP
php模拟post提交数据的方法
Feb 12 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
PHP常用函数之格式化时间操作示例
Oct 21 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 PHP
PHP使用PHPMailer发送邮件的简单使用方法
Nov 12 #PHP
PHP迭代器的内部执行过程详解
Nov 12 #PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 #PHP
PHP SPL使用方法和他的威力
Nov 12 #PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 #PHP
php获取远程图片体积大小的实例
Nov 12 #PHP
php过滤XSS攻击的函数
Nov 12 #PHP
You might like
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
JS 字符串连接[性能比较]
2009/05/10 Javascript
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
原生JS生成指定位数的验证码
2020/10/28 Javascript
Python splitlines使用技巧
2008/09/06 Python
python连接MySQL数据库实例分析
2015/05/12 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
机电一体化自荐信
2013/12/10 职场文书
军训自我鉴定
2013/12/14 职场文书
生物科学专业职业规划书范文
2014/02/11 职场文书
感恩母亲节活动方案
2014/03/04 职场文书
运动会加油口号
2014/06/07 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
档案接收函格式
2015/01/30 职场文书
Mac环境Nginx配置和访问本地静态资源的实现
2021/03/31 Servers
MySQL 全文检索的使用示例
2021/06/07 MySQL